|
|
1.1 ! root 1: /* @(#)word.c 1.4 */ ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * Bell Telephone Laboratories ! 6: * ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include "sym.h" ! 11: #include <errno.h> ! 12: ! 13: ! 14: /* ======== character handling for command lines ========*/ ! 15: ! 16: ! 17: word() ! 18: { ! 19: register char c, d; ! 20: struct argnod *arg = (struct argnod *)locstak(); ! 21: register char *argp = arg->argval; ! 22: int alpha = 1; ! 23: int lbrok, rbrok; ! 24: ! 25: wdnum = 0; ! 26: wdset = 0; ! 27: ! 28: while (1) ! 29: { ! 30: while (c = nextc(0), space(c)) /* skipc() */ ! 31: ; ! 32: ! 33: if (c == COMCHAR) ! 34: { ! 35: while ((c = readc()) != NL && c != EOF); ! 36: peekc = c; ! 37: } ! 38: else ! 39: { ! 40: break; /* out of comment - white space loop */ ! 41: } ! 42: } ! 43: if (!eofmeta(c)) ! 44: { ! 45: lbrok = rbrok = 0; ! 46: do ! 47: { ! 48: if (c == LITERAL) ! 49: { ! 50: *argp++ = (DQUOTE); ! 51: while ((c = readc()) && c != LITERAL) ! 52: { ! 53: *argp++ = (c | QUOTE); ! 54: if (c == NL) ! 55: chkpr(); ! 56: } ! 57: *argp++ = (DQUOTE); ! 58: } ! 59: else ! 60: { ! 61: *argp++ = (c); ! 62: if (c == '=') ! 63: wdset |= alpha; ! 64: /* hack for ${} */ ! 65: else if (c == '$') ! 66: lbrok++; ! 67: else if (lbrok) ! 68: { ! 69: if (c == '{') ! 70: rbrok++; ! 71: lbrok = 0; ! 72: } ! 73: else if (rbrok && c == '}') ! 74: rbrok--; ! 75: if (!alphanum(c)) ! 76: alpha = 0; ! 77: if (qotchar(c)) ! 78: { ! 79: d = c; ! 80: while ((*argp++ = (c = nextc(d))) && c != d) ! 81: { ! 82: if (c == NL) ! 83: chkpr(); ! 84: } ! 85: } ! 86: } ! 87: } while ((c = nextc(0), !eofmeta(c) || (lbrok && c=='{') || (rbrok && c=='}'))); ! 88: argp = endstak(argp); ! 89: if (!letter(arg->argval[0])) ! 90: wdset = 0; ! 91: ! 92: peekn = c | MARK; ! 93: if (arg->argval[1] == 0 && ! 94: (d = arg->argval[0], digit(d)) && ! 95: (c == '>' || c == '<')) ! 96: { ! 97: word(); ! 98: wdnum = d - '0'; ! 99: } ! 100: else /*check for reserved words*/ ! 101: { ! 102: if (reserv == FALSE || (wdval = syslook(arg->argval,reserved, no_reserved)) == 0) ! 103: { ! 104: wdarg = arg; ! 105: wdval = 0; ! 106: } ! 107: } ! 108: } ! 109: else if (dipchar(c)) ! 110: { ! 111: if ((d = nextc(0)) == c) ! 112: { ! 113: wdval = c | SYMREP; ! 114: if (c == '<') ! 115: peekn = nextc(0) | MARK; ! 116: } ! 117: else ! 118: { ! 119: peekn = d | MARK; ! 120: wdval = c; ! 121: } ! 122: } ! 123: else ! 124: { ! 125: if ((wdval = c) == EOF) ! 126: wdval = EOFSYM; ! 127: if (iopend && eolchar(c)) ! 128: { ! 129: copy(iopend); ! 130: iopend = 0; ! 131: } ! 132: } ! 133: reserv = FALSE; ! 134: return(wdval); ! 135: } ! 136: ! 137: skipc() ! 138: { ! 139: register char c; ! 140: ! 141: while (c = nextc(0), space(c)) ! 142: ; ! 143: return(c); ! 144: } ! 145: ! 146: nextc(quote) ! 147: char quote; ! 148: { ! 149: register char c, d; ! 150: ! 151: retry: ! 152: if ((d = readc()) == ESCAPE) ! 153: { ! 154: if ((c = readc()) == NL) ! 155: { ! 156: chkpr(); ! 157: goto retry; ! 158: } ! 159: else if (quote && c != quote && !escchar(c)) ! 160: peekc = c | MARK; ! 161: else ! 162: d = c | QUOTE; ! 163: } ! 164: return(d); ! 165: } ! 166: readc() ! 167: { ! 168: register char c; ! 169: register int len; ! 170: register struct fileblk *f; ! 171: ! 172: if (peekn) ! 173: { ! 174: peekc = peekn; ! 175: peekn = 0; ! 176: } ! 177: if (peekc) ! 178: { ! 179: c = peekc; ! 180: peekc = 0; ! 181: return(c); ! 182: } ! 183: f = standin; ! 184: retry: ! 185: if (f->fnxt != f->fend) ! 186: { ! 187: if ((c = *f->fnxt++) == 0) ! 188: { ! 189: if (f->feval) ! 190: { ! 191: if (estabf(*f->feval++)) ! 192: c = EOF; ! 193: else ! 194: c = SP; ! 195: } ! 196: else ! 197: goto retry; /* = c = readc(); */ ! 198: } ! 199: if (standin->fstak == 0) { ! 200: if (flags & readpr) ! 201: prc(c); ! 202: if (flags & prompt && histnod.namval.val) ! 203: histc (c); ! 204: } ! 205: if (c == NL) ! 206: f->flin++; ! 207: } ! 208: else if (f->feof || f->fdes < 0) ! 209: { ! 210: c = EOF; ! 211: f->feof++; ! 212: } ! 213: else if ((len = readb()) <= 0) ! 214: { ! 215: close(f->fdes); ! 216: f->fdes = -1; ! 217: c = EOF; ! 218: f->feof++; ! 219: } ! 220: else ! 221: { ! 222: f->fend = (f->fnxt = f->fbuf) + len; ! 223: goto retry; ! 224: } ! 225: return(c); ! 226: } ! 227: ! 228: static ! 229: readb() ! 230: { ! 231: register struct fileblk *f = standin; ! 232: register int len; ! 233: ! 234: do ! 235: { ! 236: if (trapnote & SIGSET) ! 237: { ! 238: newline(); ! 239: sigchk(); ! 240: } ! 241: else if ((trapnote & TRAPSET) && (rwait > 0)) ! 242: { ! 243: newline(); ! 244: chktrap(); ! 245: clearup(); ! 246: } ! 247: } while ((len = read(f->fdes, f->fbuf, f->fsiz)) < 0 && errno==EINTR && trapnote); ! 248: return(len); ! 249: } ! 250: ! 251: int histfd = 0; ! 252: static histc (c) ! 253: { ! 254: static char histbuf[256]; ! 255: static char *histp=histbuf; ! 256: ! 257: if (histfd == 0) { ! 258: if ((histfd = open(histnod.namval.val, 1)) < 0 && ! 259: (histfd = creat(histnod.namval.val, 0666)) < 0) ! 260: return; ! 261: } ! 262: if (histfd > 0) { ! 263: *histp++ = c; ! 264: if (c == '\n' || c == ';' || histp >= &histbuf[sizeof histbuf]) { ! 265: lseek(histfd, 0L, 2); ! 266: write(histfd, histbuf, histp-histbuf); ! 267: histp = histbuf; ! 268: } ! 269: } ! 270: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.