4
#define skip(s) while(*s==' ') s++
18
/* special quote character for stu */
19
extern int f__cursor,f__scale;
20
extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/
21
static struct syl f__syl[SYLMX];
22
int f__parenlvl,f__pc,f__revloc;
26
char *ap_end(s) char *s;
33
{ if(*s!=quote) continue;
34
if(*++s!=quote) return(s);
40
f__fatal(100, "bad string");
41
/*NOTREACHED*/ return 0;
47
op_gen(int a, int b, int c, int d)
49
{ struct syl *p= &f__syl[f__pc];
51
{ fprintf(stderr,"format too complicated:\n");
52
sig_die(f__fmtbuf, 1);
61
static char *f_list();
62
static char *gt_num(s,n,n1) char *s; int *n, n1;
64
static char *f_list(char*);
65
static char *gt_num(char *s, int *n, int n1)
74
if(c>'9' || c<'0') break;
90
char *f_s(s,curloc) char *s;
92
char *f_s(char *s, int curloc)
100
if(f__parenlvl++ ==1) f__revloc=curloc;
101
if(op_gen(RET1,curloc,0,0)<0 ||
112
ne_d(s,p) char *s,**p;
114
ne_d(char *s, char **p)
122
case ':': (void) op_gen(COLON,0,0,0); break;
124
(void) op_gen(NONL, 0, 0, 0); break;
127
if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
128
else (void) op_gen(BN,0,0,0);
132
if(*(s+1)=='s' || *(s+1) == 'S')
136
else if(*(s+1)=='p' || *(s+1) == 'P')
141
(void) op_gen(x,0,0,0);
143
case '/': (void) op_gen(SLASH,0,0,0); break;
145
case '+': s++; /*OUTRAGEOUS CODING TRICK*/
146
case '0': case '1': case '2': case '3': case '4':
147
case '5': case '6': case '7': case '8': case '9':
148
if (!(s=gt_num(s,&n,0))) {
157
case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
159
case 'x': (void) op_gen(X,n,0,0); break;
162
sp = &f__syl[op_gen(H,n,0,0)];
171
sp = &f__syl[op_gen(APOS,0,0,0)];
173
if((*p = ap_end(s)) == NULL)
178
if(*(s+1)=='l' || *(s+1) == 'L')
182
else if(*(s+1)=='r'|| *(s+1) == 'R')
187
if (!(s=gt_num(s+1,&n,0)))
190
(void) op_gen(x,n,0,0);
193
case 'x': (void) op_gen(X,1,0,0); break;
195
case 'p': (void) op_gen(P,1,0,0); break;
204
e_d(s,p) char *s,**p;
206
e_d(char *s, char **p)
208
{ int i,im,n,w,d,e,found=0,x=0;
211
(void) op_gen(STACK,n,0,0);
220
if (!(s=gt_num(s,&w,0))) {
227
if (!(s=gt_num(s+1,&d,0)))
231
if(*s!='E' && *s != 'e')
232
(void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */
234
if (!(s=gt_num(s+1,&e,0)))
236
(void) op_gen(x==1?EE:GE,w,d,e);
252
if (!(s=gt_num(s,&w,0)))
255
(void) op_gen(L,w,0,0);
261
if(*s>='0' && *s<='9')
264
(void) op_gen(AW,w,0,0);
267
(void) op_gen(A,0,0,0);
271
if (!(s=gt_num(s,&w,0)))
276
if (!(s=gt_num(s+1,&d,0)))
280
(void) op_gen(F,w,d,0);
285
if (!(s=gt_num(s,&w,0)))
289
if (!(s=gt_num(s+1,&d,0)))
293
(void) op_gen(D,w,d,0);
300
if (!(s=gt_num(s,&w,0)))
305
{ (void) op_gen(i,w,0,0);
308
if (!(s=gt_num(s+1,&d,0)))
310
(void) op_gen(im,w,d,0);
314
{ f__pc--; /*unSTACK*/
323
char *i_tem(s) char *s;
329
if(*s==')') return(s);
330
if(ne_d(s,&t)) return(t);
331
if(e_d(s,&t)) return(t);
333
if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
334
return(f_s(s,curloc));
339
char *f_list(s) char *s;
341
char *f_list(char *s)
346
if((s=i_tem(s))==NULL) return(NULL);
350
{ if(--f__parenlvl==0)
352
(void) op_gen(REVERT,f__revloc,0,0);
355
(void) op_gen(GOTO,0,0,0);
368
f__parenlvl=f__revloc=f__pc=0;
376
int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp;
377
flag f__workdone, f__nonl;
392
case REVERT: return(REVERT);
393
case GOTO: return(GOTO);
394
case STACK: return(STACK);
398
case T: case TL: case TR:
406
case E: case EE: case D:
413
integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
415
integer do_fio(ftnint *number, char *ptr, ftnlen len)
419
for(i=0;i<*number;i++,ptr+=len)
421
loop: switch(type_f((p= &f__syl[f__pc])->op))
424
fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
426
err(f__elist->cierr,100,"do_fio");
441
return((*f__doend)());
444
if((n=(*f__doed)(p,ptr,len))>0)
445
errfl(f__elist->cierr,errno,"fmt");
447
err(f__elist->ciend,(EOF),"fmt");
450
f__cnt[++f__cp]=p->p1;
454
f__ret[++f__rp]=p->p1;
458
if(--f__cnt[f__cp]<=0)
464
f__pc=1+f__ret[f__rp--];
470
return((*f__doend)());
471
if(!f__workdone) return(0);
472
if((n=(*f__dorevert)()) != 0) return(n);
476
return((*f__doend)());
492
case P: f__scale=p->p1;
509
return(do_fio(&one,(char *)NULL,(ftnint)0));
514
f__workdone=f__cp=f__rp=f__pc=f__cursor=0;
515
f__cnt[0]=f__ret[0]=0;