7
#define skip(s) while(*s==' ') s++
21
/* special quote character for stu */
22
extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/
23
static struct syl f__syl[SYLMX];
24
int f__parenlvl,f__pc,f__revloc;
28
char *ap_end(s) char *s;
35
{ if(*s!=quote) continue;
36
if(*++s!=quote) return(s);
42
f__fatal(100, "bad string");
43
/*NOTREACHED*/ return 0;
49
op_gen(int a, int b, int c, int d)
51
{ struct syl *p= &f__syl[f__pc];
53
{ fprintf(stderr,"format too complicated:\n");
54
sig_die(f__fmtbuf, 1);
63
static char *f_list();
64
static char *gt_num(s,n,n1) char *s; int *n, n1;
66
static char *f_list(char*);
67
static char *gt_num(char *s, int *n, int n1)
76
if(c>'9' || c<'0') break;
92
char *f_s(s,curloc) char *s;
94
char *f_s(char *s, int curloc)
102
if(f__parenlvl++ ==1) f__revloc=curloc;
103
if(op_gen(RET1,curloc,0,0)<0 ||
114
ne_d(s,p) char *s,**p;
116
ne_d(char *s, char **p)
124
case ':': (void) op_gen(COLON,0,0,0); break;
126
(void) op_gen(NONL, 0, 0, 0); break;
129
if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
130
else (void) op_gen(BN,0,0,0);
134
if(*(s+1)=='s' || *(s+1) == 'S')
138
else if(*(s+1)=='p' || *(s+1) == 'P')
143
(void) op_gen(x,0,0,0);
145
case '/': (void) op_gen(SLASH,0,0,0); break;
147
case '+': s++; /*OUTRAGEOUS CODING TRICK*/
148
case '0': case '1': case '2': case '3': case '4':
149
case '5': case '6': case '7': case '8': case '9':
150
if (!(s=gt_num(s,&n,0))) {
159
case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
161
case 'x': (void) op_gen(X,n,0,0); break;
164
sp = &f__syl[op_gen(H,n,0,0)];
173
sp = &f__syl[op_gen(APOS,0,0,0)];
175
if((*p = ap_end(s)) == NULL)
180
if(*(s+1)=='l' || *(s+1) == 'L')
184
else if(*(s+1)=='r'|| *(s+1) == 'R')
189
if (!(s=gt_num(s+1,&n,0)))
192
(void) op_gen(x,n,0,0);
195
case 'x': (void) op_gen(X,1,0,0); break;
197
case 'p': (void) op_gen(P,1,0,0); break;
206
e_d(s,p) char *s,**p;
208
e_d(char *s, char **p)
210
{ int i,im,n,w,d,e,found=0,x=0;
213
(void) op_gen(STACK,n,0,0);
222
if (!(s=gt_num(s,&w,0))) {
229
if (!(s=gt_num(s+1,&d,0)))
233
if(*s!='E' && *s != 'e')
234
(void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */
236
if (!(s=gt_num(s+1,&e,0)))
238
(void) op_gen(x==1?EE:GE,w,d,e);
254
if (!(s=gt_num(s,&w,0)))
257
(void) op_gen(L,w,0,0);
263
if(*s>='0' && *s<='9')
266
(void) op_gen(AW,w,0,0);
269
(void) op_gen(A,0,0,0);
273
if (!(s=gt_num(s,&w,0)))
278
if (!(s=gt_num(s+1,&d,0)))
282
(void) op_gen(F,w,d,0);
287
if (!(s=gt_num(s,&w,0)))
291
if (!(s=gt_num(s+1,&d,0)))
295
(void) op_gen(D,w,d,0);
302
if (!(s=gt_num(s,&w,0)))
307
{ (void) op_gen(i,w,0,0);
310
if (!(s=gt_num(s+1,&d,0)))
312
(void) op_gen(im,w,d,0);
316
{ f__pc--; /*unSTACK*/
325
char *i_tem(s) char *s;
331
if(*s==')') return(s);
332
if(ne_d(s,&t)) return(t);
333
if(e_d(s,&t)) return(t);
335
if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
336
return(f_s(s,curloc));
341
char *f_list(s) char *s;
343
char *f_list(char *s)
348
if((s=i_tem(s))==NULL) return(NULL);
352
{ if(--f__parenlvl==0)
354
(void) op_gen(REVERT,f__revloc,0,0);
357
(void) op_gen(GOTO,0,0,0);
371
f__parenlvl=f__revloc=f__pc=0;
379
int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp;
380
flag f__workdone, f__nonl;
395
case REVERT: return(REVERT);
396
case GOTO: return(GOTO);
397
case STACK: return(STACK);
401
case T: case TL: case TR:
409
case E: case EE: case D:
416
integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
418
integer do_fio(ftnint *number, char *ptr, ftnlen len)
422
for(i=0;i<*number;i++,ptr+=len)
424
loop: switch(type_f((p= &f__syl[f__pc])->op))
427
fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
429
err(f__elist->cierr,100,"do_fio");
444
return((*f__doend)());
447
if((n=(*f__doed)(p,ptr,len))>0)
448
errfl(f__elist->cierr,errno,"fmt");
450
err(f__elist->ciend,(EOF),"fmt");
453
f__cnt[++f__cp]=p->p1;
457
f__ret[++f__rp]=p->p1;
461
if(--f__cnt[f__cp]<=0)
467
f__pc=1+f__ret[f__rp--];
473
return((*f__doend)());
474
if(!f__workdone) return(0);
475
if((n=(*f__dorevert)()) != 0) return(n);
479
return((*f__doend)());
495
case P: f__scale=p->p1;
514
return(do_fio(&one,(char *)NULL,(ftnint)0));
520
f__workdone=f__cp=f__rp=f__pc=f__cursor=0;
521
f__cnt[0]=f__ret[0]=0;