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

Defined functions

VOID defined in line 218; used 8 times
assign defined in line 103; used 6 times
assnum defined in line 153; used 6 times
chkid defined in line 201; used 2 times
countnam defined in line 294; used 1 times
dfault defined in line 94; used 3 times
exname defined in line 259; used 1 times
getenv defined in line 284; used 2 times
lookup defined in line 173; used 8 times
make defined in line 160; used 6 times
namscan defined in line 218; used 5 times
namwalk defined in line 225; used 3 times
printflg defined in line 270; used 1 times
printnam defined in line 235; used 1 times
pushnam defined in line 302; used 1 times
readvar defined in line 113; used 1 times
replace defined in line 87; used 3 times
setenv defined in line 310; used 2 times
setlist defined in line 48; used 2 times
setname defined in line 63; used 3 times
staknam defined in line 248; used 2 times
syslook defined in line 28; used 2 times
Last modified: 1981-07-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1204
Valid CSS Valid XHTML 1.0 Strict