Annotation of researchv8dc/libI77/fmt.c, revision 1.1

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

unix.superglobalmegacorp.com

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