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