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