1*35163Smarc /* 2*35163Smarc 3*35163Smarc * Copyright (c) 1984, 1985, 1986 AT&T 4*35163Smarc * All Rights Reserved 5*35163Smarc 6*35163Smarc * THIS IS UNPUBLISHED PROPRIETARY SOURCE 7*35163Smarc * CODE OF AT&T. 8*35163Smarc * The copyright notice above does not 9*35163Smarc * evidence any actual or intended 10*35163Smarc * publication of such source code. 11*35163Smarc 12*35163Smarc */ 13*35163Smarc /* @(#)stak.c 1.1 */ 14*35163Smarc /* 15*35163Smarc * UNIX shell 16*35163Smarc * 17*35163Smarc * S. R. Bourne 18*35163Smarc * Rewritten by David Korn 19*35163Smarc * AT&T Bell Laboratories 20*35163Smarc * 21*35163Smarc */ 22*35163Smarc 23*35163Smarc #include "defs.h" 24*35163Smarc #include "stak.h" 25*35163Smarc #include "brkincr.h" 26*35163Smarc 27*35163Smarc extern char *movstr(); 28*35163Smarc extern void setbrk(); 29*35163Smarc extern void rmtemp(); 30*35163Smarc extern void free(); 31*35163Smarc 32*35163Smarc 33*35163Smarc 34*35163Smarc /* ======== storage allocation ======== */ 35*35163Smarc 36*35163Smarc /* 37*35163Smarc * allocate requested stack 38*35163Smarc */ 39*35163Smarc getstak(asize)40*35163SmarcSTKPTR getstak(asize) 41*35163Smarc int asize; 42*35163Smarc { 43*35163Smarc register STKPTR oldstak; 44*35163Smarc register int size; 45*35163Smarc size=round(asize,BYTESPERWORD); 46*35163Smarc oldstak=stakbot; 47*35163Smarc staktop = stakbot += size; 48*35163Smarc if(staktop >= brkend) 49*35163Smarc setbrk(round(staktop-brkend,BRKINCR)); 50*35163Smarc return(oldstak); 51*35163Smarc } 52*35163Smarc 53*35163Smarc /* 54*35163Smarc * set up stack for local use 55*35163Smarc * should be followed by `endstak' 56*35163Smarc */ 57*35163Smarc locstak()58*35163SmarcSTKPTR locstak() 59*35163Smarc { 60*35163Smarc if(brkend-stakbot<BRKINCR) 61*35163Smarc setbrk(BRKINCR); 62*35163Smarc return(staktop=stakbot); 63*35163Smarc } 64*35163Smarc 65*35163Smarc 66*35163Smarc /* 67*35163Smarc * tidy up after `locstak' 68*35163Smarc */ 69*35163Smarc endstak(argp)70*35163SmarcSTKPTR endstak(argp) 71*35163Smarc register char *argp; 72*35163Smarc { 73*35163Smarc register STKPTR oldstak; 74*35163Smarc *argp++=0; 75*35163Smarc oldstak=stakbot; stakbot=staktop=(STKPTR) round(argp,BYTESPERWORD); 76*35163Smarc return(oldstak); 77*35163Smarc } 78*35163Smarc 79*35163Smarc /* 80*35163Smarc * try to bring stack back to x 81*35163Smarc */ 82*35163Smarc tdystak(x)83*35163Smarcvoid tdystak(x) 84*35163Smarc register STKPTR x; 85*35163Smarc { 86*35163Smarc while(ADR(stakbsy)>ADR(x)) 87*35163Smarc { 88*35163Smarc free((char*)stakbsy); 89*35163Smarc stakbsy = stakbsy->word; 90*35163Smarc } 91*35163Smarc staktop=stakbot=max(ADR(x),ADR(stakbas)); 92*35163Smarc if(iotemp > (IOPTR)x) 93*35163Smarc rmtemp((IOPTR)x); 94*35163Smarc } 95*35163Smarc stakchk()96*35163Smarcstakchk() 97*35163Smarc { 98*35163Smarc register int size = -3*BRKINCR; 99*35163Smarc #ifdef INT16 100*35163Smarc if((brkend-stakbas) >= BRKMAX) 101*35163Smarc size = BRKMAX; 102*35163Smarc else 103*35163Smarc #endif /* INT16 */ 104*35163Smarc size += round(brkend-stakbas,BRKINCR); 105*35163Smarc if(size > 0) 106*35163Smarc setbrk(-size); 107*35163Smarc } 108*35163Smarc cpystak(x)109*35163SmarcSTKPTR cpystak(x) 110*35163Smarc STKPTR x; 111*35163Smarc { 112*35163Smarc return(endstak(movstr(x,((char*)locstak())))); 113*35163Smarc } 114