Annotation of researchv10dc/libI77/fmt.c, revision 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.