|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)stak.c 4.2 8/11/83"; ! 3: #endif ! 4: ! 5: # ! 6: /* ! 7: * UNIX shell ! 8: * ! 9: * S. R. Bourne ! 10: * Bell Telephone Laboratories ! 11: * ! 12: */ ! 13: ! 14: #include "defs.h" ! 15: ! 16: STKPTR stakbot=nullstr; ! 17: ! 18: ! 19: ! 20: /* ======== storage allocation ======== */ ! 21: ! 22: STKPTR getstak(asize) ! 23: INT asize; ! 24: { /* allocate requested stack */ ! 25: REG STKPTR oldstak; ! 26: REG INT size; ! 27: ! 28: size=round(asize,BYTESPERWORD); ! 29: oldstak=stakbot; ! 30: staktop = stakbot += size; ! 31: return(oldstak); ! 32: } ! 33: ! 34: STKPTR locstak() ! 35: { /* set up stack for local use ! 36: * should be followed by `endstak' ! 37: */ ! 38: IF brkend-stakbot<BRKINCR ! 39: THEN setbrk(brkincr); ! 40: IF brkincr < BRKMAX ! 41: THEN brkincr += 256; ! 42: FI ! 43: FI ! 44: return(stakbot); ! 45: } ! 46: ! 47: STKPTR savstak() ! 48: { ! 49: assert(staktop==stakbot); ! 50: return(stakbot); ! 51: } ! 52: ! 53: STKPTR endstak(argp) ! 54: REG STRING argp; ! 55: { /* tidy up after `locstak' */ ! 56: REG STKPTR oldstak; ! 57: *argp++=0; ! 58: oldstak=stakbot; stakbot=staktop=round(argp,BYTESPERWORD); ! 59: return(oldstak); ! 60: } ! 61: ! 62: VOID tdystak(x) ! 63: REG STKPTR x; ! 64: { ! 65: /* try to bring stack back to x */ ! 66: WHILE ADR(stakbsy)>ADR(x) ! 67: DO free(stakbsy); ! 68: stakbsy = stakbsy->word; ! 69: OD ! 70: staktop=stakbot=max(ADR(x),ADR(stakbas)); ! 71: rmtemp(x); ! 72: } ! 73: ! 74: stakchk() ! 75: { ! 76: IF (brkend-stakbas)>BRKINCR+BRKINCR ! 77: THEN setbrk(-BRKINCR); ! 78: FI ! 79: } ! 80: ! 81: STKPTR cpystak(x) ! 82: STKPTR x; ! 83: { ! 84: return(endstak(movstr(x,locstak()))); ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.