Annotation of researchv10no/cmd/sno/sno1.c, revision 1.1

1.1     ! root        1: /*     @(#)sno1.c      1.2     */
        !             2: #include "sno.h"
        !             3: #define INCR 200
        !             4: 
        !             5: /*
        !             6:  *   Snobol III
        !             7:  */
        !             8: 
        !             9: 
        !            10: int    incomp;
        !            11: int     freesize;
        !            12: struct  node *lookf;
        !            13: struct  node *looks;
        !            14: struct  node *lookend;
        !            15: struct  node *lookstart;
        !            16: struct  node *lookdef;
        !            17: struct  node *lookret;
        !            18: struct  node *lookfret;
        !            19: int     cfail;
        !            20: int     rfail;
        !            21: struct  node *freelist, *freespace;
        !            22: struct  node *namelist;
        !            23: int     lc;
        !            24: struct  node *schar;
        !            25: FILE   *fin;
        !            26: int    xargc;
        !            27: char   **xargv;
        !            28: 
        !            29: char *malloc();
        !            30: 
        !            31: struct node *
        !            32: init (s, t)
        !            33:        char *s;
        !            34: {
        !            35:        register struct node *a, *b;
        !            36: 
        !            37:        a = strst1 (s);
        !            38:        b = look (a);
        !            39:        delete (a);
        !            40:        b->typ = t;
        !            41:        return (b);
        !            42: }
        !            43: 
        !            44: main (argc, argv)
        !            45:        char *argv[];
        !            46: {
        !            47:        register struct node *a, *b, *c;
        !            48:        static char stdbuf[BUFSIZ];
        !            49: 
        !            50:        setbuf (stdout, stdbuf);
        !            51:        ncinit (argc, argv);
        !            52:        lookf = init ("f", 0);
        !            53:        looks = init ("s", 0);
        !            54:        lookend = init ("end", 0);
        !            55:        lookstart = init ("start", 0);
        !            56:        lookdef = init ("define", 0);
        !            57:        lookret = init ("return", 0);
        !            58:        lookfret = init ("freturn", 0);
        !            59:        init ("syspit", 3);
        !            60:        init ("syspot", 4);
        !            61:        incomp = 1;
        !            62:        a = c = compile();
        !            63:        while (lookend->typ != 2) {
        !            64:                a->p1 = b = compile();
        !            65:                a = b;
        !            66:        }
        !            67:        cfail = 1;
        !            68:        a->p1 = 0;
        !            69:        if (lookstart->typ == 2)
        !            70:                c = lookstart->p2;
        !            71:        incomp = 0;
        !            72:        while (c=execute (c));
        !            73: }
        !            74: 
        !            75: struct node *
        !            76: syspit()
        !            77: {
        !            78:        register struct node *b, *c, *d;
        !            79:        int a;
        !            80:        char nextchar();
        !            81: 
        !            82:        a = nextchar();
        !            83:        if (a == '\n')
        !            84:                return (0);
        !            85:        if((a == '*') && incomp){
        !            86:                while(nextchar() != '\n') ;
        !            87:                return 0;
        !            88:        }
        !            89:        b = c = salloc();
        !            90:        while (a != '\n') {
        !            91:                c->p1 = d = salloc();
        !            92:                c = d;
        !            93:                c->ch = a;
        !            94:                if (a == '\0') {
        !            95:                        rfail = 1;
        !            96:                        break;
        !            97:                }
        !            98:                a = nextchar();
        !            99:        }
        !           100:        b->p2 = c;
        !           101:        if (rfail) {
        !           102:                delete (b);
        !           103:                b = 0;
        !           104:        }
        !           105:        return (b);
        !           106: }
        !           107: 
        !           108: syspot (string)
        !           109:        struct node *string;
        !           110: {
        !           111:        register struct node *a, *b, *s;
        !           112: 
        !           113:        s = string;
        !           114:        if (s!=0) {
        !           115:                a = s;
        !           116:                b = s->p2;
        !           117:                while (a != b) {
        !           118:                        a = a->p1;
        !           119:                        putchar (a->ch);
        !           120:                }
        !           121:        }
        !           122:        putchar ('\n');
        !           123: }
        !           124: 
        !           125: struct node *
        !           126: strst1 (s)
        !           127:        char s[];
        !           128: {
        !           129:        int c;
        !           130:        register struct node *e, *f, *d;
        !           131: 
        !           132:        d = f = salloc();
        !           133:        while ((c = *s++)!='\0') {
        !           134:                (e=salloc())->ch = c;
        !           135:                f->p1 = e;
        !           136:                f = e;
        !           137:        }
        !           138:        d->p2 = e;
        !           139:        return (d);
        !           140: }
        !           141: 
        !           142: class (c)
        !           143: {
        !           144:        switch (c) {
        !           145:                case ')':  return (1);
        !           146:                case '(':  return (2);
        !           147:                case '\t':
        !           148:                case ' ': return (3);
        !           149:                case '+':  return (4);
        !           150:                case '-':  return (5);
        !           151:                case '*': return (6);
        !           152:                case '/':  return (7);
        !           153:                case '$':  return (8);
        !           154:                case '"':
        !           155:                case '\'': return (9);
        !           156:                case '=':  return (10);
        !           157:                case ',':  return (11);
        !           158:        }
        !           159:        return (0);
        !           160: }
        !           161: 
        !           162: struct node *
        !           163: salloc()
        !           164: {
        !           165:        register struct node *f;
        !           166:        register char *i;
        !           167: 
        !           168:        if (freelist==0) {
        !           169:                if (--freesize < 0) {
        !           170:                        if ((i=malloc (INCR * sizeof (struct node))) == NULL) {
        !           171:                                puts ("Out of free space");
        !           172:                                exit (1);
        !           173:                        }
        !           174:                        freesize = INCR - 1;
        !           175:                        freespace = (struct node *) i;
        !           176:                }
        !           177:                return (freespace++);
        !           178:        }
        !           179:        f = freelist;
        !           180:        freelist = freelist->p1;
        !           181:        return (f);
        !           182: }
        !           183: 
        !           184: sfree (pointer)
        !           185:        struct node *pointer;
        !           186: {
        !           187:        pointer->p1 = freelist;
        !           188:        freelist = pointer;
        !           189: }
        !           190: 
        !           191: int
        !           192: nfree()
        !           193: {
        !           194:        register int i;
        !           195:        register struct node *a;
        !           196: 
        !           197:        i = freesize;
        !           198:        a = freelist;
        !           199:        while (a) {
        !           200:                a = a->p1;
        !           201:                i++;
        !           202:        }
        !           203:        return (i);
        !           204: }
        !           205: 
        !           206: struct node *
        !           207: look (string)
        !           208:        struct node *string;
        !           209: {
        !           210:        register struct node *i, *j, *k;
        !           211: 
        !           212:        k = 0;
        !           213:        i = namelist;
        !           214:        while (i) {
        !           215:                j = i->p1;
        !           216:                if (equal (j->p1, string) == 0)
        !           217:                        return (j);
        !           218:                i = (k=i)->p2;
        !           219:        }
        !           220:        i = salloc();
        !           221:        i->p2 = 0;
        !           222:        if (k)
        !           223:                k->p2 = i;
        !           224:        else
        !           225:                namelist = i;
        !           226:        j = salloc();
        !           227:        i->p1 = j;
        !           228:        j->p1 = copy (string);
        !           229:        j->p2 = 0;
        !           230:        j->typ = 0;
        !           231:        return (j);
        !           232: }
        !           233: 
        !           234: struct node *
        !           235: copy (string)
        !           236:        struct node *string;
        !           237: {
        !           238:        register struct node *j, *l, *m;
        !           239:        struct node *i, *k;
        !           240: 
        !           241:        if (string == 0)
        !           242:                return (0);
        !           243:        i = l = salloc();
        !           244:        j = string;
        !           245:        k = string->p2;
        !           246:        while (j != k) {
        !           247:                m = salloc();
        !           248:                m->ch = (j=j->p1)->ch;
        !           249:                l->p1 = m;
        !           250:                l = m;
        !           251:        }
        !           252:        i->p2 = l;
        !           253:        return (i);
        !           254: }
        !           255: 
        !           256: int
        !           257: equal (string1, string2)
        !           258:        struct node *string1, *string2;
        !           259: {
        !           260:        register struct node *i, *j, *k;
        !           261:        struct node *l;
        !           262:        int n, m;
        !           263: 
        !           264:        if (string1==0) {
        !           265:                if (string2==0)
        !           266:                        return (0);
        !           267:                return (-1);
        !           268:        }
        !           269:        if (string2==0)
        !           270:                return (1);
        !           271:        i = string1;
        !           272:        j = string1->p2;
        !           273:        k = string2;
        !           274:        l = string2->p2;
        !           275:        for (;;) {
        !           276:                m = (i=i->p1)->ch;
        !           277:                n = (k=k->p1)->ch;
        !           278:                if (m>n)
        !           279:                        return (1);
        !           280:                if (m<n)
        !           281:                        return (-1);
        !           282:                if (i==j) {
        !           283:                        if (k==l)
        !           284:                                return (0);
        !           285:                        return (-1);
        !           286:                }
        !           287:                if (k==l)
        !           288:                        return (1);
        !           289:        }
        !           290: }
        !           291: 
        !           292: int
        !           293: strbin (string)
        !           294:        struct node *string;
        !           295: {
        !           296:        int n, m, sign;
        !           297:        register struct node *p, *q, *s;
        !           298: 
        !           299:        s = string;
        !           300:        n = 0;
        !           301:        if (s==0)
        !           302:                return (0);
        !           303:        p = s->p1;
        !           304:        q = s->p2;
        !           305:        sign = 1;
        !           306:        if (class (p->ch)==5) { /* minus */
        !           307:                sign = -1;
        !           308:                if (p==q)
        !           309:                        return (0);
        !           310:                p = p->p1;
        !           311:        }
        !           312: loop:
        !           313:        m = p->ch - '0';
        !           314:        if (m>9 || m<0)
        !           315:                writes ("bad integer string");
        !           316:        n = n * 10 + m;
        !           317:        if (p==q)
        !           318:                return (n*sign);
        !           319:        p = p->p1;
        !           320:        goto loop;
        !           321: }
        !           322: 
        !           323: struct node *
        !           324: binstr (binary)
        !           325: {
        !           326:        int n, sign;
        !           327:        register struct node *m, *p, *q;
        !           328: 
        !           329:        n = binary;
        !           330:        p = salloc();
        !           331:        q = salloc();
        !           332:        sign = 1;
        !           333:        if (binary<0) {
        !           334:                sign = -1;
        !           335:                n = -binary;
        !           336:        }
        !           337:        p->p2 = q;
        !           338: loop:
        !           339:        q->ch = n%10+'0';
        !           340:        n = n / 10;
        !           341:        if (n==0) {
        !           342:                if (sign<0) {
        !           343:                        m = salloc();
        !           344:                        m->p1 = q;
        !           345:                        q = m;
        !           346:                        q->ch = '-';
        !           347:                }
        !           348:                p->p1 = q;
        !           349:                return (p);
        !           350:        }
        !           351:        m = salloc();
        !           352:        m->p1 = q;
        !           353:        q = m;
        !           354:        goto loop;
        !           355: }
        !           356: 
        !           357: struct node *
        !           358: add (string1, string2)
        !           359:        register struct node *string1, *string2;
        !           360: {
        !           361:        return (binstr (strbin (string1) + strbin (string2)));
        !           362: }
        !           363: 
        !           364: struct node *
        !           365: sub (string1, string2)
        !           366:        register struct node *string1, *string2;
        !           367: {
        !           368:        return (binstr (strbin (string1) - strbin (string2)));
        !           369: }
        !           370: 
        !           371: struct node *
        !           372: mult (string1, string2)
        !           373:        register struct node *string1, *string2;
        !           374: {
        !           375:        return (binstr (strbin (string1) * strbin (string2)));
        !           376: }
        !           377: 
        !           378: struct node *
        !           379: div (string1, string2)
        !           380:        register struct node *string1, *string2;
        !           381: {
        !           382:        return (binstr (strbin (string1) / strbin (string2)));
        !           383: }
        !           384: 
        !           385: struct node *
        !           386: cat (string1, string2) 
        !           387:        struct node *string1, *string2;
        !           388: {
        !           389:        register struct node *a, *b;
        !           390: 
        !           391:        if (string1==0)
        !           392:                return (copy (string2));
        !           393:        if (string2==0)
        !           394:                return (copy (string1));
        !           395:        a = copy (string1);
        !           396:        b = copy (string2);
        !           397:        a->p2->p1 = b->p1;
        !           398:        a->p2 = b->p2;
        !           399:        sfree (b);
        !           400:        return (a);
        !           401: }
        !           402: 
        !           403: struct node *
        !           404: dcat (a,b)
        !           405:        struct node *a, *b;
        !           406: {
        !           407:        register struct node *c;
        !           408: 
        !           409:        c = cat (a,b);
        !           410:        delete (a);
        !           411:        delete (b);
        !           412:        return (c);
        !           413: }
        !           414: 
        !           415: delete (string)
        !           416:        struct node *string;
        !           417: {
        !           418:        register struct node *a, *b, *c;
        !           419: 
        !           420:        if (string==0)
        !           421:                return;
        !           422:        a = string;
        !           423:        b = string->p2;
        !           424:        while (a != b) {
        !           425:                c = a->p1;
        !           426:                sfree (a);
        !           427:                a = c;
        !           428:        }
        !           429:        sfree (a);
        !           430: }
        !           431: 
        !           432: sysput (string)
        !           433:        struct node *string;
        !           434: {
        !           435:        syspot (string);
        !           436:        delete (string);
        !           437: }
        !           438: 
        !           439: dump()
        !           440: {
        !           441:        dump1 (namelist);
        !           442: }
        !           443: 
        !           444: dump1 (base)
        !           445:        struct node *base;
        !           446: {
        !           447:        register struct node *b, *c, *e;
        !           448:        struct node *d;
        !           449: 
        !           450:        while (base) {
        !           451:                b = base->p1;
        !           452:                c = binstr (b->typ);
        !           453:                d = strst1 ("  ");
        !           454:                e = dcat (c, d);
        !           455:                sysput (cat (e, b->p1));
        !           456:                delete (e);
        !           457:                if (b->typ==1) {
        !           458:                        c = strst1 ("   ");
        !           459:                        sysput (cat (c, b->p2));
        !           460:                        delete (c);
        !           461:                }
        !           462:                base = base->p2;
        !           463:        }
        !           464: }
        !           465: 
        !           466: writes (s)
        !           467:        char *s;
        !           468: {
        !           469:        sysput (dcat (binstr (lc),dcat (strst1 ("\t"),strst1 (s))));
        !           470:        fflush (stdout);
        !           471:        if (cfail) {
        !           472:                dump();
        !           473:                fflush (stdout);
        !           474:                exit (1);
        !           475:        }
        !           476:        while (sgetc());
        !           477:        while (compile());
        !           478:        fflush (stdout);
        !           479:        exit (1);
        !           480: }
        !           481: 
        !           482: struct node *
        !           483: sgetc()
        !           484: {
        !           485:        register struct node *a;
        !           486:        static struct node *line;
        !           487:        static linflg;
        !           488: 
        !           489:        while (line==0) {
        !           490:                line = syspit();
        !           491:                if (rfail) {
        !           492:                        cfail++;
        !           493:                        writes ("eof on input");
        !           494:                }
        !           495:                lc++;
        !           496:        }
        !           497:        if (linflg) {
        !           498:                line = 0;
        !           499:                linflg = 0;
        !           500:                return (0);
        !           501:        }
        !           502:        a = line->p1;
        !           503:        if (a==line->p2) {
        !           504:                sfree (line);
        !           505:                linflg++;
        !           506:        } else
        !           507:                line->p1 = a->p1;
        !           508:        return (a);
        !           509: }
        !           510: 
        !           511: ncinit (argc, argv)
        !           512:        int argc;
        !           513:        char *argv[];
        !           514: {
        !           515:        xargc = argc - 1;
        !           516:        xargv = argv + 1;
        !           517:        ncswitch();
        !           518: }
        !           519: 
        !           520: ncswitch()
        !           521: {
        !           522:        if (fin && fin != stdin)
        !           523:                fclose (fin);
        !           524:        if (xargc > 0) {
        !           525:                fin = fopen (*xargv, "r");
        !           526:                if (fin == NULL) {
        !           527:                        fputs ("Cannot open ", stdout);
        !           528:                        fputs (*xargv, stdout);
        !           529:                        putchar ('\n');
        !           530:                        exit (1);
        !           531:                }
        !           532:                xargv++;
        !           533:                xargc--;
        !           534:        } else
        !           535:                fin = stdin;
        !           536: }
        !           537: 
        !           538: char
        !           539: nextchar()
        !           540: {
        !           541:        register int a;
        !           542: 
        !           543:        a = getc (fin);
        !           544:        if (a == EOF) {
        !           545:                while (a == EOF && fin != stdin) {
        !           546:                        ncswitch();
        !           547:                        a = getc (fin);
        !           548:                }
        !           549:                if (a == EOF)
        !           550:                        a = 0;
        !           551:        }
        !           552:        return a;
        !           553: }

unix.superglobalmegacorp.com

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