|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.