Annotation of 43BSDTahoe/ucb/pascal/src/nl.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)nl.c       5.1 (Berkeley) 6/5/85";
        !             9: #endif not lint
        !            10: 
        !            11: 
        !            12: #include "whoami.h"
        !            13: #include "0.h"
        !            14: #ifdef PI
        !            15: #include "opcode.h"
        !            16: #include "objfmt.h"
        !            17: 
        !            18: /*
        !            19:  * NAMELIST SEGMENT DEFINITIONS
        !            20:  */
        !            21: struct nls {
        !            22:        struct nl *nls_low;
        !            23:        struct nl *nls_high;
        !            24: } ntab[MAXNL], *nlact;
        !            25: 
        !            26: struct nl nl[INL];
        !            27: struct nl *nlp = nl;
        !            28: struct nls *nlact = ntab;
        !            29: 
        !            30:     /*
        !            31:      * all these strings must be places where people can find them
        !            32:      * since lookup only looks at the string pointer, not the chars.
        !            33:      * see, for example, pTreeInit.
        !            34:      */
        !            35: 
        !            36:     /*
        !            37:      * built in constants
        !            38:      */
        !            39: char   *in_consts[] = {
        !            40:            "true" ,
        !            41:            "false" ,
        !            42:            "TRUE",
        !            43:            "FALSE",
        !            44:            "minint" ,
        !            45:            "maxint" ,
        !            46:            "minchar" ,
        !            47:            "maxchar" ,
        !            48:            "bell" ,
        !            49:            "tab" ,
        !            50:            0
        !            51:        };
        !            52: 
        !            53:     /*
        !            54:      * built in simple types
        !            55:      */
        !            56: char *in_types[] = 
        !            57:     {
        !            58:        "boolean",
        !            59:        "char",
        !            60:        "integer",
        !            61:        "real",
        !            62:        "_nil",         /* dummy name */
        !            63:        0
        !            64:     };
        !            65: 
        !            66: int in_rclasses[] =
        !            67:     {
        !            68:        TINT , 
        !            69:        TINT ,
        !            70:        TINT ,
        !            71:        TCHAR ,
        !            72:        TBOOL ,
        !            73:        TDOUBLE ,
        !            74:        0
        !            75:     };
        !            76: 
        !            77: long in_ranges[] =
        !            78:     {
        !            79:        -128L    , 127L ,
        !            80:        -32768L  , 32767L ,
        !            81:        -2147483648L , 2147483647L ,
        !            82:        0L               , 127L ,
        !            83:        0L               , 1L ,
        !            84:        0L               , 0L           /* fake for reals */
        !            85:     };
        !            86: 
        !            87:     /*
        !            88:      * built in constructed types
        !            89:      */
        !            90: char   *in_ctypes[] = {
        !            91:            "Boolean" ,
        !            92:            "intset" ,
        !            93:            "alfa" ,
        !            94:            "text" ,
        !            95:            0
        !            96:        };
        !            97: 
        !            98:     /*
        !            99:      * built in variables
        !           100:      */
        !           101: char   *in_vars[] = {
        !           102:            "input" ,
        !           103:            "output" ,
        !           104:            0
        !           105:        };
        !           106: 
        !           107:     /*
        !           108:      * built in functions 
        !           109:      */
        !           110: char *in_funcs[] =
        !           111:     {
        !           112:        "abs" ,
        !           113:        "arctan" ,
        !           114:        "card" ,
        !           115:        "chr" ,
        !           116:        "clock" ,
        !           117:        "cos" ,
        !           118:        "eof" ,
        !           119:        "eoln" ,
        !           120:        "eos" ,
        !           121:        "exp" ,
        !           122:        "expo" ,
        !           123:        "ln" ,
        !           124:        "odd" ,
        !           125:        "ord" ,
        !           126:        "pred" ,
        !           127:        "round" ,
        !           128:        "sin" ,
        !           129:        "sqr" ,
        !           130:        "sqrt" ,
        !           131:        "succ" ,
        !           132:        "trunc" ,
        !           133:        "undefined" ,
        !           134:        /*
        !           135:         * Extensions
        !           136:         */
        !           137:        "argc" ,
        !           138:        "random" ,
        !           139:        "seed" ,
        !           140:        "wallclock" ,
        !           141:        "sysclock" ,
        !           142:        0
        !           143:     };
        !           144: 
        !           145:        /*
        !           146:         * Built-in procedures
        !           147:         */
        !           148: char *in_procs[] =
        !           149:     {
        !           150:        "assert",
        !           151:        "date" ,
        !           152:        "dispose" ,
        !           153:        "flush" ,
        !           154:        "get" ,
        !           155:        "getseg" ,
        !           156:        "halt" ,
        !           157:        "linelimit" ,
        !           158:        "message" ,
        !           159:        "new" ,
        !           160:        "pack" ,
        !           161:        "page" ,
        !           162:        "put" ,
        !           163:        "putseg" ,
        !           164:        "read" ,
        !           165:        "readln" ,
        !           166:        "remove" ,
        !           167:        "reset" ,
        !           168:        "rewrite" ,
        !           169:        "time" ,
        !           170:        "unpack" ,
        !           171:        "write" ,
        !           172:        "writeln" ,
        !           173:        /*
        !           174:         * Extensions
        !           175:         */
        !           176:        "argv" ,
        !           177:        "null" ,
        !           178:        "stlimit" ,
        !           179:        0
        !           180:     };
        !           181: 
        !           182: #ifndef PI0
        !           183:     /*
        !           184:      * and their opcodes
        !           185:      */
        !           186: int in_fops[] =
        !           187:     {
        !           188:        O_ABS2,
        !           189:        O_ATAN,
        !           190:        O_CARD|NSTAND,
        !           191:        O_CHR2,
        !           192:        O_CLCK|NSTAND,
        !           193:        O_COS,
        !           194:        O_EOF,
        !           195:        O_EOLN,
        !           196:        0,
        !           197:        O_EXP,
        !           198:        O_EXPO|NSTAND,
        !           199:        O_LN,
        !           200:        O_ODD2,
        !           201:        O_ORD2,
        !           202:        O_PRED2,
        !           203:        O_ROUND,
        !           204:        O_SIN,
        !           205:        O_SQR2,
        !           206:        O_SQRT,
        !           207:        O_SUCC2,
        !           208:        O_TRUNC,
        !           209:        O_UNDEF|NSTAND,
        !           210:        /*
        !           211:         * Extensions
        !           212:         */
        !           213:        O_ARGC|NSTAND,
        !           214:        O_RANDOM|NSTAND,
        !           215:        O_SEED|NSTAND,
        !           216:        O_WCLCK|NSTAND,
        !           217:        O_SCLCK|NSTAND
        !           218:     };
        !           219: 
        !           220:     /*
        !           221:      * Built-in procedures
        !           222:      */
        !           223: int in_pops[] =
        !           224:     {
        !           225:        O_ASRT|NSTAND,
        !           226:        O_DATE|NSTAND,
        !           227:        O_DISPOSE,
        !           228:        O_FLUSH|NSTAND,
        !           229:        O_GET,
        !           230:        0,
        !           231:        O_HALT|NSTAND,
        !           232:        O_LLIMIT|NSTAND,
        !           233:        O_MESSAGE|NSTAND,
        !           234:        O_NEW,
        !           235:        O_PACK,
        !           236:        O_PAGE,
        !           237:        O_PUT,
        !           238:        0,
        !           239:        O_READ4,
        !           240:        O_READLN,
        !           241:        O_REMOVE|NSTAND,
        !           242:        O_RESET,
        !           243:        O_REWRITE,
        !           244:        O_TIME|NSTAND,
        !           245:        O_UNPACK,
        !           246:        O_WRITEF,
        !           247:        O_WRITLN,
        !           248:        /*
        !           249:         * Extensions
        !           250:         */
        !           251:        O_ARGV|NSTAND,
        !           252:        O_ABORT|NSTAND,
        !           253:        O_STLIM|NSTAND
        !           254:     };
        !           255: #endif
        !           256: 
        !           257: /*
        !           258:  * Initnl initializes the first namelist segment and then
        !           259:  * initializes the name list for block 0.
        !           260:  */
        !           261: initnl()
        !           262:     {
        !           263:        register char           **cp;
        !           264:        register struct nl      *np;
        !           265:        struct nl               *fp;
        !           266:        int                     *ip;
        !           267:        long                    *lp;
        !           268: 
        !           269: #ifdef DEBUG
        !           270:        if ( hp21mx )
        !           271:            {
        !           272:                MININT = -32768.;
        !           273:                MAXINT = 32767.;
        !           274: #ifndef        PI0
        !           275: #ifdef OBJ
        !           276:                genmx();
        !           277: #endif OBJ
        !           278: #endif
        !           279:            }
        !           280: #endif
        !           281:        ntab[0].nls_low = nl;
        !           282:        ntab[0].nls_high = &nl[INL];
        !           283:        (void) defnl ( (char *) 0 , 0 , NLNIL , 0 );
        !           284: 
        !           285:        /*
        !           286:         *      Types
        !           287:         */
        !           288:        for ( cp = in_types ; *cp != 0 ; cp ++ )
        !           289:            (void) hdefnl ( *cp , TYPE , nlp , 0 );
        !           290: 
        !           291:        /*
        !           292:         *      Ranges
        !           293:         */
        !           294:        lp = in_ranges;
        !           295:        for ( ip = in_rclasses ; *ip != 0 ; ip ++ )
        !           296:            {
        !           297:                np = defnl ( (char *) 0 , RANGE , nl+(*ip) , 0 );
        !           298:                nl[*ip].type = np;
        !           299:                np -> range[0] = *lp ++ ;
        !           300:                np -> range[1] = *lp ++ ;
        !           301:        
        !           302:            };
        !           303: 
        !           304:        /*
        !           305:         *      built in constructed types
        !           306:         */
        !           307:        
        !           308:        cp = in_ctypes;
        !           309:        /*
        !           310:         *      Boolean = boolean;
        !           311:         */
        !           312:        (void) hdefnl ( *cp++ , TYPE , (struct nl *) (nl+T1BOOL) , 0 );
        !           313: 
        !           314:        /*
        !           315:         *      intset = set of 0 .. 127;
        !           316:         */
        !           317:        intset = ((struct nl *) *cp++);
        !           318:        (void) hdefnl( (char *) intset , TYPE , nlp+1 , 0 );
        !           319:        (void) defnl ( (char *) 0 , SET , nlp+1 , 0 );
        !           320:        np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
        !           321:        np -> range[0] = 0L;
        !           322:        np -> range[1] = 127L;
        !           323: 
        !           324:        /*
        !           325:         *      alfa = array [ 1 .. 10 ] of char;
        !           326:         */
        !           327:        np = defnl ( (char *) 0 , RANGE , nl+TINT , 0 );
        !           328:        np -> range[0] = 1L;
        !           329:        np -> range[1] = 10L;
        !           330:        defnl ( (char *) 0 , ARRAY , nl+T1CHAR , 1 ) -> chain = np;
        !           331:        (void) hdefnl ( *cp++ , TYPE , nlp-1 , 0 );
        !           332: 
        !           333:        /*
        !           334:         *      text = file of char;
        !           335:         */
        !           336:        (void) hdefnl ( *cp++ , TYPE , nlp+1 , 0 );
        !           337:        np = defnl ( (char *) 0 , FILET , nl+T1CHAR , 0 );
        !           338:        np -> nl_flags |= NFILES;
        !           339: 
        !           340:        /*
        !           341:         *      input,output : text;
        !           342:         */
        !           343:        cp = in_vars;
        !           344: #      ifndef  PI0
        !           345:                input = hdefnl ( *cp++ , VAR , np , INPUT_OFF );
        !           346:                output = hdefnl (  *cp++ , VAR , np , OUTPUT_OFF );
        !           347: #      else
        !           348:                input = hdefnl ( *cp++ , VAR , np , 0 );
        !           349:                output = hdefnl ( *cp++ , VAR , np , 0 );
        !           350: #      endif
        !           351: #      ifdef PC
        !           352:            input -> extra_flags |= NGLOBAL;
        !           353:            output -> extra_flags |= NGLOBAL;
        !           354: #      endif PC
        !           355: 
        !           356:        /*
        !           357:         *      built in constants
        !           358:         */
        !           359:        cp = in_consts;
        !           360:        np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
        !           361:        fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
        !           362:        (nl + TBOOL)->chain = fp;
        !           363:        fp->chain = np;
        !           364:        np = hdefnl ( *cp++ , CONST , nl + TBOOL , 1 );
        !           365:        fp = hdefnl ( *cp++ , CONST , nl + TBOOL , 0 );
        !           366:        fp->chain = np;
        !           367:        if (opt('s'))
        !           368:                (nl + TBOOL)->chain = fp;
        !           369:        hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MININT;
        !           370:        hdefnl ( *cp++ , CONST , nl + T4INT , 0 ) -> range[0] = MAXINT;
        !           371:        (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 0 );
        !           372:        (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , 127 );
        !           373:        (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\007' );
        !           374:        (void) hdefnl ( *cp++ , CONST , nl + T1CHAR , '\t' );
        !           375: 
        !           376:        /*
        !           377:         * Built-in functions and procedures
        !           378:         */
        !           379: #ifndef PI0
        !           380:        ip = in_fops;
        !           381:        for ( cp = in_funcs ; *cp != 0 ; cp ++ )
        !           382:            (void) hdefnl ( *cp , FUNC , NLNIL , * ip ++ );
        !           383:        ip = in_pops;
        !           384:        for ( cp = in_procs ; *cp != 0 ; cp ++ )
        !           385:            (void) hdefnl ( *cp , PROC , NLNIL , * ip ++ );
        !           386: #else
        !           387:        for ( cp = in_funcs ; *cp != 0 ; cp ++ )
        !           388:            (void) hdefnl ( *cp , FUNC , NLNIL , 0 );
        !           389:        for ( cp = in_procs ; *cp != 0 , cp ++ )
        !           390:            (void) hdefnl ( *cp , PROC , NLNIL , 0 );
        !           391: #endif
        !           392: #      ifdef PTREE
        !           393:            pTreeInit();
        !           394: #      endif
        !           395:     }
        !           396: 
        !           397: struct nl *
        !           398: hdefnl(sym, cls, typ, val)
        !           399:     char *sym;
        !           400:     int  cls;
        !           401:     struct nl *typ;
        !           402:     int val;
        !           403: {
        !           404:        register struct nl *p;
        !           405: 
        !           406: #ifndef PI1
        !           407:        if (sym)
        !           408:                (void) hash(sym, 0);
        !           409: #endif
        !           410:        p = defnl(sym, cls, typ, val);
        !           411:        if (sym)
        !           412:                (void) enter(p);
        !           413:        return (p);
        !           414: }
        !           415: 
        !           416: /*
        !           417:  * Free up the name list segments
        !           418:  * at the end of a statement/proc/func
        !           419:  * All segments are freed down to the one in which
        !           420:  * p points.
        !           421:  */
        !           422: nlfree(p)
        !           423:        struct nl *p;
        !           424: {
        !           425: 
        !           426:        nlp = p;
        !           427:        while (nlact->nls_low > nlp || nlact->nls_high < nlp) {
        !           428:                free((char *) nlact->nls_low);
        !           429:                nlact->nls_low = NIL;
        !           430:                nlact->nls_high = NIL;
        !           431:                --nlact;
        !           432:                if (nlact < &ntab[0])
        !           433:                        panic("nlfree");
        !           434:        }
        !           435: }
        !           436: #endif PI
        !           437: 
        !           438: 
        !           439: #ifndef PC
        !           440: #ifndef OBJ
        !           441: char   *VARIABLE       = "variable";
        !           442: #endif PC
        !           443: #endif OBJ
        !           444: 
        !           445: char   *classes[ ] = {
        !           446:        "undefined",
        !           447:        "constant",
        !           448:        "type",
        !           449:        "variable",     /*      VARIABLE        */
        !           450:        "array",
        !           451:        "pointer or file",
        !           452:        "record",
        !           453:        "field",
        !           454:        "procedure",
        !           455:        "function",
        !           456:        "variable",     /*      VARIABLE        */
        !           457:        "variable",     /*      VARIABLE        */
        !           458:        "pointer",
        !           459:        "file",
        !           460:        "set",
        !           461:        "subrange",
        !           462:        "label",
        !           463:        "withptr",
        !           464:        "scalar",
        !           465:        "string",
        !           466:        "program",
        !           467:        "improper",
        !           468:        "variant",
        !           469:        "formal procedure",
        !           470:        "formal function"
        !           471: };
        !           472: 
        !           473: #ifndef PC
        !           474: #ifndef OBJ
        !           475: char   *snark  = "SNARK";
        !           476: #endif
        !           477: #endif
        !           478: 
        !           479: #ifdef PI
        !           480: #ifdef DEBUG
        !           481: char   *ctext[] =
        !           482: {
        !           483:        "BADUSE",
        !           484:        "CONST",
        !           485:        "TYPE",
        !           486:        "VAR",
        !           487:        "ARRAY",
        !           488:        "PTRFILE",
        !           489:        "RECORD",
        !           490:        "FIELD",
        !           491:        "PROC",
        !           492:        "FUNC",
        !           493:        "FVAR",
        !           494:        "REF",
        !           495:        "PTR",
        !           496:        "FILET",
        !           497:        "SET",
        !           498:        "RANGE",
        !           499:        "LABEL",
        !           500:        "WITHPTR",
        !           501:        "SCAL",
        !           502:        "STR",
        !           503:        "PROG",
        !           504:        "IMPROPER",
        !           505:        "VARNT",
        !           506:        "FPROC",
        !           507:        "FFUNC",
        !           508:        "CRANGE"
        !           509: };
        !           510: 
        !           511: char   *stars  = "\t***";
        !           512: 
        !           513: /*
        !           514:  * Dump the namelist from the
        !           515:  * current nlp down to 'to'.
        !           516:  * All the namelist is dumped if
        !           517:  * to is NIL.
        !           518:  */
        !           519: /*VARARGS*/
        !           520: dumpnl(to, rout)
        !           521:        struct nl *to;
        !           522: {
        !           523:        register struct nl *p;
        !           524:        struct nls *nlsp;
        !           525:        int v, head;
        !           526: 
        !           527:        if (opt('y') == 0)
        !           528:                return;
        !           529:        if (to != NIL)
        !           530:                printf("\n\"%s\" Block=%d\n", rout, cbn);
        !           531:        nlsp = nlact;
        !           532:        head = NIL;
        !           533:        for (p = nlp; p != to;) {
        !           534:                if (p == nlsp->nls_low) {
        !           535:                        if (nlsp == &ntab[0])
        !           536:                                break;
        !           537:                        nlsp--;
        !           538:                        p = nlsp->nls_high;
        !           539:                }
        !           540:                p--;
        !           541:                if (head == NIL) {
        !           542:                        printf("\tName\tClass  Bn+Flags\tType\tVal\tChn\n");
        !           543:                        head++;
        !           544:                }
        !           545:                printf("%3d:", nloff(p));
        !           546:                if (p->symbol)
        !           547:                        printf("\t%.7s", p->symbol);
        !           548:                else
        !           549:                        printf(stars);
        !           550:                if (p->class)
        !           551:                        printf("\t%s", ctext[p->class]);
        !           552:                else
        !           553:                        printf(stars);
        !           554:                if (p->nl_flags) {
        !           555:                        pchr('\t');
        !           556:                        if (p->nl_flags & 037)
        !           557:                                printf("%d ", p->nl_flags & 037);
        !           558: #ifndef PI0
        !           559:                        if (p->nl_flags & NMOD)
        !           560:                                pchr('M');
        !           561:                        if (p->nl_flags & NUSED)
        !           562:                                pchr('U');
        !           563: #endif
        !           564:                        if (p->nl_flags & NFILES)
        !           565:                                pchr('F');
        !           566:                } else
        !           567:                        printf(stars);
        !           568:                if (p->type)
        !           569:                        printf("\t[%d]", nloff(p->type));
        !           570:                else
        !           571:                        printf(stars);
        !           572:                v = p->value[0];
        !           573:                switch (p->class) {
        !           574:                        case TYPE:
        !           575:                                break;
        !           576:                        case VARNT:
        !           577:                                goto con;
        !           578:                        case CONST:
        !           579:                                switch (nloff(p->type)) {
        !           580:                                        default:
        !           581:                                                printf("\t%d", v);
        !           582:                                                break;
        !           583:                                        case TDOUBLE:
        !           584:                                                printf("\t%f", p->real);
        !           585:                                                break;
        !           586:                                        case TINT:
        !           587:                                        case T4INT:
        !           588: con:
        !           589:                                                printf("\t%ld", p->range[0]);
        !           590:                                                break;
        !           591:                                        case TSTR:
        !           592:                                                printf("\t'%s'", p->ptr[0]);
        !           593:                                                break;
        !           594:                                        }
        !           595:                                break;
        !           596:                        case VAR:
        !           597:                        case REF:
        !           598:                        case WITHPTR:
        !           599:                        case FFUNC:
        !           600:                        case FPROC:
        !           601:                                printf("\t%d,%d", cbn, v);
        !           602:                                break;
        !           603:                        case SCAL:
        !           604:                        case RANGE:
        !           605:                                printf("\t%ld..%ld", p->range[0], p->range[1]);
        !           606:                                break;
        !           607:                        case CRANGE:
        !           608:                                printf("\t%s..%s", p->nptr[0]->symbol,
        !           609:                                        p->nptr[1]->symbol);
        !           610:                                break;
        !           611:                        case RECORD:
        !           612:                                printf("\t%d", v);
        !           613:                                break;
        !           614:                        case FIELD:
        !           615:                                printf("\t%d", v);
        !           616:                                break;
        !           617:                        case STR:
        !           618:                                printf("\t|%d|", p->value[0]);
        !           619:                                break;
        !           620:                        case FVAR:
        !           621:                        case FUNC:
        !           622:                        case PROC:
        !           623:                        case PROG:
        !           624:                                if (cbn == 0) {
        !           625:                                        printf("\t<%o>", p->value[0] & 0377);
        !           626: #ifndef PI0
        !           627:                                        if (p->value[0] & NSTAND)
        !           628:                                                printf("\tNSTAND");
        !           629: #endif
        !           630:                                        break;
        !           631:                                }
        !           632:                                v = p->value[1];
        !           633:                        default:
        !           634: 
        !           635:                                if (v)
        !           636:                                        printf("\t<%d>", v);
        !           637:                                else
        !           638:                                        printf(stars);
        !           639:                }
        !           640:                if (p->chain)
        !           641:                        printf("\t[%d]", nloff(p->chain));
        !           642:                switch (p->class) {
        !           643:                        case RECORD:
        !           644:                                printf("\tALIGN=%d", p->align_info);
        !           645:                                if (p->ptr[NL_FIELDLIST]) {
        !           646:                                    printf(" FLIST=[%d]",
        !           647:                                        nloff(p->ptr[NL_FIELDLIST]));
        !           648:                                } else {
        !           649:                                    printf(" FLIST=[]");
        !           650:                                }
        !           651:                                if (p->ptr[NL_TAG]) {
        !           652:                                    printf(" TAG=[%d]",
        !           653:                                        nloff(p->ptr[NL_TAG]));
        !           654:                                } else {
        !           655:                                    printf(" TAG=[]");
        !           656:                                }
        !           657:                                if (p->ptr[NL_VARNT]) {
        !           658:                                    printf(" VARNT=[%d]",
        !           659:                                        nloff(p->ptr[NL_VARNT]));
        !           660:                                } else {
        !           661:                                    printf(" VARNT=[]");
        !           662:                                }
        !           663:                                break;
        !           664:                        case FIELD:
        !           665:                                if (p->ptr[NL_FIELDLIST]) {
        !           666:                                    printf("\tFLIST=[%d]",
        !           667:                                        nloff(p->ptr[NL_FIELDLIST]));
        !           668:                                } else {
        !           669:                                    printf("\tFLIST=[]");
        !           670:                                }
        !           671:                                break;
        !           672:                        case VARNT:
        !           673:                                printf("\tVTOREC=[%d]",
        !           674:                                    nloff(p->ptr[NL_VTOREC]));
        !           675:                                break;
        !           676:                }
        !           677: #              ifdef PC
        !           678:                    if ( p -> extra_flags != 0 ) {
        !           679:                        pchr( '\t' );
        !           680:                        if ( p -> extra_flags & NEXTERN )
        !           681:                            printf( "NEXTERN " );
        !           682:                        if ( p -> extra_flags & NLOCAL )
        !           683:                            printf( "NLOCAL " );
        !           684:                        if ( p -> extra_flags & NPARAM )
        !           685:                            printf( "NPARAM " );
        !           686:                        if ( p -> extra_flags & NGLOBAL )
        !           687:                            printf( "NGLOBAL " );
        !           688:                        if ( p -> extra_flags & NREGVAR )
        !           689:                            printf( "NREGVAR " );
        !           690:                    }
        !           691: #              endif PC
        !           692: #              ifdef PTREE
        !           693:                    pchr( '\t' );
        !           694:                    pPrintPointer( stdout , "%s" , p -> inTree );
        !           695: #              endif
        !           696:                pchr('\n');
        !           697:        }
        !           698:        if (head == 0)
        !           699:                printf("\tNo entries\n");
        !           700: }
        !           701: #endif
        !           702: 
        !           703: 
        !           704: /*
        !           705:  * Define a new name list entry
        !           706:  * with initial symbol, class, type
        !           707:  * and value[0] as given.  A new name
        !           708:  * list segment is allocated to hold
        !           709:  * the next name list slot if necessary.
        !           710:  */
        !           711: struct nl *
        !           712: defnl(sym, cls, typ, val)
        !           713:        char *sym;
        !           714:        int cls;
        !           715:        struct nl *typ;
        !           716:        int val;
        !           717: {
        !           718:        register struct nl *p;
        !           719:        register int *q, i;
        !           720:        char *cp;
        !           721: 
        !           722:        p = nlp;
        !           723: 
        !           724:        /*
        !           725:         * Zero out this entry
        !           726:         */
        !           727:        q = ((int *) p);
        !           728:        i = (sizeof *p)/(sizeof (int));
        !           729:        do
        !           730:                *q++ = 0;
        !           731:        while (--i);
        !           732: 
        !           733:        /*
        !           734:         * Insert the values
        !           735:         */
        !           736:        p->symbol = sym;
        !           737:        p->class = cls;
        !           738:        p->type = typ;
        !           739:        p->nl_block = cbn;
        !           740:        p->value[0] = val;
        !           741: 
        !           742:        /*
        !           743:         * Insure that the next namelist
        !           744:         * entry actually exists. This is
        !           745:         * really not needed here, it would
        !           746:         * suffice to do it at entry if we
        !           747:         * need the slot.  It is done this
        !           748:         * way because, historically, nlp
        !           749:         * always pointed at the next namelist
        !           750:         * slot.
        !           751:         */
        !           752:        nlp++;
        !           753:        if (nlp >= nlact->nls_high) {
        !           754:                i = NLINC;
        !           755:                cp = (char *) malloc(NLINC * sizeof *nlp);
        !           756:                if (cp == 0) {
        !           757:                        i = NLINC / 2;
        !           758:                        cp = (char *) malloc((NLINC / 2) * sizeof *nlp);
        !           759:                }
        !           760:                if (cp == 0) {
        !           761:                        error("Ran out of memory (defnl)");
        !           762:                        pexit(DIED);
        !           763:                }
        !           764:                nlact++;
        !           765:                if (nlact >= &ntab[MAXNL]) {
        !           766:                        error("Ran out of name list tables");
        !           767:                        pexit(DIED);
        !           768:                }
        !           769:                nlp = (struct nl *) cp;
        !           770:                nlact->nls_low = nlp;
        !           771:                nlact->nls_high = nlact->nls_low + i;
        !           772:        }
        !           773:        return (p);
        !           774: }
        !           775: 
        !           776: /*
        !           777:  * Make a duplicate of the argument
        !           778:  * namelist entry for, e.g., type
        !           779:  * declarations of the form 'type a = b'
        !           780:  * and array indicies.
        !           781:  */
        !           782: struct nl *
        !           783: nlcopy(p)
        !           784:        struct nl *p;
        !           785: {
        !           786:        register struct nl *p1, *p2;
        !           787: 
        !           788:        p1 = p;
        !           789:        p2 = defnl((char *) 0, 0, NLNIL, 0);
        !           790:        *p2 = *p1;
        !           791:        p2->chain = NLNIL;
        !           792:        return (p2);
        !           793: }
        !           794: 
        !           795: /*
        !           796:  * Compute a namelist offset
        !           797:  */
        !           798: nloff(p)
        !           799:        struct nl *p;
        !           800: {
        !           801: 
        !           802:        return (p - nl);
        !           803: }
        !           804: 
        !           805: /*
        !           806:  * Enter a symbol into the block
        !           807:  * symbol table.  Symbols are hashed
        !           808:  * 64 ways based on low 6 bits of the
        !           809:  * character pointer into the string
        !           810:  * table.
        !           811:  */
        !           812: struct nl *
        !           813: enter(np)
        !           814:        struct nl *np;
        !           815: {
        !           816:        register struct nl *rp, *hp;
        !           817:        register struct nl *p;
        !           818:        int i;
        !           819: 
        !           820:        rp = np;
        !           821:        if (rp == NIL)
        !           822:                return (NIL);
        !           823: #ifndef PI1
        !           824:        if (cbn > 0)
        !           825:                if (rp->symbol == input->symbol || rp->symbol == output->symbol)
        !           826:                        error("Pre-defined files input and output must not be redefined");
        !           827: #endif
        !           828:        i = (int) rp->symbol;
        !           829:        i &= 077;
        !           830:        hp = disptab[i];
        !           831:        if (rp->class != BADUSE && rp->class != FIELD)
        !           832:        for (p = hp; p != NIL && (p->nl_block & 037) == cbn; p = p->nl_next)
        !           833:                if (p->symbol == rp->symbol && p->symbol != NIL &&
        !           834:                    p->class != BADUSE && p->class != FIELD) {
        !           835: #ifndef PI1
        !           836:                        error("%s is already defined in this block", rp->symbol);
        !           837: #endif
        !           838:                        break;
        !           839: 
        !           840:                }
        !           841:        rp->nl_next = hp;
        !           842:        disptab[i] = rp;
        !           843:        return (rp);
        !           844: }
        !           845: #endif

unix.superglobalmegacorp.com

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