Annotation of researchv8dc/cmd/sh/name.c, revision 1.1.1.1

1.1       root        1: /*     @(#)name.c      1.5     */
                      2: /*
                      3:  * UNIX shell
                      4:  *
                      5:  * Bell Telephone Laboratories
                      6:  *
                      7:  */
                      8: 
                      9: #include       "defs.h"
                     10: #include       "sym.h"
                     11: 
                     12: extern BOOL    chkid();
                     13: extern char    *simple();
                     14: 
                     15: struct namnod ps2nod =
                     16: {
                     17:        (struct namnod *)NIL,
                     18:        &acctnod,
                     19:        ps2name
                     20: };
                     21: struct namnod cdpnod = 
                     22: {
                     23:        (struct namnod *)NIL,
                     24:        (struct namnod *)NIL,
                     25:        cdpname
                     26: };
                     27: struct namnod ifsnod =
                     28: {
                     29:        (struct namnod *)NIL,
                     30:        (struct namnod *)NIL,
                     31:        ifsname
                     32: };
                     33: struct namnod ps1nod =
                     34: {
                     35:        &pathnod,
                     36:        &ps2nod,
                     37:        ps1name
                     38: };
                     39: struct namnod histnod =
                     40: {
                     41:        &cdpnod,
                     42:        (struct namnod *)NIL,
                     43:        histname
                     44: };
                     45: struct namnod homenod =
                     46: {
                     47:        &histnod,
                     48:        &ifsnod,
                     49:        homename
                     50: };
                     51: struct namnod pathnod =
                     52: {
                     53:        (struct namnod *)NIL,
                     54:        (struct namnod *)NIL,
                     55:        pathname
                     56: };
                     57: struct namnod mailnod =
                     58: {
                     59:        &homenod,
                     60:        &ps1nod,
                     61:        mailname
                     62: };
                     63: struct namnod acctnod =
                     64: {
                     65:        (struct namnod *)NIL,
                     66:        (struct namnod *)NIL,
                     67:        acctname
                     68: };     
                     69: struct namnod *namep = &mailnod;
                     70: 
                     71: /* ========    variable and string handling    ======== */
                     72: 
                     73: syslook(w, syswds, n)
                     74:        register char *w;
                     75:        register struct sysnod syswds[];
                     76:        int n;
                     77: {
                     78:        int     low;
                     79:        int     high;
                     80:        int     mid;
                     81:        register int cond;
                     82: 
                     83:        if (w == 0 || *w == 0)
                     84:                return(0);
                     85: 
                     86:        low = 0;
                     87:        high = n - 1;
                     88: 
                     89:        while (low <= high)
                     90:        {
                     91:                mid = (low + high) / 2;
                     92: 
                     93:                if ((cond = cf(w, syswds[mid].sysnam)) < 0)
                     94:                        high = mid - 1;
                     95:                else if (cond > 0)
                     96:                        low = mid + 1;
                     97:                else
                     98:                        return(syswds[mid].sysval);
                     99:        }
                    100:        return(0);
                    101: }
                    102: 
                    103: setlist(arg, xp)
                    104: register struct argnod *arg;
                    105: int    xp;
                    106: {
                    107:        if (flags & exportflg)
                    108:                xp |= N_EXPORT;
                    109: 
                    110:        while (arg)
                    111:        {
                    112:                register char *s = mactrim(arg->argval);
                    113:                setname(s, xp);
                    114:                arg = arg->argnxt;
                    115:                if (flags & execpr)
                    116:                {
                    117:                        prs(s);
                    118:                        if (arg)
                    119:                                blank();
                    120:                        else
                    121:                                newline();
                    122:                }
                    123:        }
                    124: }
                    125: 
                    126: 
                    127: setname(argi, xp)      /* does parameter assignments */
                    128: char   *argi;
                    129: int    xp;
                    130: {
                    131:        register char *argscan = argi;
                    132:        register struct namnod *n;
                    133: 
                    134:        while(!ctrlchar(*argscan))
                    135:        {
                    136:                if (*argscan == '=')
                    137:                {
                    138:                        *argscan = 0;   /* make name a cohesive string */
                    139: 
                    140:                        n = lookup(argi);
                    141:                        *argscan++ = '=';
                    142:                        attrib(n, xp);
                    143:                        if (xp & N_ENVNAM)
                    144:                                n->namenv.val = n->namval.val = argscan;
                    145:                        else
                    146:                                assign(n, argscan);
                    147:                        return;
                    148:                }
                    149:                if ((xp & N_ENVNAM) && *argscan == '(')
                    150:                {
                    151:                        /*
                    152:                         * flags==0 when we are called, so flags&ttyflg==0, so
                    153:                         * if there's an error we will exit
                    154:                         */
                    155:                        execexp(argi, 0);
                    156:                        *argscan = 0;
                    157:                        n = lookup(argi);
                    158:                        attrib(n, xp);
                    159:                        return;
                    160:                }
                    161:                argscan++;
                    162:        }
                    163:        failed(argi, notid);
                    164: }
                    165: 
                    166: replace(a, v)
                    167: register char  **a;
                    168: char   *v;
                    169: {
                    170:        free(*a);
                    171:        *a = make(v);
                    172: }
                    173: 
                    174: dfault(n, v)
                    175: struct namnod *n;
                    176: char   *v;
                    177: {
                    178:        if (n->namval.val == 0)
                    179:                assign(n, v);
                    180: }
                    181: 
                    182: assign(n, v)
                    183: struct namnod *n;
                    184: char   *v;
                    185: {
                    186:        if (!(n->namflg & N_ENVNAM))
                    187:                free_val(&n->namval);
                    188:        else
                    189:                n->namflg &= ~N_ENVNAM;
                    190: 
                    191:        n->namval.val = make(v);
                    192:        n->namval.flg = N_VAR;
                    193: 
                    194:        if (flags & prompt)
                    195:                if (n == &mailnod)
                    196:                        setmail(n->namval.val);
                    197: }
                    198: 
                    199: readvar(names)
                    200: char   **names;
                    201: {
                    202:        struct fileblk  fb;
                    203:        register struct fileblk *f = &fb;
                    204:        register char   c;
                    205:        register int    rc = 0;
                    206:        struct namnod *n = lookup(*names++);    /* done now to avoid storage mess */
                    207:        char    *rel = (char *)relstak();
                    208: 
                    209:        push(f);
                    210:        initf(dup(0));
                    211: 
                    212:        if (lseek(0, 0L, 1) == -1)
                    213:                f->fsiz = 1;
                    214: 
                    215:        /*
                    216:         * strip leading IFS characters
                    217:         */
                    218:        while ((any((c = nextc(0)), ifsnod.namval.val)) && !(eolchar(c)))
                    219:                        ;
                    220:        for (;;)
                    221:        {
                    222:                if ((*names && any(c, ifsnod.namval.val)) || eolchar(c))
                    223:                {
                    224:                        zerostak();
                    225:                        assign(n, absstak(rel));
                    226:                        setstak(rel);
                    227:                        if (*names)
                    228:                                n = lookup(*names++);
                    229:                        else
                    230:                                n = 0;
                    231:                        if (eolchar(c))
                    232:                        {
                    233:                                break;
                    234:                        }
                    235:                        else            /* strip imbedded IFS characters */
                    236:                        {
                    237:                                while ((any((c = nextc(0)), ifsnod.namval.val)) &&
                    238:                                        !(eolchar(c)))
                    239:                                        ;
                    240:                        }
                    241:                }
                    242:                else
                    243:                {
                    244:                        pushstak(c);
                    245:                        c = nextc(0);
                    246: 
                    247:                        if (eolchar(c))
                    248:                        {
                    249:                                char *top = staktop;
                    250:                        
                    251:                                while (any(*(--top), ifsnod.namval.val))
                    252:                                        ;
                    253:                                staktop = top + 1;
                    254:                        }
                    255: 
                    256: 
                    257:                }
                    258:        }
                    259:        while (n)
                    260:        {
                    261:                assign(n, nullstr);
                    262:                if (*names)
                    263:                        n = lookup(*names++);
                    264:                else
                    265:                        n = 0;
                    266:        }
                    267: 
                    268:        if (eof)
                    269:                rc = 1;
                    270:        lseek(0, (long)(f->fnxt - f->fend), 1);
                    271:        pop();
                    272:        return(rc);
                    273: }
                    274: 
                    275: assnum(p, i)
                    276: char   **p;
                    277: int    i;
                    278: {
                    279:        itos(i);
                    280:        replace(p, numbuf);
                    281: }
                    282: 
                    283: char *
                    284: make(v)
                    285: char   *v;
                    286: {
                    287:        register char   *p;
                    288: 
                    289:        if (v)
                    290:        {
                    291:                movstr(v, p = alloc(length(v)));
                    292:                return(p);
                    293:        }
                    294:        else
                    295:                return(0);
                    296: }
                    297: 
                    298: 
                    299: struct namnod *
                    300: lookup(nam)
                    301:        register char   *nam;
                    302: {
                    303:        register struct namnod *nscan = namep;
                    304:        register struct namnod **prev;
                    305:        int             LR;
                    306: 
                    307:        if (!chkid(nam))
                    308:                failed(nam, notid);
                    309:        while (nscan)
                    310:        {
                    311:                if ((LR = cf(nam, nscan->namid)) == 0)
                    312:                        return(nscan);
                    313: 
                    314:                else if (LR < 0)
                    315:                        prev = &(nscan->namlft);
                    316:                else
                    317:                        prev = &(nscan->namrgt);
                    318:                nscan = *prev;
                    319:        }
                    320:        /*
                    321:         * add name node
                    322:         */
                    323:        nscan = (struct namnod *)alloc(sizeof *nscan);
                    324:        nscan->namlft = nscan->namrgt = (struct namnod *)NIL;
                    325:        nscan->namid = make(nam);
                    326:        nscan->namval.val = 0;
                    327:        nscan->namval.flg = N_VAR;
                    328:        nscan->namenv.val = 0;
                    329:        nscan->namenv.flg = N_VAR;
                    330:        nscan->namflg = N_DEFAULT;
                    331: 
                    332:        return(*prev = nscan);
                    333: }
                    334: 
                    335: BOOL
                    336: chkid(nam)
                    337: register char  *nam;
                    338: {
                    339:        while(!ctrlchar(*nam) && (*nam&QUOTE)==0 && *nam!='(' && *nam!='=')
                    340:                nam++;
                    341:        return *nam==0;
                    342: }
                    343: 
                    344: static int (*namfn)();
                    345: namscan(fn)
                    346:        int     (*fn)();
                    347: {
                    348:        namfn = fn;
                    349:        namwalk(namep);
                    350: }
                    351: 
                    352: static int
                    353: namwalk(np)
                    354: register struct namnod *np;
                    355: {
                    356:        if (np)
                    357:        {
                    358:                namwalk(np->namlft);
                    359:                (*namfn)(np);
                    360:                namwalk(np->namrgt);
                    361:        }
                    362: }
                    363: 
                    364: printnam(n)
                    365: struct namnod *n;
                    366: {
                    367:        register char   *s;
                    368: 
                    369:        sigchk();
                    370: 
                    371:        if (n->namval.flg & N_FUNCTN) {
                    372:                prs_buff(strf(n));
                    373:                prc_buff(NL);
                    374:        }
                    375:        else if (s = n->namval.val)
                    376:        {
                    377:                prs_buff(n->namid);
                    378:                prc_buff('=');
                    379:                prs_buff(quotedstring(s));
                    380:                prc_buff(NL);
                    381:        }
                    382: }
                    383: 
                    384: static char *
                    385: staknam(n)
                    386: register struct namnod *n;
                    387: {
                    388:        register char   *p;
                    389: 
                    390:        if (n->namval.flg & N_FUNCTN)
                    391:                p = movstr(strf(n), staktop);   /* XXX unnecessary; already at staktop */
                    392:        else
                    393:        {
                    394:                p = movstr(n->namid, staktop);
                    395:                p = movstr("=", p);
                    396:                p = movstr(n->namval.val, p);
                    397:        }
                    398:        return(getstak(p + 1 - (char *)(stakbot)));
                    399: }
                    400: 
                    401: static int namec;
                    402: 
                    403: exname(n)
                    404:        register struct namnod *n;
                    405: {
                    406:        register int    flg = n->namflg;
                    407: 
                    408:        if (!(flg & N_ENVNAM))
                    409:        {
                    410:                n->namflg |= N_ENVNAM;
                    411: 
                    412:                if (flg & N_EXPORT)
                    413:                {
                    414:                        free_val(&n->namenv);
                    415:                        n->namenv = n->namval;
                    416:                }
                    417:                else
                    418:                {
                    419:                        free_val(&n->namval);
                    420:                        n->namval = n->namenv;
                    421:                }
                    422:        }
                    423: 
                    424:        
                    425:        n->namflg &= N_ENVNAM;
                    426: 
                    427:        if (n->namval.val)
                    428:                namec++;
                    429: }
                    430: 
                    431: printexp(n)
                    432: register struct namnod *n;
                    433: {
                    434:        if (n->namflg & N_EXPORT)
                    435:        {
                    436:                prs_buff(export);
                    437:                prc_buff(SP);
                    438:                prs_buff(n->namid);
                    439:                prc_buff(NL);
                    440:        }
                    441: }
                    442: 
                    443: setup_env()
                    444: {
                    445:        register char **e = environ;
                    446: 
                    447:        while (*e)
                    448:                setname(*e++, N_ENVNAM);
                    449: }
                    450: 
                    451: killenvfn(n)
                    452: struct namnod *n;
                    453: {
                    454:        if ((n->namflg & N_ENVNAM) && (n->namval.flg & N_FUNCTN))
                    455:        {
                    456:                freefunc(n->namval.val);
                    457:                n->namval.val = N_VAR;
                    458:                n->namval.flg = 0;
                    459:        }
                    460: }
                    461: 
                    462: prot_env()
                    463: {
                    464:        register struct namnod *n;
                    465: 
                    466:        namscan(killenvfn);
                    467:        if (ifsnod.namval.val)
                    468:                free(ifsnod.namval.val);
                    469:        ifsnod.namval.val = 0;
                    470:        dfault(&ifsnod, sptbnl);
                    471: }
                    472: 
                    473: static char **argnam;
                    474: 
                    475: pushnam(n)
                    476: struct namnod *n;
                    477: {
                    478:        if (n->namval.val || (n->namval.flg & N_FUNCTN))
                    479:                *argnam++ = staknam(n);
                    480: }
                    481: 
                    482: char **
                    483: setenv()
                    484: {
                    485:        register char   **er;
                    486: 
                    487:        namec = 0;
                    488:        namscan(exname);
                    489: 
                    490:        argnam = er = (char **)getstak(namec * BYTESPERWORD + BYTESPERWORD);
                    491:        namscan(pushnam);
                    492:        *argnam++ = 0;
                    493:        return(er);
                    494: }
                    495: 
                    496: struct namnod *
                    497: findnam(nam)
                    498:        register char   *nam;
                    499: {
                    500:        register struct namnod *nscan = namep;
                    501:        int             LR;
                    502: 
                    503:        if (!chkid(nam))
                    504:                return(0);
                    505:        while (nscan)
                    506:        {
                    507:                if ((LR = cf(nam, nscan->namid)) == 0)
                    508:                        return(nscan);
                    509:                else if (LR < 0)
                    510:                        nscan = nscan->namlft;
                    511:                else
                    512:                        nscan = nscan->namrgt;
                    513:        }
                    514:        return(0); 
                    515: }
                    516: 
                    517: 
                    518: special(s)
                    519:        char *s;
                    520: {
                    521:        return !cf(s, "builtin") || !cf(s, ifsname) || !cf(s, pathname) || !cf(s, ps1name) || !cf(s, ps2name);
                    522: }
                    523: 
                    524: unset_name(name)
                    525:        register char   *name;
                    526: {
                    527:        register struct namnod  *n;
                    528: 
                    529:        if (n = findnam(name))
                    530:        {
                    531:                if (special(name))
                    532:                        failed(name, badunset);
                    533: 
                    534:                if (!(n->namflg & N_ENVNAM))
                    535:                {
                    536:                        if (n->namval.flg & N_FUNCTN)
                    537:                                freefunc(n->namval.val);
                    538:                        else
                    539:                                free(n->namval.val);
                    540:                }
                    541: 
                    542:                if (n->namenv.flg & N_FUNCTN)
                    543:                        freefunc(n->namenv.val);
                    544:                else
                    545:                        free(n->namenv.val);
                    546: 
                    547:                n->namval.val = N_VAR;
                    548:                n->namval.flg = 0;
                    549:                n->namenv = n->namval;
                    550:                n->namflg = N_DEFAULT;
                    551: 
                    552:                if (flags & prompt)
                    553:                {
                    554:                        if (n == &mailnod)
                    555:                                setmail(0);
                    556:                }
                    557:        }
                    558: }
                    559: 
                    560: free_val(nx)
                    561:        struct namx     *nx;
                    562: {
                    563:                if (nx->flg & N_FUNCTN)
                    564:                        freefunc(nx->val);
                    565:                else
                    566:                        free(nx->val);
                    567: }

unix.superglobalmegacorp.com

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