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: }