# 2.11BSD#431 - /usr/src/bin/sh/name.c

##### Functions

    VOID              X
    assign            X
    assnum            X
    chkid             X
    countnam          X
    dfault            X
    exname            X
    lookup            X
    make              X
    namscan           X
    namwalk           X
    printflg          X
    printnam          X
    pushnam           X
    readvar           X
    replace           X
    setenv            X
    setlist           X
    setname           X
    setupenv          X
    staknam           X
    syslook           X

       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: }

#### Defined functions

VOID defined in line 234; used 8 times

- in line 67, 241, 251, 275, 286, 300, 310, 318

assign defined in line 119; used 6 times

- in line 95, 115, 147, 159
- in /usr/src/bin/sh/macro.c line 132
- in /usr/src/bin/sh/xec.c line 352

assnum defined in line 169; used 6 times

- in /usr/src/bin/sh/args.c line 84
- in /usr/src/bin/sh/error.c line 21
- in /usr/src/bin/sh/main.c line 65-69(2)
- in /usr/src/bin/sh/xec.c line 158, 258

chkid defined in line 217; used 2 times

- in line 16, 196

countnam defined in line 310; used 1 times

- in line 331

dfault defined in line 110; used 3 times

- in /usr/src/bin/sh/main.c line 75, 123-124(2)

exname defined in line 275; used 1 times

- in /usr/src/bin/sh/defs.h line 103

lookup defined in line 189; used 8 times

- in line 78, 136, 149, 160
- in /usr/src/bin/sh/defs.h line 89
- in /usr/src/bin/sh/macro.c line 78
- in /usr/src/bin/sh/xec.c line 195, 338

make defined in line 176; used 6 times

- in line 107, 212, 280-282(2)
- in /usr/src/bin/sh/args.c line 117
- in /usr/src/bin/sh/defs.h line 85

namscan defined in line 234; used 5 times

- in line 331-333(2)
- in /usr/src/bin/sh/service.c line 125
- in /usr/src/bin/sh/xec.c line 184, 196

namwalk defined in line 241; used 3 times

- in line 238, 245-247(2)

printflg defined in line 286; used 1 times

- in /usr/src/bin/sh/defs.h line 106

printnam defined in line 251; used 1 times

- in /usr/src/bin/sh/defs.h line 105

pushnam defined in line 318; used 1 times

- in line 333

readvar defined in line 129; used 1 times

- in /usr/src/bin/sh/xec.c line 166

replace defined in line 103; used 3 times

- in line 125, 173
- in /usr/src/bin/sh/xec.c line 118

setenv defined in line 326; used 2 times

- in /usr/src/bin/sh/defs.h line 110
- in /usr/src/bin/sh/service.c line 126

setlist defined in line 52; used 2 times

- in /usr/src/bin/sh/xec.c line 58, 298

setname defined in line 67; used 3 times

- in line 58, 305
- in /usr/src/bin/sh/defs.h line 90

setupenv defined in line 300; used 2 times

- in /usr/src/bin/sh/defs.h line 109
- in /usr/src/bin/sh/main.c line 48

staknam defined in line 264; used 2 times

- in line 322
- in /usr/src/bin/sh/defs.h line 104

syslook defined in line 32; used 2 times

- in /usr/src/bin/sh/word.c line 60
- in /usr/src/bin/sh/xec.c line 57

#### Defined variables

sccsid defined in line 2; never used

Last modified: 1985-11-11 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1265 |