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