00001 /* % This was apart of library.c but has been split off so it can be used */ 00002 /* % with other c programs in the suite. */ 00003 /* */ 00004 /* \section{Portability} */ 00005 /* */ 00006 /* We aim for compatibility with K\&R\index{K&R@K\&R C} and */ 00007 /* \index{ANSI C@\ac{ansi} C} \ac{ansi}~C\@ as well as \idx{VAX */ 00008 /* C}\index{C!VAX}. One particularly annoying */ 00009 /* consequence is that we can't rely on [[#elif]] preprocessor */ 00010 /* directives. I don't know whether anything needs to be changed for the */ 00011 /* new \idx{DEC C}, which is apparently \ac{ansi}\dots{} */ 00012 /* */ 00013 /* */ 00014 /* \section{Code} */ 00015 /* */ 00016 /* These are the components of the code. The \LA{}guarded code\RA{} is */ 00017 /* executed when we've identified the platform. */ 00018 /* */ 00019 /* */ 00020 /* There are several platform dependencies in the code which we need to */ 00021 /* get right: */ 00022 /* \begin{description} */ 00023 /* \item[Fortran/C conventions] The calling conventions for C from */ 00024 /* \ft{} vary from compiler to compiler; */ 00025 /* \item[Header files etc.] We can't assume everything has \ac{ansi} C */ 00026 /* or \ac{posix} libraries; */ 00027 /* \item[Real number format] for the transparent binary i/o; */ 00028 /* \item[Special things] The [[putenv]]/[[setenv]] call isn't defined in */ 00029 /* the current standards. */ 00030 /* \end{description} */ 00031 /* */ 00032 /* Each type of system we know about should cause [[KNOWN_MACHINE]] to be */ 00033 /* defined and also define \verb+CALL_LIKE_+\meta{something} to be */ 00034 /* defined. Thus if you know system \meta{foo} has a \ft{} */ 00035 /* calling convention like the native Sun compiler uses, define */ 00036 /* [[CALL_LIKE_SUN]] and you won't need to examine the definitions of the */ 00037 /* interface functions below. Further tests on the system type may be */ 00038 /* necessary e.g., to get the include files right. */ 00039 /* */ 00040 /* \subsection{Assumptions}\index{assumption} */ 00041 /* */ 00042 /* Note that it's assumed below that a \ft{} [[INTEGER]] */ 00043 /* corresponds to a C [[int]] and a \ft{} [[REAL]] corresponds to */ 00044 /* a C [[float]]. */ 00045 /* */ 00046 /* Also, the identity of certain \idx{calling conventions} is only */ 00047 /* guaranteed if the routines have only a single \ft{} */ 00048 /* \index{CHARACTER variables@{\tt CHARACTER} variables} */ 00049 /* [[CHARACTER]]-type argument since sometimes the length of each such */ 00050 /* argument is given after it in the parameter list and sometimes they */ 00051 /* are all collected at the end of the list. */ 00052 /* */ 00053 /* \subsection{Platform identification} */ 00054 /* */ 00055 /* Apart from the possibility of using the \idx{Netlib} {\tt */ 00056 /* f2c}\index{f2c@{\tt f2c}} compiler we currently assume that each */ 00057 /* system uses the vendor-supplied \ft{} compiler\index{FORTRAN */ 00058 /* compiler@\ft{} compiler}.\index{platforms} */ 00059 /* */ 00060 /* */ 00061 /* This is for \idx{IBM} Unix systems---\idx{RS/6000} models, at least. */ 00062 /* The compiler can append \verb+_+ to external names, but we assume the */ 00063 /* default where this doesn't happen. See {\tt configure} for the */ 00064 /* enforcement of this. */ 00065 /* */ 00066 /* <identifying the platform>= */ 00067 #if defined (_AIX) || defined(___AIX) 00068 # define KNOWN_MACHINE 00069 # define CALL_LIKE_HPUX 1 00070 #endif 00071 /* This is for \idx{Alliant} \idx{FX28xx}, at least, e.g.\ the FX2800 at LMB\@. */ 00072 /* */ 00073 /* <identifying the platform>= */ 00074 #if defined (alliant) 00075 # define KNOWN_MACHINE 00076 # define CALL_LIKE_SUN 1 00077 #endif 00078 /* The \idx{Ardent} \idx{Stardent}/\idx{Titan} support probably doesn't */ 00079 /* work at present. */ 00080 /* */ 00081 /* <identifying the platform>= */ 00082 #if defined (ardent) || defined (titan) 00083 # ifndef stardent 00084 # define stardent 00085 # endif 00086 #endif 00087 #if defined (stardent) 00088 # define KNOWN_MACHINE 00089 # define CALL_LIKE_STARDENT 1 00090 #endif 00091 /* There seem to be two possible ways of identifying a \idx{Convex} */ 00092 /* (`C' series, at least) system. [[__convexc__]] is documented in OS10 */ 00093 /* but [[__convex__]] seems to be there as well (and was probably */ 00094 /* documented in OS8). */ 00095 /* */ 00096 /* <identifying the platform>= */ 00097 #if defined (__convex__) || defined (__convexc__) 00098 # define KNOWN_MACHINE 00099 # define CALL_LIKE_SUN 1 00100 #endif 00101 /* The \idx{Evans and Sutherland} \idx{ESV1} workstation can operate in the */ 00102 /* \idx{BSD} or \idx{SYSV} universes. It doesn't seem to be properly */ 00103 /* \index{POSIX@\ac{posix}}\ac{posix}- or \ac{ansi} */ 00104 /* C-compliant.\index{ANSI C@\ac{ansi} C} */ 00105 /* */ 00106 /* <identifying the platform>= */ 00107 #if defined (ESV) 00108 # define KNOWN_MACHINE 00109 # define CALL_LIKE_SUN 1 00110 #endif 00111 /* This cover \idx{Hewlett Packard} 9000/750 (RISC) models, at least. Others */ 00112 /* may vary. */ 00113 /* */ 00114 /* <identifying the platform>= */ 00115 #if defined (__hpux) 00116 # define KNOWN_MACHINE 00117 # define CALL_LIKE_HPUX 1 00118 #endif 00119 /* \idx{Silicon Graphics} \idx{IRIX} systems \idx{Iris}es, \idx{Indigo}s, */ 00120 /* \idx{Crimson}s etc. (at least version 4 up) are */ 00121 /* \ac{ansi}\index{ANSI C@\ac{ansi} C} and */ 00122 /* \ac{posix}\index{POSIX@\ac{posix}} compliant. */ 00123 /* */ 00124 /* <identifying the platform>= */ 00125 #ifdef __sgi /* in ANSI mode */ 00126 # ifndef sgi 00127 # define sgi 00128 # endif 00129 #endif 00130 #if defined (sgi) 00131 # define KNOWN_MACHINE 00132 # define CALL_LIKE_SUN 1 00133 #endif 00134 /* \idx{Solbourne}s are \idx{Sun} clones. */ 00135 /* */ 00136 /* <identifying the platform>= */ 00137 #if defined (solbourne) 00138 # ifndef sun 00139 # define sun /* don't know whether it's defined or not */ 00140 # endif 00141 #endif 00142 /* THis is OK for \idx{Solaris}1 and~2. */ 00143 /* */ 00144 /* <identifying the platform>= */ 00145 #if defined (sun) || defined (__sun) 00146 # define KNOWN_MACHINE 00147 # define CALL_LIKE_SUN 1 00148 # if !defined(__STDC__) || defined(__GNUC__) 00149 # if !defined(G77) 00150 extern char *sys_errlist []; 00151 # define strerror(i) sys_errlist[i] /* k&r compiler doesn't have it */ 00152 # endif 00153 # endif 00154 #endif 00155 /* \idx{DEC} \idx{OSF/1} (\idx{Alpha}) and \idx{Ultrix} use the same */ 00156 /* calling conventions, at least. The documentation I saw for OSF/1 said */ 00157 /* that [[__OSF1__]] is defined, but it's reported that you need */ 00158 /* [[__osf__]] (in come cases?). */ 00159 /* */ 00160 /* <identifying the platform>= */ 00161 #if defined (ultrix) || defined(__OSF1__) || defined(__osf__) 00162 # define KNOWN_MACHINE 00163 # define CALL_LIKE_SUN 1 00164 #endif 00165 /* \idx{VMS} is a law unto itself, of course. Help for VAX C doesn't */ 00166 /* actually say [[VMS]] is defined (as opposed to [[vms]]), although it */ 00167 /* seems to be. The other possibilities are for DEC C in strict */ 00168 /* ANSI mode. NB: we now don't use the C code under VMS due to the */ 00169 /* apparent bugs in the DEC C RTL\@. */ 00170 /* */ 00171 /* <identifying the platform>= */ 00172 #ifndef VMS 00173 # if defined (vms) || defined (__vms) || defined (__VMS) 00174 # define VMS 00175 # endif 00176 #endif 00177 #if defined (VMS) 00178 # define KNOWN_MACHINE 00179 #endif 00180 00181 /* First attemt at porting to nt wsing the visual fortran and MVC++ */ 00182 /* MVS stands for Microsoft Visual Studio - better than VMS */ 00183 #if defined(_MVS) 00184 # define CALL_LIKE_MVS 1 00185 # define KNOWN_MACHINE 00186 #endif 00187 /* Generic linux, may not have the G77 compilers */ 00188 #if defined (linux) 00189 # undef CALL_LIKE_SUN 00190 # define KNOWN_MACHINE 00191 # define CALL_LIKE_SUN 1 00192 #endif 00193 00194 /* {\tt f2c}\index{f2c@{\tt f2c}} misses the MIL--STD */ 00195 /* \idx{bit-twiddling intrinsics}. Its calling */ 00196 /* convention is like \idx{Sun} only for a {\em single\/} [[CHARACTER]] */ 00197 /* variable in the parameter list! {\tt g77}\index{g77@{\tt g77}} has */ 00198 /* (will have!)\ the same calling convention and library as {\tt f2c} but */ 00199 /* does support the MIL--STD intrinsics (amongst other things). The */ 00200 /* alpha-test version doesn't have a {\tt BYTE} (or {\tt INTEGER*1}) */ 00201 /* type, so can't be used at present. */ 00202 /* */ 00203 /* <identifying the platform>= */ 00204 #if defined(F2C) || defined(G77) 00205 # undef CALL_LIKE_SUN 00206 # define CALL_LIKE_SUN 1 00207 # define KNOWN_MACHINE 00208 #endif 00209 /* If we haven't identified the system type, we want to stop with an */ 00210 /* error message. Indenting [[#error]] works with \ac{ansi} C */ 00211 /* \index{ANSI C@\ac{ansi} C} */ 00212 /* and doesn't fall over with K\&R\index{K&R@K\&R C} as */ 00213 /* it would if un-indented, even when the test is false. */ 00214 /* */ 00215 /* <guarded code>= */ 00216 #if ! defined (KNOWN_MACHINE) 00217 #error System type is not known -- see the Installation Guide 00218 #else 00219 /* At this stage we've identified the platform and are in business. Here */ 00220 /* are the components we have to put together. */ 00221 /* */ 00222 /* <general code>= */ 00223 /* \section{Header files} */ 00224 /* */ 00225 /* If the system has \ac{posix} stuff, we want to ensure it's used. */ 00226 /* */ 00227 /* <header files>= */ 00228 #ifndef _POSIX_SOURCE 00229 #define _POSIX_SOURCE 00230 #endif 00231 /* <header files>= */ 00232 #include <stdio.h> 00233 00234 #if defined (VMS) 00235 # include <descrip.h> /* non-POSIX */ 00236 # define NOUNISTD 00237 #else 00238 # include <sys/types.h> 00239 # include <sys/stat.h> 00240 # ifndef _MVS 00241 # include <sys/times.h> 00242 # endif 00243 # ifdef _MVS 00244 # define NOUNISTD 00245 # endif 00246 #endif 00247 00248 #ifdef stardent /* who knows if this works anyhow... */ 00249 # include <sys/types.h> 00250 # include <malloc.h> /* non-POSIX */ 00251 #else 00252 # include <stddef.h> 00253 #endif 00254 /* BSD might need {\tt strings.h} and [[index]] instead of [[strchr]]. */ 00255 /* This is an \ac{ansi} header, not \ac{posix.1}. */ 00256 /* */ 00257 /* <header files>= */ 00258 #include <string.h> 00259 /* Some systems like \idx{ESV} don't have {\tt unistd.h}, and the */ 00260 /* configuration makes the appropriate [[#define]] of [[NOUNISTD]]. */ 00261 /* */ 00262 /* <header files>= */ 00263 #ifndef NOUNISTD 00264 # include <unistd.h> 00265 #else 00266 # ifndef VMS 00267 # ifndef _MVS 00268 # include <sys/file.h> /* ESV, old Concentrix */ /* non-POSIX */ 00269 # endif 00270 # endif 00271 #endif 00272 #ifndef NOSTDLIB /* for TitanOS 4.2, at least? */ 00273 # include <stdlib.h> 00274 #endif 00275 00276 #include <errno.h> 00277 #include <ctype.h> 00278 00279 #if defined(_AIX) || defined (__hpux) || defined(F2C) ||\ 00280 defined(G77) || defined(_WIN32)/* would do no harm on others, though */ 00281 # include <time.h> 00282 #endif 00283 /* We need INT_MAX and DBL_MAX defined for routine Hgetlimits */ 00284 /* These should be in {\tt limits.h} and {\tt float.h} respectively */ 00285 /* (this is POSIX standard?). */ 00286 /* */ 00287 /* <header files>= */ 00288 00289 #include <limits.h> 00290 #include <float.h> 00291 00292 /* For f2c we need this for typedefs. We assume it's on an include */ 00293 /* path where (g)cc will find it. The [[#define]] is to avoid the */ 00294 /* undefinition of macros like [[sgi]]. */ 00295 /* */ 00296 /* this has been altered for g2c.h as f2c.h is not always distributed */ 00297 /* <header files>= */ 00298 #if defined (F2C) 00299 # define Skip_f2c_Undefs 00300 # include "f2c.h" 00301 #endif 00302 #if defined (G77) 00303 # define Skip_f2c_Undefs /* g2c.h infelicity... */ 00304 # if defined (HAVE_G2C_H) 00305 # include "g2c.h" 00306 # else 00307 # include "f2c.h" 00308 # endif 00309 #endif 00310 /* \section{[[#define]]s} */ 00311 /* \subsection{Defaults and customisable items} */ 00312 /* */ 00313 /* \fixme{We should be able to get help from \ac{posix} on the filename */ 00314 /* length and open files limits} */ 00315 /* */ 00316 /* <[[#define]]s>= */ 00317 #define MAXFLEN 500 /* the maximum length of a filename in CCP4 */ 00318 #define MAXFILES 10 /* maximum number of files open symultaneously */ 00319 #define DEFMODE 2 /* default mode access for random access files */ 00320 /* These constants record the current i/o status of a stream (needed to */ 00321 /* know if an [[fseek]] is needed or not before the next i/o operation). */ 00322 /* */ 00323 /* <[[#define]]s>= */ 00324 #define IRRELEVANT_OP 0 00325 #define READ_OP 1 00326 #define WRITE_OP 2 00327 /* \subsection{Machine dependent stuff} */ 00328 /* These should be defined in {\tt stdlib.h}, but this isn't present, for */ 00329 /* instance in \idx{Alliant} \idx{Concentrix} before release~3 or with the */ 00330 /* bundled \idx{SunOS} {\tt cc}. */ 00331 /* */ 00332 /* <[[#define]]s>= */ 00333 #ifndef SEEK_SET 00334 # define SEEK_SET 0 00335 # define SEEK_CUR 1 00336 # define SEEK_END 2 00337 #endif /* ! SEEK_SET */ 00338 /* <[[#define]]s>= */ 00339 #if defined (ardent) || defined (titan) || defined (stardent) 00340 struct Str_Desc { 00341 char *Str_pointer; 00342 int Str_length; 00343 int id; 00344 }; 00345 #endif 00346 /* \subsection{File mode definitions} */ 00347 /* */ 00348 /* Here are the deinfitions of the {\tt diskio} modes, specifying the */ 00349 /* type of data transfer: bytes, half-words, integers, reals, */ 00350 /* half(integer)-word complex and complex, respectively: */ 00351 /* */ 00352 /* <[[#define]]s>= */ 00353 #define BYTE 0 00354 #define INT16 1 00355 #define INT32 6 00356 #define FLOAT32 2 00357 #define COMP32 3 00358 #define COMP64 4 00359 /* \section{Converting foreign binary number formats} */ 00360 /* */ 00361 /* The library is intended to allow the binary file formats (\idx{MTZ} */ 00362 /* and map\index{map files}) to be read satisfactorily if they were */ 00363 /* written on another platform. Such files are always written in the */ 00364 /* {\em native\/} real or integer number format with a `\idx{machine */ 00365 /* stamp}' in the file to identify the formats involved. Then, if */ 00366 /* necessary, conversion is done from the foreign format to native when */ 00367 /* the file is read. There is thus only a significant overhead for files */ 00368 /* imported */ 00369 /* from platforms with different number formats; locally-written files */ 00370 /* are read back optimally and there is no write overhead. This is in */ 00371 /* contrast, for instance, to the \idx{XDR} approach (and \idx{HDF}?), */ 00372 /* where a canonical external format is used. */ 00373 /* */ 00374 /* When converting from foreign to native formats we're potentially faced */ 00375 /* with a combinatorial explosion---currently combinations of \ac{ieee} */ 00376 /* little-endian, \ac{ieee} big-endian, \idx{VAX} and \idx{Convex} native */ 00377 /* formats. (This applies only to real number formats---fortunately */ 00378 /* everything we're interested in has \idx{twos complement} integers.) Thus we */ 00379 /* first make sure that the format is converted to canonical form (which */ 00380 /* we choose as big-endian \ac{ieee}, following XDR) and then, if */ 00381 /* necessary, to the native format in a separate stage. This is going to */ 00382 /* be somewhat slower than it might be, but what the heck\dots{} */ 00383 /* */ 00384 /* The basic idea of this is due to David Wild (EMBL, Hamburg, 1991). */ 00385 /* His original, partially-functional implementation used code from the */ 00386 /* \idx{HDF} 3.1 distribution. This re-write is by Dave Love, very */ 00387 /* loosely based on HDF3.3, but doing the conversion in-place. It works */ 00388 /* for the full set of relevant systems and no longer has MTZ- and */ 00389 /* map-specific code in [[copen]]. (HDF stuff can be found on {\tt */ 00390 /* ftp.ncsa.uiuc.edu}.) */ 00391 /* */ 00392 /* \subsection{`Machine stamps'} */ 00393 /* */ 00394 /* Here's how we specify the number formats for machines. The */ 00395 /* `\idx{machine stamp}' is a 32-bit quantity containing a set of four */ 00396 /* `nibbles' (half-bytes)---only half the space is used. Each nibble is */ 00397 /* a number specifying the representation of (in C terms) [[double]] */ 00398 /* ($d$), [[float]] ($f$), [[int]] ($i$)) and [[unsigned char]] ($c$) */ 00399 /* types. Thus each stamp is of the form $\mbox{{\tt 0x}}dfic0000$. The */ 00400 /* values for the nibbles may be taken from the list (following HDF): */ 00401 /* \begin{quote} */ 00402 /* \begin{tabular}{ll} */ 00403 /* 1 & Big-endian \ac{ieee}\\ */ 00404 /* 2 & VAX \\ */ 00405 /* 3 & Cray \\ */ 00406 /* 4 & Little-endian \ac{ieee}\\ */ 00407 /* 5 & Convex native \\ */ 00408 /* 6 & Fijitsu VP */ 00409 /* \end{tabular} */ 00410 /* \end{quote} */ 00411 /* \idx{Cray} isn't relevant to us because it's not a 32-bit machine */ 00412 /* and we don't currently have a use for the \idx{Fujitsu} one, which isn't */ 00413 /* implemented here. We ignore the possibility of */ 00414 /* non-\ac{ascii}\index{ASCII@\ac{ascii}} characters which might need */ 00415 /* converting e.g., from \ac{ebcdic}\index{EBCDIC@\ac{ebcdic}} and $c$ is */ 00416 /* always $1$; also $f$ and $d$ are the same (as per \idx{Fortran}). See the */ 00417 /* \idx{HDF} code for character code possibilities. */ 00418 /* */ 00419 /* Here are the tags for different formats (`\idx{class info codes}'), */ 00420 /* not all relevant: */ 00421 /* */ 00422 /* <[[#define]]s>= */ 00423 /* class info codes for int */ 00424 #define DFNTI_MBO 1 /* Motorola byte order 2's compl */ 00425 #define DFNTI_IBO 4 /* Intel byte order 2's compl */ 00426 00427 /* class info codes for float */ 00428 #define DFNTF_BEIEEE 1 /* big endian IEEE (canonical) */ 00429 #define DFNTF_VAX 2 /* Vax format */ 00430 #define DFNTF_CONVEXNATIVE 5 /* Convex native floats */ 00431 #define DFNTF_LEIEEE 4 /* little-endian IEEE format */ 00432 /* Here are the definitions */ 00433 /* we're interested in. Note\index{assumption} that some of the symbols */ 00434 /* tested here to determine the machine type might need to be qualified */ 00435 /* in the future where they don't necessarily determine the architecture. */ 00436 /* We just need to set [[nativeFT]] and [[nativeIT]], which determine the */ 00437 /* native real and integer formats. */ 00438 /* First an obvious one: */ 00439 /* */ 00440 /* <[[#define]]s>= */ 00441 #if defined (VAX) || defined (vax) /* gcc seems to use vax */ 00442 # define NATIVEFT DFNTF_VAX 00443 # define NATIVEIT DFNTI_IBO 00444 #endif 00445 /* Here are the possibilities for little-endian \ac{ieee}. (The */ 00446 /* \idx{MIPS} compilers define [[MIPSEL]] or [[MIPSEB]] depending on the */ 00447 /* mode in which the the chip operates.) The architectures covered here */ 00448 /* include some R\meta{nnnn} (e.g., \idx{DECstations}), \idx{i860} and */ 00449 /* other \idx{Intel} chips like \idx{PCs} and \idx{Alpha} (sometimes!). */ 00450 /* */ 00451 /* <[[#define]]s>= */ 00452 #if defined(MIPSEL) || defined(alliant) || defined(i386) || defined(i860) 00453 # define NATIVEIT DFNTI_IBO 00454 # define NATIVEFT DFNTF_LEIEEE 00455 #endif 00456 /* Here is a first attempt at machines using the powerPC chip. */ 00457 /* Specifically, this has been tried on PowerMacs running LinuxPPC, which */ 00458 /* appears to be big-endian. But in principle the powerPC chip can support */ 00459 /* both big-endian and little-endian OS's under software control. The */ 00460 /* symbol "powerpc" appears in gcc-2.8.1/config/rs6000/linux.h and appears */ 00461 /* to distinguish LinuxPPC from other OS's for this chip. */ 00462 #if defined (powerpc) 00463 # define NATIVEIT DFNTI_MBO 00464 # define NATIVEFT DFNTF_BEIEEE 00465 #endif 00466 /* \idx{Alpha} \idx{VMS} is a pain: compiler switches can force */ 00467 /* \idx{VAX} or \ac{ieee} number formats. Thus if we know it's an Alpha, */ 00468 /* we have to check for VMS and then what sort of VMS numbers. [OSF and */ 00469 /* OpenVMS define [[__alpha]], OpenVMS, only [[__ALPHA]].\index{Alpha} */ 00470 /* */ 00471 /* <[[#define]]s>= */ 00472 #ifdef __alpha 00473 # ifdef VMS 00474 # if __IEEE_FLOAT == 1 00475 # define NATIVEFT DFNTF_LEIEEE 00476 # else 00477 # define NATIVEFT DFNTF_VAX 00478 # endif 00479 # else /* assume OSF/1 */ 00480 # define NATIVEFT DFNTF_LEIEEE 00481 # endif 00482 # define NATIVEIT DFNTI_IBO 00483 #endif 00484 /* Big-endian \ac{ieee} includes other R\meta{nnnn} like SGI machines, */ 00485 /* \idx{HP} beasts (\idx{68k}-based or \idx{RISC}), \idx{RS/6000} and all */ 00486 /* \idx{Sun}s except the obsolete i386-based ones. */ 00487 /* \idx{Apollo}s are also apparently in this category. */ 00488 /* */ 00489 /* <[[#define]]s>= */ 00490 /* the VAX VMS compiler objected to splitting the following line */ 00491 #if defined(MIPSEB) || defined(__hpux) || defined(_AIX) || defined(m68k) || defined(mc68000) || defined(sparc) || defined (__sparc__) 00492 # define NATIVEIT DFNTI_MBO 00493 # define NATIVEFT DFNTF_BEIEEE 00494 #endif 00495 /* \idx{Convex}s can operate in either native or \ac{ieee} mode: */ 00496 /* */ 00497 /* <[[#define]]s>= */ 00498 #if defined(__convex__) || defined(__convexc__) 00499 # define NATIVEIT DFNTI_MBO 00500 # ifdef _IEEE_FLOAT_ 00501 # define NATIVEFT DFNTF_BEIEEE 00502 # else 00503 # ifdef _CONVEX_FLOAT_ 00504 # define NATIVEFT DFNTF_CONVEXNATIVE 00505 # else 00506 #error "Can't determine Convex floating point type. Use native compiler" 00507 # endif 00508 # endif 00509 #endif 00510 #ifndef NATIVEFT 00511 #error "Can't determine machine number format" 00512 #endif 00513 /* Here are the codes for data types which we can read from files and */ 00514 /* translate. */ 00515 /* */ 00516 /* <[[#define]]s>= */ 00517 #define DFNT_UINT 0 /* unsigned int */ 00518 #define DFNT_SINT 1 /* short int */ 00519 #define DFNT_INT 2 /* int */ 00520 #define DFNT_UCHAR 3 /* unsigned char */ 00521 #define DFNT_CHAR 4 /* char */ 00522 #define DFNT_FLOAT 5 /* float */ 00523 #define DFNT_DOUBLE 6 /* double */ 00524 /* These typedefs define 16-bit unsigned, 32-bit unsigned, 32-bit float */ 00525 /* and 8-bit unsigned char types respectively. You'd need to define */ 00526 /* [[SIXTEENBIT]] for a compiler with 16-bit ints; using [[long]] here is */ 00527 /* wrong, for instance, on \idx{OSF/1} \idx{Alpha} systems. */ 00528 /* */ 00529 /* <typedefs>= */ 00530 typedef unsigned short uint16; 00531 #ifdef SIXTEENBIT 00532 typedef unsigned long uint32; 00533 #else 00534 typedef unsigned int uint32; 00535 #endif 00536 typedef float float32; 00537 typedef unsigned char uint8; 00538 /* typedef signed char sint8; */ /* not K&R ? */ 00539 #endif