|
|
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.