|
|
1.1 ! root 1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved. */ ! 2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. */ ! 3: /* The copyright notice does not imply actual or intended publication. */ ! 4: /* AUTHORS: */ ! 5: /* H. S. Baird - ATT-BL MH - first versions */ ! 6: ! 7: /* fioi.h - buffered I/O of machine-, OS-, and compiler-independent binary values. ! 8: ! 9: Machine-, OS-, and compiler-independence of 'fioi' functions require that: ! 10: 1) chars are exactly 8 bits and their contents are invariant under I/O; ! 11: 2) the order of chars, as written by putc() and read by getc(), is ! 12: also invariant, across all machines, OS, and compilers. ! 13: Both of these requirements are customarily met by UNIX OS & tools. ! 14: ! 15: All values are written/read as a stream of char's, ultimately ! 16: using putc() & getc() macroes. ! 17: To maximize speed, macroes are used wherever possible: ! 18: - the first argument F of each macro is a stream (FILE *). ! 19: - write macroes have the form fwri_TYPE(F,value); `value' is assigned to ! 20: a variable of type TYPE before it is written (so compiler-dependent type ! 21: coercions may apply). ! 22: - read macroes have the form frdi_TYPE(F), returning a value of type TYPE. ! 23: Arguments to these macroes are evaluated exactly once. ! 24: */ ! 25: ! 26: /** MACHINE-DEPENDENT CUSTOMIZATION OF TYPES **/ ! 27: /* For each machine, all these types must be supported in the sense that ! 28: some roughly-equivalent machine-supported type exists. If an exact ! 29: equivalent doesn't exist, pick the shortest that is at least as long ! 30: (in no. bytes), if possible. If there is no machine representation ! 31: at least as long as specified, the only penalty will be the inevitable one: ! 32: when a value is read, it may be truncated to the maximum value that can be ! 33: represented. ! 34: */ ! 35: #define int1 char /* 8-bit signed 2's complement integer */ ! 36: #define int2 short /* 16-bit signed 2's complement integer */ ! 37: #define int3 int /* 24-bit signed 2's complement integer */ ! 38: #define int4 int /* 32-bit signed 2's complement integer */ ! 39: #define int8 long /* 64-bit signed 2's complement integer */ ! 40: #define uint1 unsigned char /* 8-bit unsigned integer */ ! 41: #define uint2 unsigned short /* 16-bit unsigned integer */ ! 42: #define uint3 unsigned int /* 24-bit unsigned integer */ ! 43: #define uint4 unsigned int /* 32-bit unsigned integer */ ! 44: #define uint8 unsigned long /* 64-bit unsigned integer */ ! 45: ! 46: /* IEEE 64-bit floating point format */ ! 47: typedef struct Ieeed { ! 48: int8 l; ! 49: int8 h; ! 50: } Ieeed; ! 51: ! 52: /* Cope with unsigned chars on 3B2 & compensate for bug on MIPS */ ! 53: #if CPU!=ATT3B && CPU!=MIPS ! 54: #define toint1(c) (int1)(c) ! 55: #else ! 56: #if MAIN ! 57: int toint1(c) ! 58: register int c; ! 59: { if ( ((1<<7)&c) !=0 ) return(c-256); ! 60: else return c; ! 61: } ! 62: #else ! 63: extern int toint1(); ! 64: #endif ! 65: #endif ! 66: ! 67: /** THE REST OF THIS FILE IS MACHINE-, OS-, and COMPILER-INDEPENDENT **/ ! 68: ! 69: typedef struct Fioi { ! 70: int1 i1; ! 71: int2 i2; ! 72: int3 i3; ! 73: int4 i4; ! 74: int8 i8; ! 75: uint1 ui1; ! 76: uint2 ui2; ! 77: uint3 ui3; ! 78: uint4 ui4; ! 79: uint8 ui8; ! 80: char str[100]; ! 81: } Fioi; ! 82: #define Init_Fioi {0,0,0,0,0,0,0,0,0,0,""} ! 83: #if MAIN ! 84: Fioi _Fioi = Init_Fioi; ! 85: #else ! 86: extern Fioi _Fioi; ! 87: #endif ! 88: ! 89: /* Characters */ ! 90: #define fwri_ch(F,V) putc((V),(F)) ! 91: #define frdi_ch(F) getc((F)) ! 92: ! 93: #if T /* TRANSITIONAL: used to read: "#if FWRI" */ ! 94: /* Strings are '\0'-terminated both in main memory & in peripheral files. */ ! 95: #define fwri_str(F,S) { fputs((S),(F)); putc('\0',(F)); } ! 96: #else ! 97: /* Strings are '\0'-terminated in the variable and '\n'-terminated in the file. ! 98: BAD, OBSOLESCENT POLICY: both should use '\0'-termination */ ! 99: #define fwri_str(F,S) { fputs((S),(F)); putc('\n',(F)); } ! 100: #endif ! 101: ! 102: #define MAX_FIO_STRLEN (128) ! 103: ! 104: #if T /* TRANSITIONAL: used to read: "#if FRDI" */ ! 105: ! 106: /* Strings are '\0'-terminated both in main memory & in peripheral files. */ ! 107: /*** TRANSITIONAL PATCH: accept '\n' as a terminator also; this will be disabled ! 108: as soon as all classifier tables have been recreated with FWRI==T. ***/ ! 109: /* Read string of maximum length MAX_FIO_STRLEN; return pointer to malloc space */ ! 110: #if MAIN ! 111: char *frdi_str(f) ! 112: FILE *f; ! 113: { static char s[MAX_FIO_STRLEN+1]; ! 114: register int ch; ! 115: register char *c,*ce; ! 116: char *res; ! 117: ce=(c=s)+MAX_FIO_STRLEN; ! 118: while((c<ce)&&((ch=getc(f))!=EOF)&&(ch!='\0')&&(ch!='\n')) *(c++) = ch; ! 119: *c='\0'; ! 120: if(c==ce) /* label is truncated; find end of it */ { ! 121: while(((ch=getc(f))!=EOF)&&(ch!='\0')&&(ch!='\n')) ; ! 122: }; ! 123: if((res=(char *)strdup(s))==NULL) ! 124: abort("frdi_str: can't dup char *s[%d]",strlen(s)); ! 125: return(res); ! 126: } ! 127: #else ! 128: char *frdi_str(); ! 129: #endif ! 130: /* 's' is an already-allocated buffer of known length >=N (including '\0') */ ! 131: #if MAIN ! 132: int frdi_strn(f,s,n) ! 133: FILE *f; ! 134: char s[]; ! 135: int n; ! 136: { register int ch; ! 137: register char *c,*ce; ! 138: ce=(c=s)+n-1; ! 139: while((c<ce)&&((ch=getc(f))!=EOF)&&(ch!='\0')&&(ch!='\n')) *(c++) = ch; ! 140: *c='\0'; ! 141: if(c==ce) /* label is truncated; find end of it */ { ! 142: while(((ch=getc(f))!=EOF)&&(ch!='\0')&&(ch!='\n')) ; ! 143: }; ! 144: if(ch==EOF) return(0); else if(ferror(f)) return(-errno); else return(1); ! 145: } ! 146: #else ! 147: int frdi_strn(); ! 148: #endif ! 149: ! 150: #else ! 151: ! 152: /* Strings are '\0'-terminated in the variable and '\n'-terminated in the file. ! 153: BAD, OBSOLESCENT POLICY: both should use '\0'-termination */ ! 154: /* Read string of maximum length MAX_FIO_STRLEN; return pointer to malloc space */ ! 155: #if MAIN ! 156: char *frdi_str(f) ! 157: FILE *f; ! 158: { static char s[MAX_FIO_STRLEN+1]; ! 159: register int ch; ! 160: register char *c,*ce; ! 161: char *res; ! 162: ce=(c=s)+MAX_FIO_STRLEN; ! 163: while((c<ce)&&((ch=getc(f))!=EOF)&&(ch!='\n')) *(c++) = ch; ! 164: *c='\0'; ! 165: if(c==ce) /* label is truncated; find end of it */ { ! 166: while(((ch=getc(f))!=EOF)&&(ch!='\n')) ; ! 167: }; ! 168: if((res=(char *)strdup(s))==NULL) ! 169: abort("frdi_str: can't dup char *s[%d]",strlen(s)); ! 170: return(res); ! 171: } ! 172: #else ! 173: char *frdi_str(); ! 174: #endif ! 175: /* S is an already-allocated buffer of known length >=N (including '\0') */ ! 176: #define frdi_strn(F,S,N) ( feof(F)? 0 : ( \ ! 177: fgets((S),(N),(F)), \ ! 178: ( (((S)[strlen((S))-1])=='\n')? (S)[strlen((S))-1]='\0': 1 ), \ ! 179: (ferror(F)? -errno: 1) ) ) ! 180: ! 181: #endif ! 182: ! 183: /* Integers (unsigned and signed) are written low-order byte first. */ ! 184: #define fwri_uint1(F,V) fwri_ch((F),(uint1)(V)) ! 185: #define frdi_uint1(F) ((uint1)frdi_ch((F))) ! 186: ! 187: #define fwri_uint2(F,V) { fwri_uint1((F),_Fioi.ui2=(V)); \ ! 188: fwri_uint1((F),_Fioi.ui2>>8); } ! 189: #define frdi_uint2(F) ((uint2)( _Fioi.ui2=frdi_uint1((F)), \ ! 190: (frdi_uint1((F))<<8)|_Fioi.ui2 )) ! 191: ! 192: #define fwri_uint3(F,V) { fwri_uint2((F),_Fioi.ui3=(V)); \ ! 193: fwri_uint1((F),_Fioi.ui3>>16); } ! 194: #define frdi_uint3(F) ((uint3)( _Fioi.ui3=frdi_uint2((F)), \ ! 195: (frdi_uint1((F))<<16)|_Fioi.ui3 )) ! 196: ! 197: #define fwri_uint4(F,V) { fwri_uint2((F),_Fioi.ui4=(V)); \ ! 198: fwri_uint2((F),_Fioi.ui4>>16); } ! 199: #define frdi_uint4(F) ((uint4)( _Fioi.ui4=frdi_uint2((F)), \ ! 200: (frdi_uint2((F))<<16)|_Fioi.ui4 )) ! 201: ! 202: #define fwri_uint8(F,V) { fwri_uint4((F),_Fioi.ui8=(V)); \ ! 203: fwri_uint4((F),_Fioi.ui8>>32); } ! 204: #define frdi_uint8(F) ((uint8)( _Fioi.ui8=frdi_uint4((F)), \ ! 205: (frdi_uint4((F))<<32)|_Fioi.ui8 )) ! 206: ! 207: /* Signed integers are assumed to be 2's complement. ! 208: Note the suppression of inappropriate sign-extensions using judicious ! 209: unsigned reads. */ ! 210: ! 211: #define fwri_int1(F,V) fwri_ch((F),_Fioi.i1=(V)) ! 212: #define frdi_int1(F) (toint1(frdi_ch((F)))) ! 213: ! 214: #define fwri_int2(F,V) { fwri_int1((F),_Fioi.i2=(V)); \ ! 215: fwri_int1((F),_Fioi.i2>>8); } ! 216: #define frdi_int2(F) ((int2)( _Fioi.i2=frdi_uint1((F)), \ ! 217: (frdi_int1((F))<<8)|_Fioi.i2 )) ! 218: ! 219: #define fwri_int3(F,V) { fwri_int2((F),_Fioi.i3=(V)); \ ! 220: fwri_int1((F),_Fioi.i3>>16); } ! 221: #define frdi_int3(F) ((int3)( _Fioi.i3=frdi_uint2((F)), \ ! 222: (frdi_int1((F))<<16)|_Fioi.i3 )) ! 223: ! 224: #define fwri_int4(F,V) { fwri_int2((F),_Fioi.i4=(V)); \ ! 225: fwri_int2((F),_Fioi.i4>>16); } ! 226: #define frdi_int4(F) ((int4)( _Fioi.i4=frdi_uint2((F)), \ ! 227: (frdi_int2((F))<<16)|_Fioi.i4 )) ! 228: ! 229: #define fwri_int8(F,V) { fwri_int4((F),_Fioi.i8=(V)); \ ! 230: fwri_int4((F),_Fioi.i8>>32); } ! 231: #define frdi_int8(F) ((int8)( _Fioi.i8=frdi_uint4((F)), \ ! 232: (frdi_int4((F))<<32)|_Fioi.i8 )) ! 233: ! 234: ! 235: /* Floating point */ ! 236: #if MAIN ! 237: /* See Marsha Grabow & George Gilmer & KT */ ! 238: void ! 239: dtoieeed(ieee,native) ! 240: Ieeed *ieee; ! 241: double native; ! 242: { ! 243: double fr, ho, f; ! 244: int iexp; ! 245: ! 246: if(native < 0) { ! 247: dtoieeed(ieee, -native); ! 248: ieee->h |= 0x80000000L; ! 249: return; ! 250: } ! 251: if(native == 0) { ! 252: ieee->l = 0; ! 253: ieee->h = 0; ! 254: return; ! 255: } ! 256: fr = frexp(native, &iexp); ! 257: f = 2097152L; /* shouldnt use fp constants here */ ! 258: fr = modf(fr*f, &ho); ! 259: ieee->h = ho; ! 260: ieee->h &= 0xfffffL; ! 261: ieee->h |= (iexp+1022L) << 20; ! 262: f = 65536L; ! 263: fr = modf(fr*f, &ho); ! 264: ieee->l = ho; ! 265: ieee->l <<= 16; ! 266: ieee->l |= (long)(fr*f); ! 267: } ! 268: #else ! 269: void dtoieeed(); ! 270: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.