9 extern char *malloc(), *realloc();
10 int (*lioproc)(), (*l_getc)(), (*l_ungetc)();
13 #define isblnk(x) (ltab[x+1]&B)
14 #define issep(x) (ltab[x+1]&SX)
15 #define isapos(x) (ltab[x+1]&AX)
16 #define isexp(x) (ltab[x+1]&EX)
17 #define issign(x) (ltab[x+1]&SG)
18 #define iswhit(x) (ltab[x+1]&WH)
25 char ltab[128+1] = { /* offset one for EOF */
27 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0,
28 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
29 SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
30 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
31 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
32 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
33 AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
34 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
39 if(curunit->uend) return(EOF);
40 if((ch=getc(cf))!=EOF) return(ch);
42 l_eof = curunit->uend = 1;
48 if(curunit->uend) return(0);
49 while((ch=t_getc())!='\n' && ch!=EOF);
57 #define ERR(x) if(n=(x)) return(n)
58 #define GETC(x) (x=(*l_getc)())
59 #define Ungetc(x,y) (*l_ungetc)(x,y)
61 l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
63 #define Ptr ((flex *)ptr)
67 for(i=0;i<*number;i++)
71 err(elist->ciend, EOF, "list in")
90 (void) Ungetc(ch, cf);
115 while (GETC(ch) == ' ' || ch == '\t');
122 err(elist->ciend,(EOF),"list in")
123 else if(ferror(cf)) {
125 err(elist->cierr,errno,"list in")
128 if(ltype==0) goto bump;
150 yy=(doublereal *)ptr;
155 b_char(lchar,ptr,len);
159 if(lcount>0) lcount--;
168 char s[FMAX+EXPMAXDIGS+4];
170 register char *sp, *spe, *sp1;
188 case '-': *sp++ = ch; sp1++; spe++;
197 if (sp < spe) *sp++ = ch;
201 if (ch == '*' && !poststar) {
202 if (sp == sp1 || exp || *s == '-') {
203 err(elist->cierr,112,"bad repetition count")
220 { *sp++ = ch; --exp; }
231 if (ch == '-') se = 1;
236 err(elist->cierr,112,"exponent field")
240 while(isdigit(GETC(ch))) {
250 (void) Ungetc(ch, cf);
256 sprintf(sp+1, "e%ld", exp);
271 err(elist->cierr,112,"invalid number")
280 if (ch < '0' || ch > '9')
283 while(GETC(ch) >= '0' && ch <= '9')
284 lcount = 10*lcount + ch - '0';
292 if(lcount>0) return(0);
299 err(elist->cierr,112,"complex format")
301 err(elist->cierr,(EOF),"lread");
305 err(elist->cierr,112,"no star")
307 err(elist->cierr,(EOF),"lread");
310 { (void) Ungetc(ch,cf);
316 while(iswhit(GETC(ch)));
317 (void) Ungetc(ch,cf);
321 err(elist->cierr,112,"no real part");
323 while(iswhit(GETC(ch)));
325 { (void) Ungetc(ch,cf);
326 err(elist->cierr,112,"no comma");
328 while(iswhit(GETC(ch)));
329 (void) Ungetc(ch,cf);
333 err(elist->cierr,112,"no imaginary part");
334 while(iswhit(GETC(ch)));
335 if(ch!=')') err(elist->cierr,112,"no )");
343 if(lcount>0) return(0);
351 err(elist->cierr,112,"no star")
353 err(elist->cierr,(EOF),"lread");
356 if(ch == '.') GETC(ch);
368 if(isblnk(ch) || issep(ch) || ch==EOF)
369 { (void) Ungetc(ch,cf);
372 else err(elist->cierr,112,"logical");
376 while(!issep(GETC(ch)) && ch!=EOF);
377 (void) Ungetc(ch, cf);
384 if(lcount>0) return(0);
386 if(lchar!=NULL) free(lchar);
388 p=lchar=malloc((unsigned int)size);
389 if(lchar==NULL) err(elist->cierr,113,"no space");
393 /* allow Fortran 8x-style unquoted string... */
394 /* either find a repetition count or the string */
423 lcount = 10*lcount + ch - '0';
425 lchar = realloc(lchar,
426 (unsigned int)(size += BUFSIZE));
431 else (void) Ungetc(ch,cf);
433 if(GETC(ch)=='\'' || ch=='"') quote=ch;
434 else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
435 { (void) Ungetc(ch,cf);
439 /* Fortran 8x-style unquoted string */
457 lchar = realloc(lchar,
458 (unsigned int)(size += BUFSIZE));
465 { while(GETC(ch)!=quote && ch!='\n'
466 && ch!=EOF && ++i<size) *p++ = ch;
470 lchar= realloc(lchar, (unsigned int)(size += BUFSIZE));
474 else if(ch==EOF) return(EOF);
476 { if(*(p-1) != '\\') continue;
479 if(++i<size) *p++ = ch;
482 else if(GETC(ch)==quote)
483 { if(++i<size) *p++ = ch;
487 { (void) Ungetc(ch,cf);
493 integer s_rsle(a) cilist *a;
499 if(n=c_le(a)) return(n);
507 if(curunit->uwrt && nowreading(curunit))
508 err(a->cierr,errno,"read start");
516 if(a->ciunit>=MXUNIT || a->ciunit<0)
517 err(a->cierr,101,"stler");
520 curunit = &units[a->ciunit];
521 if(curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
522 err(a->cierr,102,"lio");
524 if(!curunit->ufmt) err(a->cierr,103,"lio")