12508Sdlw /* 2*2591Sdlw char id_fmt[] = "@(#)fmt.c 1.2"; 32508Sdlw * 42508Sdlw * fortran format parser 52508Sdlw */ 62508Sdlw 72508Sdlw #include "fio.h" 8*2591Sdlw #include "format.h" 92508Sdlw 102508Sdlw #define isdigit(x) (x>='0' && x<='9') 112508Sdlw #define isspace(s) (s==' ') 122508Sdlw #define skip(s) while(isspace(*s)) s++ 132508Sdlw 142508Sdlw #ifdef interdata 152508Sdlw #define SYLMX 300 162508Sdlw #endif 172508Sdlw 182508Sdlw #ifdef pdp11 192508Sdlw #define SYLMX 300 202508Sdlw #endif 212508Sdlw 222508Sdlw #ifdef vax 232508Sdlw #define SYLMX 300 242508Sdlw #endif 252508Sdlw 262508Sdlw struct syl syl[SYLMX]; 272508Sdlw int parenlvl,pc,revloc; 282508Sdlw char *f_s(), *f_list(), *i_tem(), *gt_num(), *ap_end(); 292508Sdlw 302508Sdlw pars_f(s) char *s; 312508Sdlw { 322508Sdlw parenlvl=revloc=pc=0; 332508Sdlw return((f_s(s,0)==FMTERR)? ERROR : OK); 342508Sdlw } 352508Sdlw 362508Sdlw char *f_s(s,curloc) char *s; 372508Sdlw { 382508Sdlw skip(s); 392508Sdlw if(*s++!='(') 402508Sdlw { 412508Sdlw fmtptr = s; 422508Sdlw return(FMTERR); 432508Sdlw } 442508Sdlw if(parenlvl++ ==1) revloc=curloc; 452508Sdlw op_gen(RET,curloc,0,0,s); 462508Sdlw if((s=f_list(s))==FMTERR) 472508Sdlw { 482508Sdlw return(FMTERR); 492508Sdlw } 502508Sdlw skip(s); 512508Sdlw return(s); 522508Sdlw } 532508Sdlw 542508Sdlw char *f_list(s) char *s; 552508Sdlw { 562508Sdlw while (*s) 572508Sdlw { skip(s); 582508Sdlw if((s=i_tem(s))==FMTERR) return(FMTERR); 592508Sdlw skip(s); 602508Sdlw if(*s==',') s++; 612508Sdlw else if(*s==')') 622508Sdlw { if(--parenlvl==0) 632508Sdlw { 642508Sdlw op_gen(REVERT,revloc,0,0,s); 652508Sdlw } 662508Sdlw else op_gen(GOTO,0,0,0,s); 672508Sdlw return(++s); 682508Sdlw } 692508Sdlw } 702508Sdlw fmtptr = s; 712508Sdlw return(FMTERR); 722508Sdlw } 732508Sdlw 742508Sdlw char *i_tem(s) char *s; 752508Sdlw { char *t; 762508Sdlw int n,curloc; 772508Sdlw if(*s==')') return(s); 782508Sdlw if(ne_d(s,&t)) return(t); 792508Sdlw if(e_d(s,&t)) return(t); 802508Sdlw s=gt_num(s,&n); 812508Sdlw curloc = op_gen(STACK,n,0,0,s); 822508Sdlw return(f_s(s,curloc)); 832508Sdlw } 842508Sdlw 852508Sdlw ne_d(s,p) char *s,**p; 862508Sdlw { int n,x,sign=0,pp1,pp2; 872508Sdlw switch(lcase(*s)) 882508Sdlw { 892508Sdlw case ':': op_gen(COLON,(int)('\n'),0,0,s); break; 902508Sdlw #ifndef KOSHER 912508Sdlw case '$': op_gen(DOLAR,(int)('\0'),0,0,s); break; /*** NOT STANDARD FORTRAN ***/ 922508Sdlw #endif 932508Sdlw case 'b': 942508Sdlw switch(lcase(*(s+1))) 952508Sdlw { 962508Sdlw case 'z': s++; op_gen(BZ,1,0,0,s); break; 972508Sdlw case 'n': s++; 982508Sdlw default: op_gen(BN,0,0,0,s); break; 992508Sdlw } 1002508Sdlw break; 1012508Sdlw case 's': 1022508Sdlw switch(lcase(*(s+1))) 1032508Sdlw { 1042508Sdlw case 'p': s++; x=SP; pp1=1; pp2=1; break; 1052508Sdlw #ifndef KOSHER 1062508Sdlw case 'u': s++; x=SU; pp1=0; pp2=0; break; /*** NOT STANDARD FORTRAN ***/ 1072508Sdlw #endif 1082508Sdlw case 's': s++; x=SS; pp1=0; pp2=1; break; 1092508Sdlw default: x=S; pp1=0; pp2=1; break; 1102508Sdlw } 1112508Sdlw op_gen(x,pp1,pp2,0,s); 1122508Sdlw break; 1132508Sdlw case '/': op_gen(SLASH,0,0,0,s); break; 1142508Sdlw case '-': sign=1; s++; /*OUTRAGEOUS CODING TRICK*/ 1152508Sdlw case '0': case '1': case '2': case '3': case '4': 1162508Sdlw case '5': case '6': case '7': case '8': case '9': 1172508Sdlw s=gt_num(s,&n); 1182508Sdlw switch(lcase(*s)) 1192508Sdlw { 1202508Sdlw case 'p': if(sign) n= -n; op_gen(P,n,0,0,s); break; 1212508Sdlw #ifndef KOSHER 1222508Sdlw case 'r': if(n<=1) /*** NOT STANDARD FORTRAN ***/ 1232508Sdlw { fmtptr = s; return(FMTERR); } 1242508Sdlw op_gen(R,n,0,0,s); break; 1252508Sdlw case 't': op_gen(T,0,n,0,s); break; /* NOT STANDARD FORT */ 1262508Sdlw #endif 1272508Sdlw case 'x': op_gen(X,n,0,0,s); break; 1282508Sdlw case 'h': op_gen(H,n,(int)(s+1),0,s); 1292508Sdlw s+=n; 1302508Sdlw break; 1312508Sdlw default: fmtptr = s; return(0); 1322508Sdlw } 1332508Sdlw break; 1342508Sdlw case GLITCH: 1352508Sdlw case '"': 1362508Sdlw case '\'': op_gen(APOS,(int)s,0,0,s); 1372508Sdlw *p = ap_end(s); 1382508Sdlw return(FMTOK); 1392508Sdlw case 't': 1402508Sdlw switch(lcase(*(s+1))) 1412508Sdlw { 1422508Sdlw case 'l': s++; x=TL; break; 1432508Sdlw case 'r': s++; x=TR; break; 1442508Sdlw default: x=T; break; 1452508Sdlw } 1462508Sdlw if(isdigit(*(s+1))) {s=gt_num(s+1,&n); s--;} 1472508Sdlw #ifndef KOSHER 1482508Sdlw else n = 0; /* NOT STANDARD FORTRAN, should be error */ 1492508Sdlw #endif 1502508Sdlw #ifdef KOSHER 1512508Sdlw fmtptr = s; return(FMTERR); 1522508Sdlw #endif 1532508Sdlw op_gen(x,n,1,0,s); 1542508Sdlw break; 1552508Sdlw case 'x': op_gen(X,1,0,0,s); break; 1562508Sdlw case 'p': op_gen(P,0,0,0,s); break; 1572508Sdlw #ifndef KOSHER 1582508Sdlw case 'r': op_gen(R,10,1,0,s); break; /*** NOT STANDARD FORTRAN ***/ 1592508Sdlw #endif 1602508Sdlw 1612508Sdlw default: fmtptr = s; return(0); 1622508Sdlw } 1632508Sdlw s++; 1642508Sdlw *p=s; 1652508Sdlw return(FMTOK); 1662508Sdlw } 1672508Sdlw 1682508Sdlw e_d(s,p) char *s,**p; 1692508Sdlw { int n,w,d,e,x=0; 1702508Sdlw char *sv=s; 1712508Sdlw char c; 1722508Sdlw s=gt_num(s,&n); 1732508Sdlw op_gen(STACK,n,0,0,s); 1742508Sdlw c = lcase(*s); s++; 1752508Sdlw switch(c) 1762508Sdlw { 1772508Sdlw case 'd': 1782508Sdlw case 'e': 1792508Sdlw case 'g': 1802508Sdlw s = gt_num(s, &w); 1812508Sdlw if (w==0) break; 1822508Sdlw if(*s=='.') 1832508Sdlw { s++; 1842508Sdlw s=gt_num(s,&d); 1852508Sdlw } 1862508Sdlw else d=0; 1872508Sdlw if(lcase(*s) == 'e' 1882508Sdlw #ifndef KOSHER 1892508Sdlw || *s == '.' /*** '.' is NOT STANDARD FORTRAN ***/ 1902508Sdlw #endif 1912508Sdlw ) 1922508Sdlw { s++; 1932508Sdlw s=gt_num(s,&e); 1942508Sdlw if(c=='e') n=EE; else if(c=='d') n=DE; else n=GE; 1952508Sdlw } 1962508Sdlw else 1972508Sdlw { e=2; 1982508Sdlw if(c=='e') n=E; else if(c=='d') n=D; else n=G; 1992508Sdlw } 2002508Sdlw op_gen(n,w,d,e,s); 2012508Sdlw break; 2022508Sdlw case 'l': 2032508Sdlw s = gt_num(s, &w); 2042508Sdlw if (w==0) break; 2052508Sdlw op_gen(L,w,0,0,s); 2062508Sdlw break; 2072508Sdlw case 'a': 2082508Sdlw skip(s); 2092508Sdlw if(*s>='0' && *s<='9') 2102508Sdlw { s=gt_num(s,&w); 2112508Sdlw if(w==0) break; 2122508Sdlw op_gen(AW,w,0,0,s); 2132508Sdlw break; 2142508Sdlw } 2152508Sdlw op_gen(A,0,0,0,s); 2162508Sdlw break; 2172508Sdlw case 'f': 2182508Sdlw s = gt_num(s, &w); 2192508Sdlw if (w==0) break; 2202508Sdlw if(*s=='.') 2212508Sdlw { s++; 2222508Sdlw s=gt_num(s,&d); 2232508Sdlw } 2242508Sdlw else d=0; 2252508Sdlw op_gen(F,w,d,0,s); 2262508Sdlw break; 2272508Sdlw case 'i': 2282508Sdlw s = gt_num(s, &w); 2292508Sdlw if (w==0) break; 2302508Sdlw if(*s =='.') 2312508Sdlw { 2322508Sdlw s++; 2332508Sdlw s=gt_num(s,&d); 2342508Sdlw x = IM; 2352508Sdlw } 2362508Sdlw else 2372508Sdlw { d = 1; 2382508Sdlw x = I; 2392508Sdlw } 2402508Sdlw op_gen(x,w,d,0,s); 2412508Sdlw break; 2422508Sdlw default: 2432508Sdlw pc--; /* unSTACK */ 2442508Sdlw *p = sv; 2452508Sdlw fmtptr = s; 2462508Sdlw return(FMTERR); 2472508Sdlw } 2482508Sdlw *p = s; 2492508Sdlw return(FMTOK); 2502508Sdlw } 2512508Sdlw 2522508Sdlw op_gen(a,b,c,d,s) char *s; 2532508Sdlw { struct syl *p= &syl[pc]; 2542508Sdlw if(pc>=SYLMX) 2552508Sdlw { fmtptr = s; 256*2591Sdlw fatal(F_ERFMT,"format too complex"); 2572508Sdlw } 2582508Sdlw #ifdef DEBUG 2592508Sdlw fprintf(stderr,"%3d opgen: %d %d %d %d %c\n", 2602508Sdlw pc,a,b,c,d,*s==GLITCH?'"':*s); /* for debug */ 2612508Sdlw #endif 2622508Sdlw p->op=a; 2632508Sdlw p->p1=b; 2642508Sdlw p->p2=c; 2652508Sdlw p->p3=d; 2662508Sdlw return(pc++); 2672508Sdlw } 2682508Sdlw 2692508Sdlw char *gt_num(s,n) char *s; int *n; 2702508Sdlw { int m=0,a_digit=NO; 2712508Sdlw skip(s); 2722508Sdlw while(isdigit(*s) || isspace(*s)) 2732508Sdlw { 2742508Sdlw if (isdigit(*s)) 2752508Sdlw { 2762508Sdlw m = 10*m + (*s)-'0'; 2772508Sdlw a_digit = YES; 2782508Sdlw } 2792508Sdlw s++; 2802508Sdlw } 2812508Sdlw if(a_digit) *n=m; 2822508Sdlw else *n=1; 2832508Sdlw return(s); 2842508Sdlw } 2852508Sdlw 2862508Sdlw char *ap_end(s) char *s; 2872508Sdlw { 2882508Sdlw char quote; 2892508Sdlw quote = *s++; 2902508Sdlw for(;*s;s++) 2912508Sdlw { 2922508Sdlw if(*s==quote && *++s!=quote) return(s); 2932508Sdlw } 2942508Sdlw fmtptr = s; 295*2591Sdlw fatal(F_ERFMT,"bad string"); 2962508Sdlw } 297