Annotation of 43BSDReno/bin/sh/name.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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