|
|
1.1 ! root 1: #include "head.h" ! 2: ! 3: /* decode() - read a line from standard input and decode it */ ! 4: ! 5: decode(p) ! 6: char *p; { ! 7: register char c, *q; ! 8: integ = scallf = reflag = colonflag = 0; ! 9: proc[0] = cmd = args[0] = var[0] = '\0'; ! 10: argsp = args; ! 11: ! 12: if (eqany(*p, "/?")) { /* regular expression */ ! 13: c = *p; ! 14: redir = (c == '/'); ! 15: reflag = 1; ! 16: p++; ! 17: if (*p == '\n' || *p == c) return(0); ! 18: q = re; ! 19: while(*p != c && *p != '\n') *q++ = *p++; ! 20: *q = '\0'; ! 21: return(0); ! 22: } ! 23: ! 24: if (*p == '!') { /* shell escape */ ! 25: for (q = p; *q != '\n'; q++) ; ! 26: *q = '\0'; ! 27: system(p+1); ! 28: return(0); ! 29: } ! 30: ! 31: if (*p == '\n') { ! 32: cmd = '\n'; ! 33: return(0); ! 34: } ! 35: ! 36: if (*p == ':') { ! 37: colonflag++; ! 38: } ! 39: ! 40: while (*p != '\n') { /* decode item by item */ ! 41: ! 42: if (number(*p)) { /* decimal number */ ! 43: if(integ) { ! 44: error("Too many numbers"); ! 45: return(1); ! 46: } ! 47: integ = readint(&p); ! 48: continue; ! 49: } ! 50: ! 51: if (varchar(*p) || eqany(*p, COMMANDS)) { ! 52: /* proc, variable or command */ ! 53: if (cmd != '\0') { ! 54: p = cpall(args, p); ! 55: continue; ! 56: } ! 57: q = p; ! 58: while (varchar(*q) || number(*q) || eqany(*q,COMMANDS)) ! 59: q++; ! 60: if (*q == '(') { /* procedure call */ ! 61: if (proc[0] != '\0') { ! 62: error("Too many procedure calls"); ! 63: return(1); ! 64: } ! 65: scallf = 1; ! 66: p = cpname(proc, p); ! 67: p = cpall(args, p); ! 68: continue; ! 69: } ! 70: if (*q == ':') { /* procedure name */ ! 71: colonflag++; ! 72: p = cpname(proc, p); ! 73: continue; ! 74: } ! 75: if (*q == '$') { /* variable name */ ! 76: p = cpname(var, p); ! 77: continue; ! 78: } ! 79: if (((q-p == 1 && eqany(*p,COMMANDS) && ! 80: (proc[0]=='\0' || eqany(*p, "abcd"))) || ! 81: (integ && eqany(*p,COMMANDS))|| eqany(*p, "+-")) ! 82: && !(*p=='-' && *(p+1) == '>')) ! 83: { /* command */ ! 84: cmd = *p++; ! 85: if (eqany(cmd, "acers")) { ! 86: while(*p == ' ') ! 87: p++; ! 88: p = cpall(args, p); ! 89: } ! 90: continue; ! 91: } ! 92: /* otherwise, its a variable */ ! 93: if (var[0] != '\0') { ! 94: error("Too many variable names"); ! 95: return(1); ! 96: } ! 97: p = cpname(var, p); ! 98: if (*p == '\n') { ! 99: cmd = '/'; ! 100: continue; ! 101: } ! 102: if (cmd == '\0') cmd = *p ? *p : '/'; ! 103: p++; ! 104: p = cpall(args,p); ! 105: continue; ! 106: } ! 107: p++; /* otherwise ignore p */ ! 108: } ! 109: return(0); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.