Annotation of 42BSD/bin/sh/name.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)name.c     4.2 8/11/83";
        !             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    n->namenv = n->namval = argscan;
        !            83:                        ELSE    assign(n, argscan);
        !            84:                        FI
        !            85:                        return;
        !            86:                FI
        !            87:        FI
        !            88:        failed(argi,notid);
        !            89: }
        !            90: 
        !            91: replace(a, v)
        !            92:        REG STRING      *a;
        !            93:        STRING          v;
        !            94: {
        !            95:        free(*a); *a=make(v);
        !            96: }
        !            97: 
        !            98: dfault(n,v)
        !            99:        NAMPTR          n;
        !           100:        STRING          v;
        !           101: {
        !           102:        IF n->namval==0
        !           103:        THEN    assign(n,v)
        !           104:        FI
        !           105: }
        !           106: 
        !           107: assign(n,v)
        !           108:        NAMPTR          n;
        !           109:        STRING          v;
        !           110: {
        !           111:        IF n->namflg&N_RDONLY
        !           112:        THEN    failed(n->namid,wtfailed);
        !           113:        ELSE    replace(&n->namval,v);
        !           114:        FI
        !           115: }
        !           116: 
        !           117: INT    readvar(names)
        !           118:        STRING          *names;
        !           119: {
        !           120:        FILEBLK         fb;
        !           121:        REG FILE        f = &fb;
        !           122:        REG CHAR        c;
        !           123:        REG INT         rc=0;
        !           124:        NAMPTR          n=lookup(*names++); /* done now to avoid storage mess */
        !           125:        STKPTR          rel=relstak();
        !           126: 
        !           127:        push(f); initf(dup(0));
        !           128:        IF lseek(0,0L,1)==-1
        !           129:        THEN    f->fsiz=1;
        !           130:        FI
        !           131: 
        !           132:        LOOP    c=nextc(0);
        !           133:                IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
        !           134:                THEN    zerostak();
        !           135:                        assign(n,absstak(rel)); setstak(rel);
        !           136:                        IF *names
        !           137:                        THEN    n=lookup(*names++);
        !           138:                        ELSE    n=0;
        !           139:                        FI
        !           140:                        IF eolchar(c)
        !           141:                        THEN    break;
        !           142:                        FI
        !           143:                ELSE    pushstak(c);
        !           144:                FI
        !           145:        POOL
        !           146:        WHILE n
        !           147:        DO assign(n, nullstr);
        !           148:           IF *names THEN n=lookup(*names++); ELSE n=0; FI
        !           149:        OD
        !           150: 
        !           151:        IF eof THEN rc=1 FI
        !           152:        lseek(0, (long)(f->fnxt-f->fend), 1);
        !           153:        pop();
        !           154:        return(rc);
        !           155: }
        !           156: 
        !           157: assnum(p, i)
        !           158:        STRING          *p;
        !           159:        INT             i;
        !           160: {
        !           161:        itos(i); replace(p,numbuf);
        !           162: }
        !           163: 
        !           164: STRING make(v)
        !           165:        STRING          v;
        !           166: {
        !           167:        REG STRING      p;
        !           168: 
        !           169:        IF v
        !           170:        THEN    movstr(v,p=alloc(length(v)));
        !           171:                return(p);
        !           172:        ELSE    return(0);
        !           173:        FI
        !           174: }
        !           175: 
        !           176: 
        !           177: NAMPTR         lookup(nam)
        !           178:        REG STRING      nam;
        !           179: {
        !           180:        REG NAMPTR      nscan=namep;
        !           181:        REG NAMPTR      *prev;
        !           182:        INT             LR;
        !           183: 
        !           184:        IF !chkid(nam)
        !           185:        THEN    failed(nam,notid);
        !           186:        FI
        !           187:        WHILE nscan
        !           188:        DO      IF (LR=cf(nam,nscan->namid))==0
        !           189:                THEN    return(nscan);
        !           190:                ELIF LR<0
        !           191:                THEN    prev = &(nscan->namlft);
        !           192:                ELSE    prev = &(nscan->namrgt);
        !           193:                FI
        !           194:                nscan = *prev;
        !           195:        OD
        !           196: 
        !           197:        /* add name node */
        !           198:        nscan=alloc(sizeof *nscan);
        !           199:        nscan->namlft=nscan->namrgt=NIL;
        !           200:        nscan->namid=make(nam);
        !           201:        nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
        !           202:        return(*prev = nscan);
        !           203: }
        !           204: 
        !           205: LOCAL BOOL     chkid(nam)
        !           206:        STRING          nam;
        !           207: {
        !           208:        REG CHAR *      cp=nam;
        !           209: 
        !           210:        IF !letter(*cp)
        !           211:        THEN    return(FALSE);
        !           212:        ELSE    WHILE *++cp
        !           213:                DO IF !alphanum(*cp)
        !           214:                   THEN return(FALSE);
        !           215:                   FI
        !           216:                OD
        !           217:        FI
        !           218:        return(TRUE);
        !           219: }
        !           220: 
        !           221: LOCAL VOID (*namfn)();
        !           222: namscan(fn)
        !           223:        VOID            (*fn)();
        !           224: {
        !           225:        namfn=fn;
        !           226:        namwalk(namep);
        !           227: }
        !           228: 
        !           229: LOCAL VOID     namwalk(np)
        !           230:        REG NAMPTR      np;
        !           231: {
        !           232:        IF np
        !           233:        THEN    namwalk(np->namlft);
        !           234:                (*namfn)(np);
        !           235:                namwalk(np->namrgt);
        !           236:        FI
        !           237: }
        !           238: 
        !           239: VOID   printnam(n)
        !           240:        NAMPTR          n;
        !           241: {
        !           242:        REG STRING      s;
        !           243: 
        !           244:        sigchk();
        !           245:        IF s=n->namval
        !           246:        THEN    prs(n->namid);
        !           247:                prc('='); prs(s);
        !           248:                newline();
        !           249:        FI
        !           250: }
        !           251: 
        !           252: LOCAL STRING   staknam(n)
        !           253:        REG NAMPTR      n;
        !           254: {
        !           255:        REG STRING      p;
        !           256: 
        !           257:        p=movstr(n->namid,staktop);
        !           258:        p=movstr("=",p);
        !           259:        p=movstr(n->namval,p);
        !           260:        return(getstak(p+1-ADR(stakbot)));
        !           261: }
        !           262: 
        !           263: VOID   exname(n)
        !           264:        REG NAMPTR      n;
        !           265: {
        !           266:        IF n->namflg&N_EXPORT
        !           267:        THEN    free(n->namenv);
        !           268:                n->namenv = make(n->namval);
        !           269:        ELSE    free(n->namval);
        !           270:                n->namval = make(n->namenv);
        !           271:        FI
        !           272: }
        !           273: 
        !           274: VOID   printflg(n)
        !           275:        REG NAMPTR              n;
        !           276: {
        !           277:        IF n->namflg&N_EXPORT
        !           278:        THEN    prs(export); blank();
        !           279:        FI
        !           280:        IF n->namflg&N_RDONLY
        !           281:        THEN    prs(readonly); blank();
        !           282:        FI
        !           283:        IF n->namflg&(N_EXPORT|N_RDONLY)
        !           284:        THEN    prs(n->namid); newline();
        !           285:        FI
        !           286: }
        !           287: 
        !           288: VOID   getenv()
        !           289: {
        !           290:        REG STRING      *e=environ;
        !           291: 
        !           292:        WHILE *e
        !           293:        DO setname(*e++, N_ENVNAM) OD
        !           294: }
        !           295: 
        !           296: LOCAL INT      namec;
        !           297: 
        !           298: VOID   countnam(n)
        !           299:        NAMPTR          n;
        !           300: {
        !           301:        namec++;
        !           302: }
        !           303: 
        !           304: LOCAL STRING   *argnam;
        !           305: 
        !           306: VOID   pushnam(n)
        !           307:        NAMPTR          n;
        !           308: {
        !           309:        IF n->namval
        !           310:        THEN    *argnam++ = staknam(n);
        !           311:        FI
        !           312: }
        !           313: 
        !           314: STRING *setenv()
        !           315: {
        !           316:        REG STRING      *er;
        !           317: 
        !           318:        namec=0;
        !           319:        namscan(countnam);
        !           320:        argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
        !           321:        namscan(pushnam);
        !           322:        *argnam++ = 0;
        !           323:        return(er);
        !           324: }

unix.superglobalmegacorp.com

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