Annotation of 41BSD/cmd/sh/name.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  * UNIX shell
                      4:  *
                      5:  * S. R. Bourne
                      6:  * Bell Telephone Laboratories
                      7:  *
                      8:  */
                      9: 
                     10: #include       "defs.h"
                     11: 
                     12: PROC BOOL      chkid();
                     13: 
                     14: 
                     15: NAMNOD ps2nod  = {     NIL,            NIL,            ps2name},
                     16:        fngnod  = {     NIL,            NIL,            fngname},
                     17:        pathnod = {     NIL,            NIL,            pathname},
                     18:        ifsnod  = {     NIL,            NIL,            ifsname},
                     19:        ps1nod  = {     &pathnod,       &ps2nod,        ps1name},
                     20:        homenod = {     &fngnod,        &ifsnod,        homename},
                     21:        mailnod = {     &homenod,       &ps1nod,        mailname};
                     22: 
                     23: NAMPTR         namep = &mailnod;
                     24: 
                     25: 
                     26: /* ========    variable and string handling    ======== */
                     27: 
                     28: syslook(w,syswds)
                     29:        STRING          w;
                     30:        SYSTAB          syswds;
                     31: {
                     32:        REG CHAR        first;
                     33:        REG STRING      s;
                     34:        REG SYSPTR      syscan;
                     35: 
                     36:        syscan=syswds; first = *w;
                     37: 
                     38:        WHILE s=syscan->sysnam
                     39:        DO  IF first == *s
                     40:                ANDF eq(w,s)
                     41:            THEN return(syscan->sysval);
                     42:            FI
                     43:            syscan++;
                     44:        OD
                     45:        return(0);
                     46: }
                     47: 
                     48: setlist(arg,xp)
                     49:        REG ARGPTR      arg;
                     50:        INT             xp;
                     51: {
                     52:        WHILE arg
                     53:        DO REG STRING   s=mactrim(arg->argval);
                     54:           setname(s, xp);
                     55:           arg=arg->argnxt;
                     56:           IF flags&execpr
                     57:           THEN prs(s);
                     58:                IF arg THEN blank(); ELSE newline(); FI
                     59:           FI
                     60:        OD
                     61: }
                     62: 
                     63: VOID   setname(argi, xp)
                     64:        STRING          argi;
                     65:        INT             xp;
                     66: {
                     67:        REG STRING      argscan=argi;
                     68:        REG NAMPTR      n;
                     69: 
                     70:        IF letter(*argscan)
                     71:        THEN    WHILE alphanum(*argscan) DO argscan++ OD
                     72:                IF *argscan=='='
                     73:                THEN    *argscan = 0;
                     74:                        n=lookup(argi);
                     75:                        *argscan++ = '=';
                     76:                        attrib(n, xp);
                     77:                        IF xp&N_ENVNAM
                     78:                        THEN    n->namenv = n->namval = argscan;
                     79:                        ELSE    assign(n, argscan);
                     80:                        FI
                     81:                        return;
                     82:                FI
                     83:        FI
                     84:        failed(argi,notid);
                     85: }
                     86: 
                     87: replace(a, v)
                     88:        REG STRING      *a;
                     89:        STRING          v;
                     90: {
                     91:        free(*a); *a=make(v);
                     92: }
                     93: 
                     94: dfault(n,v)
                     95:        NAMPTR          n;
                     96:        STRING          v;
                     97: {
                     98:        IF n->namval==0
                     99:        THEN    assign(n,v)
                    100:        FI
                    101: }
                    102: 
                    103: assign(n,v)
                    104:        NAMPTR          n;
                    105:        STRING          v;
                    106: {
                    107:        IF n->namflg&N_RDONLY
                    108:        THEN    failed(n->namid,wtfailed);
                    109:        ELSE    replace(&n->namval,v);
                    110:        FI
                    111: }
                    112: 
                    113: INT    readvar(names)
                    114:        STRING          *names;
                    115: {
                    116:        FILEBLK         fb;
                    117:        REG FILE        f = &fb;
                    118:        REG CHAR        c;
                    119:        REG INT         rc=0;
                    120:        NAMPTR          n=lookup(*names++); /* done now to avoid storage mess */
                    121:        STKPTR          rel=relstak();
                    122: 
                    123:        push(f); initf(dup(0));
                    124:        IF lseek(0,0L,1)==-1
                    125:        THEN    f->fsiz=1;
                    126:        FI
                    127: 
                    128:        LOOP    c=nextc(0);
                    129:                IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
                    130:                THEN    zerostak();
                    131:                        assign(n,absstak(rel)); setstak(rel);
                    132:                        IF *names
                    133:                        THEN    n=lookup(*names++);
                    134:                        ELSE    n=0;
                    135:                        FI
                    136:                        IF eolchar(c)
                    137:                        THEN    break;
                    138:                        FI
                    139:                ELSE    pushstak(c);
                    140:                FI
                    141:        POOL
                    142:        WHILE n
                    143:        DO assign(n, nullstr);
                    144:           IF *names THEN n=lookup(*names++); ELSE n=0; FI
                    145:        OD
                    146: 
                    147:        IF eof THEN rc=1 FI
                    148:        lseek(0, (long)(f->fnxt-f->fend), 1);
                    149:        pop();
                    150:        return(rc);
                    151: }
                    152: 
                    153: assnum(p, i)
                    154:        STRING          *p;
                    155:        INT             i;
                    156: {
                    157:        itos(i); replace(p,numbuf);
                    158: }
                    159: 
                    160: STRING make(v)
                    161:        STRING          v;
                    162: {
                    163:        REG STRING      p;
                    164: 
                    165:        IF v
                    166:        THEN    movstr(v,p=alloc(length(v)));
                    167:                return(p);
                    168:        ELSE    return(0);
                    169:        FI
                    170: }
                    171: 
                    172: 
                    173: NAMPTR         lookup(nam)
                    174:        REG STRING      nam;
                    175: {
                    176:        REG NAMPTR      nscan=namep;
                    177:        REG NAMPTR      *prev;
                    178:        INT             LR;
                    179: 
                    180:        IF !chkid(nam)
                    181:        THEN    failed(nam,notid);
                    182:        FI
                    183:        WHILE nscan
                    184:        DO      IF (LR=cf(nam,nscan->namid))==0
                    185:                THEN    return(nscan);
                    186:                ELIF LR<0
                    187:                THEN    prev = &(nscan->namlft);
                    188:                ELSE    prev = &(nscan->namrgt);
                    189:                FI
                    190:                nscan = *prev;
                    191:        OD
                    192: 
                    193:        /* add name node */
                    194:        nscan=alloc(sizeof *nscan);
                    195:        nscan->namlft=nscan->namrgt=NIL;
                    196:        nscan->namid=make(nam);
                    197:        nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
                    198:        return(*prev = nscan);
                    199: }
                    200: 
                    201: LOCAL BOOL     chkid(nam)
                    202:        STRING          nam;
                    203: {
                    204:        REG CHAR *      cp=nam;
                    205: 
                    206:        IF !letter(*cp)
                    207:        THEN    return(FALSE);
                    208:        ELSE    WHILE *++cp
                    209:                DO IF !alphanum(*cp)
                    210:                   THEN return(FALSE);
                    211:                   FI
                    212:                OD
                    213:        FI
                    214:        return(TRUE);
                    215: }
                    216: 
                    217: LOCAL VOID (*namfn)();
                    218: namscan(fn)
                    219:        VOID            (*fn)();
                    220: {
                    221:        namfn=fn;
                    222:        namwalk(namep);
                    223: }
                    224: 
                    225: LOCAL VOID     namwalk(np)
                    226:        REG NAMPTR      np;
                    227: {
                    228:        IF np
                    229:        THEN    namwalk(np->namlft);
                    230:                (*namfn)(np);
                    231:                namwalk(np->namrgt);
                    232:        FI
                    233: }
                    234: 
                    235: VOID   printnam(n)
                    236:        NAMPTR          n;
                    237: {
                    238:        REG STRING      s;
                    239: 
                    240:        sigchk();
                    241:        IF s=n->namval
                    242:        THEN    prs(n->namid);
                    243:                prc('='); prs(s);
                    244:                newline();
                    245:        FI
                    246: }
                    247: 
                    248: LOCAL STRING   staknam(n)
                    249:        REG NAMPTR      n;
                    250: {
                    251:        REG STRING      p;
                    252: 
                    253:        p=movstr(n->namid,staktop);
                    254:        p=movstr("=",p);
                    255:        p=movstr(n->namval,p);
                    256:        return(getstak(p+1-ADR(stakbot)));
                    257: }
                    258: 
                    259: VOID   exname(n)
                    260:        REG NAMPTR      n;
                    261: {
                    262:        IF n->namflg&N_EXPORT
                    263:        THEN    free(n->namenv);
                    264:                n->namenv = make(n->namval);
                    265:        ELSE    free(n->namval);
                    266:                n->namval = make(n->namenv);
                    267:        FI
                    268: }
                    269: 
                    270: VOID   printflg(n)
                    271:        REG NAMPTR              n;
                    272: {
                    273:        IF n->namflg&N_EXPORT
                    274:        THEN    prs(export); blank();
                    275:        FI
                    276:        IF n->namflg&N_RDONLY
                    277:        THEN    prs(readonly); blank();
                    278:        FI
                    279:        IF n->namflg&(N_EXPORT|N_RDONLY)
                    280:        THEN    prs(n->namid); newline();
                    281:        FI
                    282: }
                    283: 
                    284: VOID   getenv()
                    285: {
                    286:        REG STRING      *e=environ;
                    287: 
                    288:        WHILE *e
                    289:        DO setname(*e++, N_ENVNAM) OD
                    290: }
                    291: 
                    292: LOCAL INT      namec;
                    293: 
                    294: VOID   countnam(n)
                    295:        NAMPTR          n;
                    296: {
                    297:        namec++;
                    298: }
                    299: 
                    300: LOCAL STRING   *argnam;
                    301: 
                    302: VOID   pushnam(n)
                    303:        NAMPTR          n;
                    304: {
                    305:        IF n->namval
                    306:        THEN    *argnam++ = staknam(n);
                    307:        FI
                    308: }
                    309: 
                    310: STRING *setenv()
                    311: {
                    312:        REG STRING      *er;
                    313: 
                    314:        namec=0;
                    315:        namscan(countnam);
                    316:        argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
                    317:        namscan(pushnam);
                    318:        *argnam++ = 0;
                    319:        return(er);
                    320: }

unix.superglobalmegacorp.com

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