|
|
1.1 root 1: #include "f2c.h"
2: #include "fio.h"
3: #include "fmt.h"
4: #include "lio.h"
5: #include "ctype.h"
6: #include "fp.h"
7:
8: extern char *f__fmtbuf;
9: #ifdef KR_headers
10: extern double atof();
11: extern char *malloc(), *realloc();
12: int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)();
13: #else
14: #undef abs
15: #undef min
16: #undef max
17: #include "stdlib.h"
18: int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void),
19: (*l_ungetc)(int,FILE*);
20: #endif
21: int l_eof;
22:
23: #define isblnk(x) (f__ltab[x+1]&B)
24: #define issep(x) (f__ltab[x+1]&SX)
25: #define isapos(x) (f__ltab[x+1]&AX)
26: #define isexp(x) (f__ltab[x+1]&EX)
27: #define issign(x) (f__ltab[x+1]&SG)
28: #define iswhit(x) (f__ltab[x+1]&WH)
29: #define SX 1
30: #define B 2
31: #define AX 4
32: #define EX 8
33: #define SG 16
34: #define WH 32
35: char f__ltab[128+1] = { /* offset one for EOF */
36: 0,
37: 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0,
38: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
39: SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
40: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
41: 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
42: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
43: AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
44: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
45: };
46:
47: #ifdef ungetc
48: static int
49: #ifdef KR_headers
50: un_getc(x,f__cf) int x; FILE *f__cf;
51: #else
52: un_getc(int x, FILE *f__cf)
53: #endif
54: { return ungetc(x,f__cf); }
55: #else
56: #define un_getc ungetc
57: #ifdef KR_headers
58: extern int ungetc();
59: #endif
60: #endif
61:
62: t_getc(Void)
63: { int ch;
64: if(f__curunit->uend) return(EOF);
65: if((ch=getc(f__cf))!=EOF) return(ch);
66: if(feof(f__cf))
67: l_eof = f__curunit->uend = 1;
68: return(EOF);
69: }
70: integer e_rsle(Void)
71: {
72: int ch;
73: if(f__curunit->uend) return(0);
74: while((ch=t_getc())!='\n' && ch!=EOF);
75: return(0);
76: }
77:
78: flag f__lquit;
79: int f__lcount,f__ltype,nml_read;
80: char *f__lchar;
81: double f__lx,f__ly;
82: #define ERR(x) if(n=(x)) return(n)
83: #define GETC(x) (x=(*l_getc)())
84: #define Ungetc(x,y) (*l_ungetc)(x,y)
85:
86: #ifdef KR_headers
87: l_R(poststar) int poststar;
88: #else
89: l_R(int poststar)
90: #endif
91: {
92: char s[FMAX+EXPMAXDIGS+4];
93: register int ch;
94: register char *sp, *spe, *sp1;
95: long e, exp;
96: int havenum, havestar, se;
97:
98: if (!poststar) {
99: if (f__lcount > 0)
100: return(0);
101: f__lcount = 1;
102: }
103: f__ltype = 0;
104: exp = 0;
105: havestar = 0;
106: retry:
107: sp1 = sp = s;
108: spe = sp + FMAX;
109: havenum = 0;
110:
111: switch(GETC(ch)) {
112: case '-': *sp++ = ch; sp1++; spe++;
113: case '+':
114: GETC(ch);
115: }
116: while(ch == '0') {
117: ++havenum;
118: GETC(ch);
119: }
120: while(isdigit(ch)) {
121: if (sp < spe) *sp++ = ch;
122: else ++exp;
123: GETC(ch);
124: }
125: if (ch == '*' && !poststar) {
126: if (sp == sp1 || exp || *s == '-') {
127: err(f__elist->cierr,112,"bad repetition count")
128: }
129: poststar = havestar = 1;
130: *sp = 0;
131: f__lcount = atoi(s);
132: goto retry;
133: }
134: if (ch == '.') {
135: GETC(ch);
136: if (sp == sp1)
137: while(ch == '0') {
138: ++havenum;
139: --exp;
140: GETC(ch);
141: }
142: while(isdigit(ch)) {
143: if (sp < spe)
144: { *sp++ = ch; --exp; }
145: GETC(ch);
146: }
147: }
148: se = 0;
149: if (issign(ch))
150: goto signonly;
151: if (isexp(ch)) {
152: GETC(ch);
153: if (issign(ch)) {
154: signonly:
155: if (ch == '-') se = 1;
156: GETC(ch);
157: }
158: if (!isdigit(ch)) {
159: bad:
160: err(f__elist->cierr,112,"exponent field")
161: }
162:
163: e = ch - '0';
164: while(isdigit(GETC(ch))) {
165: e = 10*e + ch - '0';
166: if (e > EXPMAX)
167: goto bad;
168: }
169: if (se)
170: exp -= e;
171: else
172: exp += e;
173: }
174: (void) Ungetc(ch, f__cf);
175: if (sp > sp1) {
176: ++havenum;
177: while(*--sp == '0')
178: ++exp;
179: if (exp)
180: sprintf(sp+1, "e%ld", exp);
181: else
182: sp[1] = 0;
183: f__lx = atof(s);
184: }
185: else
186: f__lx = 0.;
187: if (havenum)
188: f__ltype = TYLONG;
189: else
190: switch(ch) {
191: case ',':
192: case '/':
193: break;
194: default:
195: if (havestar && ( ch == ' '
196: ||ch == '\t'
197: ||ch == '\n'))
198: break;
199: if (nml_read > 1) {
200: f__lquit = 2;
201: return 0;
202: }
203: err(f__elist->cierr,112,"invalid number")
204: }
205: return 0;
206: }
207:
208: static int
209: #ifdef KR_headers
210: rd_count(ch) register int ch;
211: #else
212: rd_count(register int ch)
213: #endif
214: {
215: if (ch < '0' || ch > '9')
216: return 1;
217: f__lcount = ch - '0';
218: while(GETC(ch) >= '0' && ch <= '9')
219: f__lcount = 10*f__lcount + ch - '0';
220: Ungetc(ch,f__cf);
221: return f__lcount <= 0;
222: }
223:
224: l_C(Void)
225: { int ch, nml_save;
226: double lz;
227: if(f__lcount>0) return(0);
228: f__ltype=0;
229: GETC(ch);
230: if(ch!='(')
231: {
232: if (nml_read > 1 && (ch < '0' || ch > '9')) {
233: Ungetc(ch,f__cf);
234: f__lquit = 2;
235: return 0;
236: }
237: if (rd_count(ch))
238: if(!f__cf || !feof(f__cf))
239: err(f__elist->cierr,112,"complex format")
240: else
241: err(f__elist->cierr,(EOF),"lread");
242: if(GETC(ch)!='*')
243: {
244: if(!f__cf || !feof(f__cf))
245: err(f__elist->cierr,112,"no star")
246: else
247: err(f__elist->cierr,(EOF),"lread");
248: }
249: if(GETC(ch)!='(')
250: { Ungetc(ch,f__cf);
251: return(0);
252: }
253: }
254: else
255: f__lcount = 1;
256: while(iswhit(GETC(ch)));
257: Ungetc(ch,f__cf);
258: nml_save = nml_read;
259: nml_read = 0;
260: if (ch = l_R(1))
261: return ch;
262: if (!f__ltype)
263: err(f__elist->cierr,112,"no real part");
264: lz = f__lx;
265: while(iswhit(GETC(ch)));
266: if(ch!=',')
267: { (void) Ungetc(ch,f__cf);
268: err(f__elist->cierr,112,"no comma");
269: }
270: while(iswhit(GETC(ch)));
271: (void) Ungetc(ch,f__cf);
272: if (ch = l_R(1))
273: return ch;
274: if (!f__ltype)
275: err(f__elist->cierr,112,"no imaginary part");
276: while(iswhit(GETC(ch)));
277: if(ch!=')') err(f__elist->cierr,112,"no )");
278: f__ly = f__lx;
279: f__lx = lz;
280: nml_read = nml_save;
281: return(0);
282: }
283: l_L(Void)
284: {
285: int ch;
286: if(f__lcount>0) return(0);
287: f__ltype=0;
288: GETC(ch);
289: if(isdigit(ch))
290: {
291: rd_count(ch);
292: if(GETC(ch)!='*')
293: if(!f__cf || !feof(f__cf))
294: err(f__elist->cierr,112,"no star")
295: else
296: err(f__elist->cierr,(EOF),"lread");
297: GETC(ch);
298: }
299: if(ch == '.') GETC(ch);
300: switch(ch)
301: {
302: case 't':
303: case 'T':
304: f__lx=1;
305: break;
306: case 'f':
307: case 'F':
308: f__lx=0;
309: break;
310: default:
311: if(isblnk(ch) || issep(ch) || ch==EOF)
312: { (void) Ungetc(ch,f__cf);
313: return(0);
314: }
315: else err(f__elist->cierr,112,"logical");
316: }
317: f__ltype=TYLONG;
318: f__lcount = 1;
319: while(!issep(GETC(ch)) && ch!=EOF);
320: (void) Ungetc(ch, f__cf);
321: return(0);
322: }
323: #define BUFSIZE 128
324: l_CHAR(Void)
325: { int ch,size,i;
326: char quote,*p;
327: if(f__lcount>0) return(0);
328: f__ltype=0;
329: if(f__lchar!=NULL) free(f__lchar);
330: size=BUFSIZE;
331: p=f__lchar=malloc((unsigned int)size);
332: if(f__lchar==NULL) err(f__elist->cierr,113,"no space");
333:
334: GETC(ch);
335: if(isdigit(ch)) {
336: /* allow Fortran 8x-style unquoted string... */
337: /* either find a repetition count or the string */
338: f__lcount = ch - '0';
339: *p++ = ch;
340: for(i = 1;;) {
341: switch(GETC(ch)) {
342: case '*':
343: if (f__lcount == 0) {
344: f__lcount = 1;
345: goto noquote;
346: }
347: p = f__lchar;
348: goto have_lcount;
349: case ',':
350: case ' ':
351: case '\t':
352: case '\n':
353: case '/':
354: Ungetc(ch,f__cf);
355: /* no break */
356: case EOF:
357: f__lcount = 1;
358: f__ltype = TYCHAR;
359: return *p = 0;
360: }
361: if (!isdigit(ch)) {
362: f__lcount = 1;
363: goto noquote;
364: }
365: *p++ = ch;
366: f__lcount = 10*f__lcount + ch - '0';
367: if (++i == size) {
368: f__lchar = realloc(f__lchar,
369: (unsigned int)(size += BUFSIZE));
370: p = f__lchar + i;
371: }
372: }
373: }
374: else (void) Ungetc(ch,f__cf);
375: have_lcount:
376: if(GETC(ch)=='\'' || ch=='"') quote=ch;
377: else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
378: { (void) Ungetc(ch,f__cf);
379: return(0);
380: }
381: else {
382: /* Fortran 8x-style unquoted string */
383: *p++ = ch;
384: for(i = 1;;) {
385: switch(GETC(ch)) {
386: case ',':
387: case ' ':
388: case '\t':
389: case '\n':
390: case '/':
391: Ungetc(ch,f__cf);
392: /* no break */
393: case EOF:
394: f__ltype = TYCHAR;
395: return *p = 0;
396: }
397: noquote:
398: *p++ = ch;
399: if (++i == size) {
400: f__lchar = realloc(f__lchar,
401: (unsigned int)(size += BUFSIZE));
402: p = f__lchar + i;
403: }
404: }
405: }
406: f__ltype=TYCHAR;
407: for(i=0;;)
408: { while(GETC(ch)!=quote && ch!='\n'
409: && ch!=EOF && ++i<size) *p++ = ch;
410: if(i==size)
411: {
412: newone:
413: f__lchar= realloc(f__lchar, (unsigned int)(size += BUFSIZE));
414: p=f__lchar+i-1;
415: *p++ = ch;
416: }
417: else if(ch==EOF) return(EOF);
418: else if(ch=='\n')
419: { if(*(p-1) != '\\') continue;
420: i--;
421: p--;
422: if(++i<size) *p++ = ch;
423: else goto newone;
424: }
425: else if(GETC(ch)==quote)
426: { if(++i<size) *p++ = ch;
427: else goto newone;
428: }
429: else
430: { (void) Ungetc(ch,f__cf);
431: *p = 0;
432: return(0);
433: }
434: }
435: }
436: #ifdef KR_headers
437: c_le(a) cilist *a;
438: #else
439: c_le(cilist *a)
440: #endif
441: {
442: f__fmtbuf="list io";
443: if(a->ciunit>=MXUNIT || a->ciunit<0)
444: err(a->cierr,101,"stler");
445: f__scale=f__recpos=0;
446: f__elist=a;
447: f__curunit = &f__units[a->ciunit];
448: if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
449: err(a->cierr,102,"lio");
450: f__cf=f__curunit->ufd;
451: if(!f__curunit->ufmt) err(a->cierr,103,"lio")
452: return(0);
453: }
454: #ifdef KR_headers
455: l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
456: #else
457: l_read(ftnint *number, char *ptr, ftnlen len, ftnint type)
458: #endif
459: {
460: #define Ptr ((flex *)ptr)
461: int i,n,ch;
462: doublereal *yy;
463: real *xx;
464: for(i=0;i<*number;i++)
465: {
466: if(f__lquit) return(0);
467: if(l_eof)
468: err(f__elist->ciend, EOF, "list in")
469: if(f__lcount == 0) {
470: f__ltype = 0;
471: for(;;) {
472: GETC(ch);
473: switch(ch) {
474: case EOF:
475: goto loopend;
476: case ' ':
477: case '\t':
478: case '\n':
479: continue;
480: case '/':
481: f__lquit = 1;
482: goto loopend;
483: case ',':
484: f__lcount = 1;
485: goto loopend;
486: default:
487: (void) Ungetc(ch, f__cf);
488: goto rddata;
489: }
490: }
491: }
492: rddata:
493: switch((int)type)
494: {
495: case TYINT1:
496: case TYSHORT:
497: case TYLONG:
498: #ifdef TYQUAD
499: case TYQUAD:
500: #endif
501: case TYREAL:
502: case TYDREAL:
503: ERR(l_R(0));
504: break;
505: case TYCOMPLEX:
506: case TYDCOMPLEX:
507: ERR(l_C());
508: break;
509: case TYLOGICAL1:
510: case TYLOGICAL2:
511: case TYLOGICAL:
512: ERR(l_L());
513: break;
514: case TYCHAR:
515: ERR(l_CHAR());
516: break;
517: }
518: while (GETC(ch) == ' ' || ch == '\t');
519: if (ch != ',' || f__lcount > 1)
520: Ungetc(ch,f__cf);
521: loopend:
522: if(f__lquit) return(0);
523: if(f__cf) {
524: if (feof(f__cf))
525: err(f__elist->ciend,(EOF),"list in")
526: else if(ferror(f__cf)) {
527: clearerr(f__cf);
528: err(f__elist->cierr,errno,"list in")
529: }
530: }
531: if(f__ltype==0) goto bump;
532: switch((int)type)
533: {
534: case TYINT1:
535: case TYLOGICAL1:
536: Ptr->flchar = f__lx;
537: break;
538: case TYLOGICAL2:
539: case TYSHORT:
540: Ptr->flshort=f__lx;
541: break;
542: case TYLOGICAL:
543: case TYLONG:
544: Ptr->flint=f__lx;
545: break;
546: #ifdef TYQUAD
547: case TYQUAD:
548: Ptr->fllongint = f__lx;
549: break;
550: #endif
551: case TYREAL:
552: Ptr->flreal=f__lx;
553: break;
554: case TYDREAL:
555: Ptr->fldouble=f__lx;
556: break;
557: case TYCOMPLEX:
558: xx=(real *)ptr;
559: *xx++ = f__lx;
560: *xx = f__ly;
561: break;
562: case TYDCOMPLEX:
563: yy=(doublereal *)ptr;
564: *yy++ = f__lx;
565: *yy = f__ly;
566: break;
567: case TYCHAR:
568: b_char(f__lchar,ptr,len);
569: break;
570: }
571: bump:
572: if(f__lcount>0) f__lcount--;
573: ptr += len;
574: if (nml_read)
575: nml_read++;
576: }
577: return(0);
578: #undef Ptr
579: }
580: #ifdef KR_headers
581: integer s_rsle(a) cilist *a;
582: #else
583: integer s_rsle(cilist *a)
584: #endif
585: {
586: int n;
587:
588: if(!f__init) f_init();
589: if(n=c_le(a)) return(n);
590: f__reading=1;
591: f__external=1;
592: f__formatted=1;
593: f__lioproc = l_read;
594: f__lquit = 0;
595: f__lcount = 0;
596: l_eof = 0;
597: if(f__curunit->uwrt && f__nowreading(f__curunit))
598: err(a->cierr,errno,"read start");
599: l_getc = t_getc;
600: l_ungetc = un_getc;
601: return(0);
602: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.