|
|
1.1 root 1: #include "fio.h"
2: #include "fmt.h"
3: #include "lio.h"
4: #include "ctype.h"
5: extern char *fmtbuf;
6: extern char *malloc(), *realloc();
7: int (*lioproc)();
8:
9: #define isblnk(x) (ltab[x+1]&B)
10: #define issep(x) (ltab[x+1]&SX)
11: #define isapos(x) (ltab[x+1]&AX)
12: #define isexp(x) (ltab[x+1]&EX)
13: #define issign(x) (ltab[x+1]&SG)
14: #define SX 1
15: #define B 2
16: #define AX 4
17: #define EX 8
18: #define SG 16
19: char ltab[128+1] = { /* offset one for EOF */
20: 0,
21: 0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0,
22: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
23: SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
24: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25: 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
26: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
27: AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
28: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
29: };
30:
31: char l_comma, l_first;
32: t_getc()
33: { int ch;
34: if(curunit->uend) return(EOF);
35: if((ch=getc(cf))!=EOF) return(ch);
36: if(feof(cf)) curunit->uend = 1;
37: return(EOF);
38: }
39: e_rsle()
40: {
41: int ch;
42: if(curunit->uend) return(0);
43: while((ch=t_getc())!='\n' && ch!=EOF);
44: return(0);
45: }
46:
47: flag lquit;
48: int lcount,ltype;
49: char *lchar;
50: double lx,ly;
51: #define ERR(x) if(n=(x)) return(n)
52: #define GETC(x) (x=t_getc())
53:
54: l_read(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
55: { int i,n,ch;
56: double *yy;
57: float *xx;
58: for(i=0;i<*number;i++)
59: {
60: if(lquit) return(0);
61: if(curunit->uend) err(elist->ciend, EOF, "list in")
62: if(lcount == 0) {
63: ltype = NULL;
64: if(!l_first) l_comma = 0;
65: else l_first = 0;
66: for(;;) {
67: GETC(ch);
68: switch(ch) {
69: case EOF:
70: goto loopend;
71: case ' ':
72: case '\n':
73: continue;
74: case '/':
75: lquit = 1;
76: goto loopend;
77: case ',':
78: if(l_comma) {
79: lcount = 1;
80: (void) ungetc(ch, cf);
81: goto loopend;
82: }
83: l_comma = 1;
84: continue;
85: default:
86: (void) ungetc(ch, cf);
87: goto rddata;
88: }
89: }
90: }
91: rddata:
92: switch((int)type)
93: {
94: case TYSHORT:
95: case TYLONG:
96: case TYREAL:
97: case TYDREAL:
98: ERR(l_R());
99: break;
100: case TYCOMPLEX:
101: case TYDCOMPLEX:
102: ERR(l_C());
103: break;
104: case TYLOGICAL:
105: ERR(l_L());
106: break;
107: case TYCHAR:
108: ERR(l_CHAR());
109: break;
110: }
111: loopend:
112: if(lquit) return(0);
113: if(feof(cf)) err(elist->ciend,(EOF),"list in")
114: else if(ferror(cf))
115: { clearerr(cf);
116: err(elist->cierr,errno,"list in")
117: }
118: if(ltype==NULL) goto bump;
119: switch((int)type)
120: {
121: case TYSHORT:
122: ptr->flshort=lx;
123: break;
124: case TYLOGICAL:
125: case TYLONG:
126: ptr->flint=lx;
127: break;
128: case TYREAL:
129: ptr->flreal=lx;
130: break;
131: case TYDREAL:
132: ptr->fldouble=lx;
133: break;
134: case TYCOMPLEX:
135: xx=(float *)ptr;
136: *xx++ = lx;
137: *xx = ly;
138: break;
139: case TYDCOMPLEX:
140: yy=(double *)ptr;
141: *yy++ = lx;
142: *yy = ly;
143: break;
144: case TYCHAR:
145: b_char(lchar,(char *)ptr,len);
146: break;
147: }
148: bump:
149: if(lcount>0) lcount--;
150: ptr = (flex *)((char *)ptr + len);
151: }
152: return(0);
153: }
154: l_R()
155: { double a,b,c,d;
156: int i,ch,sign=0,da,db,dc;
157: int poststar = 0;
158: a=b=c=d=0;
159: da=db=dc=0;
160: if(lcount>0) return(0);
161: ltype=NULL;
162: da=rd_int(&a);
163: if(da== -1) sign=da;
164: if(GETC(ch)!='*')
165: { (void) ungetc(ch,cf);
166: db=1;
167: b=a;
168: a=1;
169: }
170: else
171: db=rd_int(&b);
172: if(db > 0) poststar = 1;
173: if(GETC(ch)!='.')
174: { dc=c=0;
175: (void) ungetc(ch,cf);
176: }
177: else dc=rd_int(&c);
178: if(dc > 0) poststar = 1;
179: if(isexp(GETC(ch))) db=rd_int(&d);
180: else if(issign(ch))
181: { (void) ungetc(ch, cf);
182: db = rd_int(&d);
183: }
184: else
185: { (void) ungetc(ch,cf);
186: db = 0;
187: d=0;
188: }
189: if(db > 0) poststar = 1;
190: lcount=a;
191: if(poststar == 0)
192: return(0);
193: if(db && b<0)
194: { sign=1;
195: b = -b;
196: }
197: for(i=0;i<dc;i++) c/=10;
198: b=b+c;
199: for(i=0;i<d;i++) b *= 10;
200: for(i=0;i< -d;i++) b /= 10;
201: if(sign) b = -b;
202: ltype=TYLONG;
203: lx=b;
204: return(0);
205: }
206: rd_int(x) double *x;
207: { int ch,sign=0,i;
208: double y;
209: i=0;
210: y=0;
211: if(GETC(ch)=='-') sign = -1;
212: else if(ch=='+') sign=0;
213: else (void) ungetc(ch,cf);
214: while(isdigit(GETC(ch)))
215: { i++;
216: y=10*y+ch-'0';
217: }
218: (void) ungetc(ch,cf);
219: if(sign) y = -y;
220: *x = y;
221: return(y!=0?i:sign);
222: }
223: l_C()
224: { int ch;
225: if(lcount>0) return(0);
226: ltype=NULL;
227: GETC(ch);
228: if(ch!='(')
229: { if(fscanf(cf,"%d",&lcount)!=1)
230: if(!feof(cf)) err(elist->cierr,112,"complex format")
231: else err(elist->cierr,(EOF),"lread");
232: if(GETC(ch)!='*')
233: { (void) ungetc(ch,cf);
234: if(!feof(cf)) err(elist->cierr,112,"no star")
235: else err(elist->cierr,(EOF),"lread");
236: }
237: if(GETC(ch)!='(')
238: { (void) ungetc(ch,cf);
239: return(0);
240: }
241: }
242: lcount = 1;
243: ltype=TYLONG;
244: (void) fscanf(cf,"%lf",&lx);
245: while(isblnk(GETC(ch)) || (ch == '\n'));
246: if(ch!=',')
247: { (void) ungetc(ch,cf);
248: err(elist->cierr,112,"no comma");
249: }
250: while(isblnk(GETC(ch)));
251: (void) ungetc(ch,cf);
252: (void) fscanf(cf,"%lf",&ly);
253: while(isblnk(GETC(ch)));
254: if(ch!=')') err(elist->cierr,112,"no )");
255: while(isblnk(GETC(ch)));
256: if(ch != '\n') (void) ungetc(ch,cf);
257: return(0);
258: }
259: l_L()
260: {
261: int ch;
262: if(lcount>0) return(0);
263: ltype=NULL;
264: GETC(ch);
265: if(isdigit(ch))
266: { (void) ungetc(ch,cf);
267: (void) fscanf(cf,"%d",&lcount);
268: if(GETC(ch)!='*')
269: if(!feof(cf)) err(elist->cierr,112,"no star")
270: else err(elist->cierr,(EOF),"lread");
271: }
272: else (void) ungetc(ch,cf);
273: if(GETC(ch)=='.') GETC(ch);
274: switch(ch)
275: {
276: case 't':
277: case 'T':
278: lx=1;
279: break;
280: case 'f':
281: case 'F':
282: lx=0;
283: break;
284: default:
285: if(isblnk(ch) || issep(ch) || ch==EOF)
286: { (void) ungetc(ch,cf);
287: return(0);
288: }
289: else err(elist->cierr,112,"logical");
290: }
291: ltype=TYLONG;
292: lcount = 1;
293: while(!issep(GETC(ch)) && ch!=EOF);
294: (void) ungetc(ch, cf);
295: return(0);
296: }
297: #define BUFSIZE 128
298: l_CHAR()
299: { int ch,size,i;
300: char quote,*p;
301: if(lcount>0) return(0);
302: ltype=NULL;
303:
304: GETC(ch);
305: if(isdigit(ch))
306: { (void) ungetc(ch,cf);
307: (void) fscanf(cf,"%d",&lcount);
308: if(GETC(ch)!='*') err(elist->cierr,112,"no star");
309: }
310: else (void) ungetc(ch,cf);
311: if(GETC(ch)=='\'' || ch=='"') quote=ch;
312: else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
313: { (void) ungetc(ch,cf);
314: return(0);
315: }
316: else err(elist->cierr,112,"no quote");
317: ltype=TYCHAR;
318: if(lchar!=NULL) free(lchar);
319: size=BUFSIZE;
320: p=lchar=malloc((unsigned int)size);
321: if(lchar==NULL) err(elist->cierr,113,"no space");
322: for(i=0;;)
323: { while(GETC(ch)!=quote && ch!='\n'
324: && ch!=EOF && ++i<size) *p++ = ch;
325: if(i==size)
326: {
327: newone:
328: lchar= realloc(lchar, (unsigned int)(size += BUFSIZE));
329: p=lchar+i-1;
330: *p++ = ch;
331: }
332: else if(ch==EOF) return(EOF);
333: else if(ch=='\n')
334: { if(*(p-1) != '\\') continue;
335: i--;
336: p--;
337: if(++i<size) *p++ = ch;
338: else goto newone;
339: }
340: else if(GETC(ch)==quote)
341: { if(++i<size) *p++ = ch;
342: else goto newone;
343: }
344: else
345: { (void) ungetc(ch,cf);
346: *p++ = 0;
347: return(0);
348: }
349: }
350: }
351: s_rsle(a) cilist *a;
352: {
353: int n;
354: if(!init) f_init();
355: if(n=c_le(a)) return(n);
356: reading=1;
357: external=1;
358: formatted=1;
359: l_first=1;
360: l_comma = 1;
361: lioproc = l_read;
362: lquit = 0;
363: lcount = 0;
364: if(curunit->uwrt)
365: return(nowreading(curunit));
366: else return(0);
367: }
368: c_le(a) cilist *a;
369: {
370: fmtbuf="list io";
371: if(a->ciunit>=MXUNIT || a->ciunit<0)
372: err(a->cierr,101,"stler");
373: scale=recpos=0;
374: elist=a;
375: curunit = &units[a->ciunit];
376: if(curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
377: err(a->cierr,102,"lio");
378: cf=curunit->ufd;
379: if(!curunit->ufmt) err(a->cierr,103,"lio")
380: return(0);
381: }
382: do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len;
383: {
384: return((*lioproc)(number,ptr,len,*type));
385: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.