|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: #include "sh.h" ! 3: ! 4: /* ! 5: * C Shell ! 6: */ ! 7: ! 8: letter(c) ! 9: register char c; ! 10: { ! 11: ! 12: return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_'); ! 13: } ! 14: ! 15: digit(c) ! 16: register char c; ! 17: { ! 18: ! 19: return (c >= '0' && c <= '9'); ! 20: } ! 21: ! 22: any(c, s) ! 23: register int c; ! 24: register char *s; ! 25: { ! 26: ! 27: while (*s) ! 28: if (*s++ == c) ! 29: return(1); ! 30: return(0); ! 31: } ! 32: ! 33: char * ! 34: calloc(i, j) ! 35: register int i; ! 36: int j; ! 37: { ! 38: register char *cp, *dp; ! 39: ! 40: i *= j; ! 41: cp = (char *) malloc(i); ! 42: if (cp == 0) { ! 43: child++; ! 44: error("Out of memory"); ! 45: chdir("/usr/bill/cshcore"); ! 46: abort(); ! 47: } ! 48: dp = cp; ! 49: if (i > 0) ! 50: do ! 51: *dp++ = 0; ! 52: while (--i); ! 53: return (cp); ! 54: } ! 55: ! 56: cfree(p) ! 57: char *p; ! 58: { ! 59: ! 60: free(p); ! 61: } ! 62: ! 63: char ** ! 64: blkend(up) ! 65: register char **up; ! 66: { ! 67: ! 68: while (*up) ! 69: up++; ! 70: return (up); ! 71: } ! 72: ! 73: blkpr(av) ! 74: register int *av; ! 75: { ! 76: ! 77: for (; *av; av++) { ! 78: printf("%s", *av); ! 79: if (av[1]) ! 80: printf(" "); ! 81: } ! 82: } ! 83: ! 84: blklen(av) ! 85: register char **av; ! 86: { ! 87: register int i = 0; ! 88: ! 89: while (*av++) ! 90: i++; ! 91: return (i); ! 92: } ! 93: ! 94: char ** ! 95: blkcpy(oav, bv) ! 96: char **oav; ! 97: register char **bv; ! 98: { ! 99: register char **av = oav; ! 100: ! 101: while (*av++ = *bv++) ! 102: continue; ! 103: return (oav); ! 104: } ! 105: ! 106: char ** ! 107: blkcat(up, vp) ! 108: char **up, **vp; ! 109: { ! 110: ! 111: blkcpy(blkend(up), vp); ! 112: return (up); ! 113: } ! 114: ! 115: blkfree(av0) ! 116: char **av0; ! 117: { ! 118: register char **av = av0; ! 119: ! 120: while (*av) ! 121: xfree(*av++); ! 122: xfree(av0); ! 123: } ! 124: ! 125: char ** ! 126: saveblk(v) ! 127: register char **v; ! 128: { ! 129: register int len = blklen(v) + 1; ! 130: register char **newv = (char **) calloc(len, sizeof (char **)); ! 131: char **onewv = newv; ! 132: ! 133: while (*v) ! 134: *newv++ = savestr(*v++); ! 135: return (onewv); ! 136: } ! 137: ! 138: char * ! 139: strspl(cp, dp) ! 140: register char *cp, *dp; ! 141: { ! 142: register char *ep = calloc(1, strlen(cp) + strlen(dp) + 1); ! 143: ! 144: strcpy(ep, cp); ! 145: return (strcat(ep, dp)); ! 146: } ! 147: ! 148: char ** ! 149: blkspl(up, vp) ! 150: register char **up, **vp; ! 151: { ! 152: register char **wp = (char **) calloc(blklen(up) + blklen(vp) + 1, sizeof (char **)); ! 153: ! 154: blkcpy(wp, up); ! 155: return (blkcat(wp, vp)); ! 156: } ! 157: ! 158: lastchr(cp) ! 159: register char *cp; ! 160: { ! 161: ! 162: if (!*cp) ! 163: return (0); ! 164: while (cp[1]) ! 165: cp++; ! 166: return (*cp); ! 167: } ! 168: ! 169: /* ! 170: * This routine is called after an error to close up ! 171: * any units which may have been left open accidentally. ! 172: */ ! 173: closem() ! 174: { ! 175: register int f; ! 176: ! 177: for (f = 0; f < NOFILE; f++) ! 178: if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD) ! 179: close(f); ! 180: } ! 181: ! 182: /* ! 183: * Close files before executing a file. ! 184: * We could be MUCH more intelligent, since (on a version 7 system) ! 185: * we need only close files here during a source, the other ! 186: * shell fd's being in units 16-19 which are closed automatically! ! 187: */ ! 188: closech() ! 189: { ! 190: register int f; ! 191: ! 192: if (didcch) ! 193: return; ! 194: didcch = 1; ! 195: SHIN = 0; SHOUT = 1; SHDIAG = 2; OLDSTD = 0; ! 196: for (f = 3; f < NOFILE; f++) ! 197: close(f); ! 198: } ! 199: ! 200: donefds() ! 201: { ! 202: ! 203: close(0), close(1), close(2); ! 204: didfds = 0; ! 205: } ! 206: ! 207: /* ! 208: * Move descriptor i to j. ! 209: * If j is -1 then we just want to get i to a safe place, ! 210: * i.e. to a unit > 2. This also happens in dcopy. ! 211: */ ! 212: dmove(i, j) ! 213: register int i, j; ! 214: { ! 215: ! 216: if (i == j || i < 0) ! 217: return (i); ! 218: #ifdef V7 ! 219: if (j >= 0) { ! 220: dup2(i, j); ! 221: return (j); ! 222: } else ! 223: #endif ! 224: j = dcopy(i, j); ! 225: if (j != i) ! 226: close(i); ! 227: return (j); ! 228: } ! 229: ! 230: dcopy(i, j) ! 231: register int i, j; ! 232: { ! 233: ! 234: if (i == j || i < 0 || j < 0 && i > 2) ! 235: return (i); ! 236: #ifdef V7 ! 237: if (j >= 0) { ! 238: dup2(i, j); ! 239: return (j); ! 240: } ! 241: #endif ! 242: close(j); ! 243: return (renum(i, j)); ! 244: } ! 245: ! 246: renum(i, j) ! 247: register int i, j; ! 248: { ! 249: register int k = dup(i); ! 250: ! 251: if (k < 0) ! 252: return (-1); ! 253: if (j == -1 && k > 2) ! 254: return (k); ! 255: if (k != j) { ! 256: j = renum(k, j); ! 257: close(k); ! 258: return (j); ! 259: } ! 260: return (k); ! 261: } ! 262: ! 263: copy(to, from, size) ! 264: register char *to, *from; ! 265: register int size; ! 266: { ! 267: ! 268: if (size) ! 269: do ! 270: *to++ = *from++; ! 271: while (--size != 0); ! 272: } ! 273: ! 274: /* ! 275: * Left shift a command argument list, discarding ! 276: * the first c arguments. Used in "shift" commands ! 277: * as well as by commands like "repeat". ! 278: */ ! 279: lshift(v, c) ! 280: register char **v; ! 281: register int c; ! 282: { ! 283: register char **u = v; ! 284: ! 285: while (*u && --c >= 0) ! 286: xfree(*u++); ! 287: blkcpy(v, u); ! 288: } ! 289: ! 290: number(cp) ! 291: char *cp; ! 292: { ! 293: ! 294: if (*cp == '-') { ! 295: cp++; ! 296: if (!digit(*cp++)) ! 297: return (0); ! 298: } ! 299: while (*cp && digit(*cp)) ! 300: cp++; ! 301: return (*cp == 0); ! 302: } ! 303: ! 304: char ** ! 305: copyblk(v) ! 306: register char **v; ! 307: { ! 308: register char **nv = (char **) calloc(blklen(v) + 1, sizeof (char **)); ! 309: ! 310: return (blkcpy(nv, v)); ! 311: } ! 312: ! 313: char * ! 314: strend(cp) ! 315: register char *cp; ! 316: { ! 317: ! 318: while (*cp) ! 319: cp++; ! 320: return (cp); ! 321: } ! 322: ! 323: char * ! 324: strip(cp) ! 325: char *cp; ! 326: { ! 327: register char *dp = cp; ! 328: ! 329: while (*dp++ &= TRIM) ! 330: continue; ! 331: return (cp); ! 332: } ! 333: ! 334: udvar(name) ! 335: char *name; ! 336: { ! 337: ! 338: setname(name); ! 339: bferr("Undefined variable"); ! 340: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.