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