4 #define skip(s) while(*s==' ') s++
18 /* special quote character for stu */
19 extern int cursor,scale;
20 extern flag cblank,cplus; /*blanks in I and compulsory plus*/
21 struct syl syl[SYLMX];
22 int parenlvl,pc,revloc;
24 char *f_s(),*f_list(),*i_tem(),*gt_num();
35 char *f_s(s,curloc) char *s;
42 if(parenlvl++ ==1) revloc=curloc;
43 if(op_gen(RET,curloc,0,0)<0 ||
51 char *f_list(s) char *s;
55 if((s=i_tem(s))==NULL) return(NULL);
61 (void) op_gen(REVERT,revloc,0,0);
64 (void) op_gen(GOTO,0,0,0);
70 char *i_tem(s) char *s;
73 if(*s==')') return(s);
74 if(ne_d(s,&t)) return(t);
75 if(e_d(s,&t)) return(t);
77 if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
78 return(f_s(s,curloc));
80 ne_d(s,p) char *s,**p;
88 case ':': (void) op_gen(COLON,0,0,0); break;
90 (void) op_gen(NONL, 0, 0, 0); break;
93 if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
94 else (void) op_gen(BN,0,0,0);
98 if(*(s+1)=='s' || *(s+1) == 'S')
102 else if(*(s+1)=='p' || *(s+1) == 'P')
107 (void) op_gen(x,0,0,0);
109 case '/': (void) op_gen(SLASH,0,0,0); break;
111 case '+': s++; /*OUTRAGEOUS CODING TRICK*/
112 case '0': case '1': case '2': case '3': case '4':
113 case '5': case '6': case '7': case '8': case '9':
120 case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
122 case 'x': (void) op_gen(X,n,0,0); break;
125 sp = &syl[op_gen(H,n,0,0)];
126 *(char **)&sp->p2 = s + 1;
134 sp = &syl[op_gen(APOS,0,0,0)];
135 *(char **)&sp->p2 = s;
136 if((*p = ap_end(s)) == NULL)
141 if(*(s+1)=='l' || *(s+1) == 'L')
145 else if(*(s+1)=='r'|| *(s+1) == 'R')
152 (void) op_gen(x,n,0,0);
155 case 'x': (void) op_gen(X,1,0,0); break;
157 case 'p': (void) op_gen(P,1,0,0); break;
163 e_d(s,p) char *s,**p;
164 { int n,w,d,e,found=0,x=0;
167 (void) op_gen(STACK,n,0,0);
183 if(*s!='E' && *s != 'e')
184 (void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */
188 (void) op_gen(x==1?EE:GE,w,d,e);
196 (void) op_gen(O, w, 0, 0);
203 (void) op_gen(L,w,0,0);
209 if(*s>='0' && *s<='9')
212 (void) op_gen(AW,w,0,0);
215 (void) op_gen(A,0,0,0);
227 (void) op_gen(F,w,d,0);
239 (void) op_gen(D,w,d,0);
247 { (void) op_gen(I,w,0,0);
252 (void) op_gen(IM,w,d,0);
264 { struct syl *p= &syl[pc];
266 { fprintf(stderr,"format too complicated:\n");
275 char *gt_num(s,n) char *s; int *n;
283 if(c>'9' || c<'0') break;
293 int cnt[STKSZ],ret[STKSZ],cp,rp;
296 integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
299 for(i=0;i<*number;i++,ptr+=len)
301 loop: switch(type_f((p= &syl[pc])->op))
304 fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
306 err(elist->cierr,100,"do_fio");
324 if((n=(*doed)(p,ptr,len))>0) err(elist->cierr,errno,"fmt");
325 if(n<0) err(elist->ciend,(EOF),"fmt");
349 if(!workdone) return(0);
350 if((n=(*dorevert)()) != 0) return(n);
387 return(do_fio(&one,(char *)NULL,(ftnint)0));
391 workdone=cp=rp=pc=cursor=0;
402 case REVERT: return(REVERT);
403 case GOTO: return(GOTO);
404 case STACK: return(STACK);
408 case T: case TL: case TR:
416 case E: case EE: case D:
421 char *ap_end(s) char *s;
425 { if(*s!=quote) continue;
426 if(*++s!=quote) return(s);
432 fatal(100, "bad string");
433 /*NOTREACHED*/ return 0;