|
|
1.1 ! root 1: /* @(#)stak.c 1.4 */ ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * Bell Telephone Laboratories ! 6: * ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: ! 11: char *setbrk(); ! 12: ! 13: ! 14: /* ======== storage allocation ======== */ ! 15: ! 16: char * ! 17: getstak(asize) /* allocate requested stack */ ! 18: int asize; ! 19: { ! 20: register char *oldstak; ! 21: register int size; ! 22: ! 23: size = round(asize, BYTESPERWORD); ! 24: oldstak = stakbot; ! 25: staktop = stakbot += size; ! 26: while (staktop >= brkend) ! 27: setbrk(round(staktop - brkend + 1, BRKINCR)); ! 28: return(oldstak); ! 29: } ! 30: ! 31: /* ! 32: * set up stack for local use ! 33: * should be followed by `endstak' ! 34: */ ! 35: char * ! 36: locstak() ! 37: { ! 38: if (brkend - stakbot < BRKINCR) ! 39: { ! 40: if (setbrk(brkincr) == (char *) -1) ! 41: error(nostack); ! 42: if (brkincr < BRKMAX) ! 43: brkincr += 256; ! 44: } ! 45: return(stakbot); ! 46: } ! 47: ! 48: char * ! 49: savstak() ! 50: { ! 51: assert(staktop == stakbot); ! 52: return(stakbot); ! 53: } ! 54: ! 55: char * ! 56: endstak(argp) /* tidy up after `locstak' */ ! 57: register char *argp; ! 58: { ! 59: register char *oldstak; ! 60: ! 61: *argp++ = 0; ! 62: oldstak = stakbot; ! 63: stakbot = staktop = (char *)sround(argp, BYTESPERWORD); ! 64: return(oldstak); ! 65: } ! 66: ! 67: tdystak(x) /* try to bring stack back to x */ ! 68: register char *x; ! 69: { ! 70: while ((char *)(stakbsy) > (char *)(x)) ! 71: { ! 72: shfree(stakbsy); ! 73: stakbsy = stakbsy->word; ! 74: } ! 75: staktop = stakbot = max((char *)(x), (char *)(stakbas)); ! 76: rmtemp(x); ! 77: } ! 78: ! 79: stakchk() ! 80: { ! 81: if ((brkend - stakbas) > BRKINCR + BRKINCR) ! 82: setbrk(-BRKINCR); ! 83: } ! 84: ! 85: char * ! 86: cpystak(x) ! 87: char *x; ! 88: { ! 89: return(endstak(movstr(x, locstak()))); ! 90: } ! 91: ! 92: setstak(x) ! 93: char *x; ! 94: { ! 95: staktop = absstak(x); ! 96: while (staktop >= brkend) ! 97: setbrk(BRKINCR); ! 98: } ! 99: ! 100: pushstak(c) ! 101: char c; ! 102: { ! 103: *staktop++ = c; ! 104: while (staktop >= brkend) ! 105: setbrk(BRKINCR); ! 106: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.