Annotation of researchv10dc/libI77/fmt.c, revision 1.1.1.1

1.1       root        1: #include "f2c.h"
                      2: #include "fio.h"
                      3: #include "fmt.h"
                      4: #define skip(s) while(*s==' ') s++
                      5: #ifdef interdata
                      6: #define SYLMX 300
                      7: #endif
                      8: #ifdef pdp11
                      9: #define SYLMX 300
                     10: #endif
                     11: #ifdef vax
                     12: #define SYLMX 300
                     13: #endif
                     14: #ifndef SYLMX
                     15: #define SYLMX 300
                     16: #endif
                     17: #define GLITCH '\2'
                     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: struct f__syl f__syl[SYLMX];
                     22: int f__parenlvl,f__pc,f__revloc;
                     23: 
                     24: #ifdef KR_headers
                     25: char *ap_end(s) char *s;
                     26: #else
                     27: char *ap_end(char *s)
                     28: #endif
                     29: {      char quote;
                     30:        quote= *s++;
                     31:        for(;*s;s++)
                     32:        {       if(*s!=quote) continue;
                     33:                if(*++s!=quote) return(s);
                     34:        }
                     35:        if(f__elist->cierr) {
                     36:                errno = 100;
                     37:                return(NULL);
                     38:        }
                     39:        f__fatal(100, "bad string");
                     40:        /*NOTREACHED*/ return 0;
                     41: }
                     42: #ifdef KR_headers
                     43: op_gen(a,b,c,d)
                     44: #else
                     45: op_gen(int a, int b, int c, int d)
                     46: #endif
                     47: {      struct f__syl *p= &f__syl[f__pc];
                     48:        if(f__pc>=SYLMX)
                     49:        {       fprintf(stderr,"format too complicated:\n");
                     50:                sig_die(f__fmtbuf, 1);
                     51:        }
                     52:        p->op=a;
                     53:        p->p1=b;
                     54:        p->p2=c;
                     55:        p->p3=d;
                     56:        return(f__pc++);
                     57: }
                     58: #ifdef KR_headers
                     59: char *f_list();
                     60: char *gt_num(s,n) char *s; int *n;
                     61: #else
                     62: char *f_list(char*);
                     63: char *gt_num(char *s, int *n)
                     64: #endif
                     65: {      int m=0,f__cnt=0;
                     66:        char c;
                     67:        for(c= *s;;c = *s)
                     68:        {       if(c==' ')
                     69:                {       s++;
                     70:                        continue;
                     71:                }
                     72:                if(c>'9' || c<'0') break;
                     73:                m=10*m+c-'0';
                     74:                f__cnt++;
                     75:                s++;
                     76:        }
                     77:        if(f__cnt==0) *n=1;
                     78:        else *n=m;
                     79:        return(s);
                     80: }
                     81: #ifdef KR_headers
                     82: char *f_s(s,curloc) char *s;
                     83: #else
                     84: char *f_s(char *s, int curloc)
                     85: #endif
                     86: {
                     87:        skip(s);
                     88:        if(*s++!='(')
                     89:        {
                     90:                return(NULL);
                     91:        }
                     92:        if(f__parenlvl++ ==1) f__revloc=curloc;
                     93:        if(op_gen(RET1,curloc,0,0)<0 ||
                     94:                (s=f_list(s))==NULL)
                     95:        {
                     96:                return(NULL);
                     97:        }
                     98:        skip(s);
                     99:        return(s);
                    100: }
                    101: #ifdef KR_headers
                    102: ne_d(s,p) char *s,**p;
                    103: #else
                    104: ne_d(char *s, char **p)
                    105: #endif
                    106: {      int n,x,sign=0;
                    107:        struct f__syl *sp;
                    108:        switch(*s)
                    109:        {
                    110:        default:
                    111:                return(0);
                    112:        case ':': (void) op_gen(COLON,0,0,0); break;
                    113:        case '$':
                    114:                (void) op_gen(NONL, 0, 0, 0); break;
                    115:        case 'B':
                    116:        case 'b':
                    117:                if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
                    118:                else (void) op_gen(BN,0,0,0);
                    119:                break;
                    120:        case 'S':
                    121:        case 's':
                    122:                if(*(s+1)=='s' || *(s+1) == 'S')
                    123:                {       x=SS;
                    124:                        s++;
                    125:                }
                    126:                else if(*(s+1)=='p' || *(s+1) == 'P')
                    127:                {       x=SP;
                    128:                        s++;
                    129:                }
                    130:                else x=S;
                    131:                (void) op_gen(x,0,0,0);
                    132:                break;
                    133:        case '/': (void) op_gen(SLASH,0,0,0); break;
                    134:        case '-': sign=1;
                    135:        case '+':       s++;    /*OUTRAGEOUS CODING TRICK*/
                    136:        case '0': case '1': case '2': case '3': case '4':
                    137:        case '5': case '6': case '7': case '8': case '9':
                    138:                s=gt_num(s,&n);
                    139:                switch(*s)
                    140:                {
                    141:                default:
                    142:                        return(0);
                    143:                case 'P':
                    144:                case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
                    145:                case 'X':
                    146:                case 'x': (void) op_gen(X,n,0,0); break;
                    147:                case 'H':
                    148:                case 'h':
                    149:                        sp = &f__syl[op_gen(H,n,0,0)];
                    150:                        *(char **)&sp->p2 = s + 1;
                    151:                        s+=n;
                    152:                        break;
                    153:                }
                    154:                break;
                    155:        case GLITCH:
                    156:        case '"':
                    157:        case '\'':
                    158:                sp = &f__syl[op_gen(APOS,0,0,0)];
                    159:                *(char **)&sp->p2 = s;
                    160:                if((*p = ap_end(s)) == NULL)
                    161:                        return(0);
                    162:                return(1);
                    163:        case 'T':
                    164:        case 't':
                    165:                if(*(s+1)=='l' || *(s+1) == 'L')
                    166:                {       x=TL;
                    167:                        s++;
                    168:                }
                    169:                else if(*(s+1)=='r'|| *(s+1) == 'R')
                    170:                {       x=TR;
                    171:                        s++;
                    172:                }
                    173:                else x=T;
                    174:                s=gt_num(s+1,&n);
                    175:                s--;
                    176:                (void) op_gen(x,n,0,0);
                    177:                break;
                    178:        case 'X':
                    179:        case 'x': (void) op_gen(X,1,0,0); break;
                    180:        case 'P':
                    181:        case 'p': (void) op_gen(P,1,0,0); break;
                    182:        }
                    183:        s++;
                    184:        *p=s;
                    185:        return(1);
                    186: }
                    187: #ifdef KR_headers
                    188: e_d(s,p) char *s,**p;
                    189: #else
                    190: e_d(char *s, char **p)
                    191: #endif
                    192: {      int i,im,n,w,d,e,found=0,x=0;
                    193:        char *sv=s;
                    194:        s=gt_num(s,&n);
                    195:        (void) op_gen(STACK,n,0,0);
                    196:        switch(*s++)
                    197:        {
                    198:        default: break;
                    199:        case 'E':
                    200:        case 'e':       x=1;
                    201:        case 'G':
                    202:        case 'g':
                    203:                found=1;
                    204:                s=gt_num(s,&w);
                    205:                if(w==0) break;
                    206:                if(*s=='.')
                    207:                {       s++;
                    208:                        s=gt_num(s,&d);
                    209:                }
                    210:                else d=0;
                    211:                if(*s!='E' && *s != 'e')
                    212:                        (void) op_gen(x==1?E:G,w,d,0);  /* default is Ew.dE2 */
                    213:                else
                    214:                {       s++;
                    215:                        s=gt_num(s,&e);
                    216:                        (void) op_gen(x==1?EE:GE,w,d,e);
                    217:                }
                    218:                break;
                    219:        case 'O':
                    220:        case 'o':
                    221:                i = O;
                    222:                im = OM;
                    223:                goto finish_I;
                    224:        case 'Z':
                    225:        case 'z':
                    226:                i = Z;
                    227:                im = ZM;
                    228:                goto finish_I;
                    229:        case 'L':
                    230:        case 'l':
                    231:                found=1;
                    232:                s=gt_num(s,&w);
                    233:                if(w==0) break;
                    234:                (void) op_gen(L,w,0,0);
                    235:                break;
                    236:        case 'A':
                    237:        case 'a':
                    238:                found=1;
                    239:                skip(s);
                    240:                if(*s>='0' && *s<='9')
                    241:                {       s=gt_num(s,&w);
                    242:                        if(w==0) break;
                    243:                        (void) op_gen(AW,w,0,0);
                    244:                        break;
                    245:                }
                    246:                (void) op_gen(A,0,0,0);
                    247:                break;
                    248:        case 'F':
                    249:        case 'f':
                    250:                found=1;
                    251:                s=gt_num(s,&w);
                    252:                if(w==0) break;
                    253:                if(*s=='.')
                    254:                {       s++;
                    255:                        s=gt_num(s,&d);
                    256:                }
                    257:                else d=0;
                    258:                (void) op_gen(F,w,d,0);
                    259:                break;
                    260:        case 'D':
                    261:        case 'd':
                    262:                found=1;
                    263:                s=gt_num(s,&w);
                    264:                if(w==0) break;
                    265:                if(*s=='.')
                    266:                {       s++;
                    267:                        s=gt_num(s,&d);
                    268:                }
                    269:                else d=0;
                    270:                (void) op_gen(D,w,d,0);
                    271:                break;
                    272:        case 'I':
                    273:        case 'i':
                    274:                i = I;
                    275:                im = IM;
                    276:  finish_I:
                    277:                found=1;
                    278:                s=gt_num(s,&w);
                    279:                if(w==0) break;
                    280:                if(*s!='.')
                    281:                {       (void) op_gen(i,w,0,0);
                    282:                        break;
                    283:                }
                    284:                s++;
                    285:                s=gt_num(s,&d);
                    286:                (void) op_gen(im,w,d,0);
                    287:                break;
                    288:        }
                    289:        if(found==0)
                    290:        {       f__pc--; /*unSTACK*/
                    291:                *p=sv;
                    292:                return(0);
                    293:        }
                    294:        *p=s;
                    295:        return(1);
                    296: }
                    297: #ifdef KR_headers
                    298: char *i_tem(s) char *s;
                    299: #else
                    300: char *i_tem(char *s)
                    301: #endif
                    302: {      char *t;
                    303:        int n,curloc;
                    304:        if(*s==')') return(s);
                    305:        if(ne_d(s,&t)) return(t);
                    306:        if(e_d(s,&t)) return(t);
                    307:        s=gt_num(s,&n);
                    308:        if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
                    309:        return(f_s(s,curloc));
                    310: }
                    311: #ifdef KR_headers
                    312: char *f_list(s) char *s;
                    313: #else
                    314: char *f_list(char *s)
                    315: #endif
                    316: {
                    317:        for(;*s!=0;)
                    318:        {       skip(s);
                    319:                if((s=i_tem(s))==NULL) return(NULL);
                    320:                skip(s);
                    321:                if(*s==',') s++;
                    322:                else if(*s==')')
                    323:                {       if(--f__parenlvl==0)
                    324:                        {
                    325:                                (void) op_gen(REVERT,f__revloc,0,0);
                    326:                                return(++s);
                    327:                        }
                    328:                        (void) op_gen(GOTO,0,0,0);
                    329:                        return(++s);
                    330:                }
                    331:        }
                    332:        return(NULL);
                    333: }
                    334: 
                    335: #ifdef KR_headers
                    336: pars_f(s) char *s;
                    337: #else
                    338: pars_f(char *s)
                    339: #endif
                    340: {
                    341:        f__parenlvl=f__revloc=f__pc=0;
                    342:        if(f_s(s,0) == NULL)
                    343:        {
                    344:                return(-1);
                    345:        }
                    346:        return(0);
                    347: }
                    348: #define STKSZ 10
                    349: int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp;
                    350: flag f__workdone, f__nonl;
                    351: 
                    352: #ifdef KR_headers
                    353: type_f(n)
                    354: #else
                    355: type_f(int n)
                    356: #endif
                    357: {
                    358:        switch(n)
                    359:        {
                    360:        default:
                    361:                return(n);
                    362:        case RET1:
                    363:                return(RET1);
                    364:        case REVERT: return(REVERT);
                    365:        case GOTO: return(GOTO);
                    366:        case STACK: return(STACK);
                    367:        case X:
                    368:        case SLASH:
                    369:        case APOS: case H:
                    370:        case T: case TL: case TR:
                    371:                return(NED);
                    372:        case F:
                    373:        case I:
                    374:        case IM:
                    375:        case A: case AW:
                    376:        case O: case OM:
                    377:        case L:
                    378:        case E: case EE: case D:
                    379:        case G: case GE:
                    380:        case Z: case ZM:
                    381:                return(ED);
                    382:        }
                    383: }
                    384: #ifdef KR_headers
                    385: integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
                    386: #else
                    387: integer do_fio(ftnint *number, char *ptr, ftnlen len)
                    388: #endif
                    389: {      struct f__syl *p;
                    390:        int n,i;
                    391:        for(i=0;i<*number;i++,ptr+=len)
                    392:        {
                    393: loop:  switch(type_f((p= &f__syl[f__pc])->op))
                    394:        {
                    395:        default:
                    396:                fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
                    397:                        p->op,f__fmtbuf);
                    398:                err(f__elist->cierr,100,"do_fio");
                    399:        case NED:
                    400:                if((*f__doned)(p))
                    401:                {       f__pc++;
                    402:                        goto loop;
                    403:                }
                    404:                f__pc++;
                    405:                continue;
                    406:        case ED:
                    407:                if(f__cnt[f__cp]<=0)
                    408:                {       f__cp--;
                    409:                        f__pc++;
                    410:                        goto loop;
                    411:                }
                    412:                if(ptr==NULL)
                    413:                        return((*f__doend)());
                    414:                f__cnt[f__cp]--;
                    415:                f__workdone=1;
                    416:                if((n=(*f__doed)(p,ptr,len))>0)
                    417:                        errfl(f__elist->cierr,errno,"fmt");
                    418:                if(n<0)
                    419:                        err(f__elist->ciend,(EOF),"fmt");
                    420:                continue;
                    421:        case STACK:
                    422:                f__cnt[++f__cp]=p->p1;
                    423:                f__pc++;
                    424:                goto loop;
                    425:        case RET1:
                    426:                f__ret[++f__rp]=p->p1;
                    427:                f__pc++;
                    428:                goto loop;
                    429:        case GOTO:
                    430:                if(--f__cnt[f__cp]<=0)
                    431:                {       f__cp--;
                    432:                        f__rp--;
                    433:                        f__pc++;
                    434:                        goto loop;
                    435:                }
                    436:                f__pc=1+f__ret[f__rp--];
                    437:                goto loop;
                    438:        case REVERT:
                    439:                f__rp=f__cp=0;
                    440:                f__pc = p->p1;
                    441:                if(ptr==NULL)
                    442:                        return((*f__doend)());
                    443:                if(!f__workdone) return(0);
                    444:                if((n=(*f__dorevert)()) != 0) return(n);
                    445:                goto loop;
                    446:        case COLON:
                    447:                if(ptr==NULL)
                    448:                        return((*f__doend)());
                    449:                f__pc++;
                    450:                goto loop;
                    451:        case NONL:
                    452:                f__nonl = 1;
                    453:                f__pc++;
                    454:                goto loop;
                    455:        case S:
                    456:        case SS:
                    457:                f__cplus=0;
                    458:                f__pc++;
                    459:                goto loop;
                    460:        case SP:
                    461:                f__cplus = 1;
                    462:                f__pc++;
                    463:                goto loop;
                    464:        case P: f__scale=p->p1;
                    465:                f__pc++;
                    466:                goto loop;
                    467:        case BN:
                    468:                f__cblank=0;
                    469:                f__pc++;
                    470:                goto loop;
                    471:        case BZ:
                    472:                f__cblank=1;
                    473:                f__pc++;
                    474:                goto loop;
                    475:        }
                    476:        }
                    477:        return(0);
                    478: }
                    479: en_fio(Void)
                    480: {      ftnint one=1;
                    481:        return(do_fio(&one,(char *)NULL,(ftnint)0));
                    482: }
                    483:  VOID
                    484: fmt_bg(Void)
                    485: {
                    486:        f__workdone=f__cp=f__rp=f__pc=f__cursor=0;
                    487:        f__cnt[0]=f__ret[0]=0;
                    488: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.