Research V7 development
[unix-history] / usr / src / cmd / sh / stak.c
#
/*
* UNIX shell
*
* S. R. Bourne
* Bell Telephone Laboratories
*
*/
#include "defs.h"
STKPTR stakbot=nullstr;
/* ======== storage allocation ======== */
STKPTR getstak(asize)
INT asize;
{ /* allocate requested stack */
REG STKPTR oldstak;
REG INT size;
size=round(asize,BYTESPERWORD);
oldstak=stakbot;
staktop = stakbot += size;
return(oldstak);
}
STKPTR locstak()
{ /* set up stack for local use
* should be followed by `endstak'
*/
IF brkend-stakbot<BRKINCR
THEN setbrk(brkincr);
IF brkincr < BRKMAX
THEN brkincr += 256;
FI
FI
return(stakbot);
}
STKPTR savstak()
{
assert(staktop==stakbot);
return(stakbot);
}
STKPTR endstak(argp)
REG STRING argp;
{ /* tidy up after `locstak' */
REG STKPTR oldstak;
*argp++=0;
oldstak=stakbot; stakbot=staktop=round(argp,BYTESPERWORD);
return(oldstak);
}
VOID tdystak(x)
REG STKPTR x;
{
/* try to bring stack back to x */
WHILE ADR(stakbsy)>ADR(x)
DO free(stakbsy);
stakbsy = stakbsy->word;
OD
staktop=stakbot=max(ADR(x),ADR(stakbas));
rmtemp(x);
}
stakchk()
{
IF (brkend-stakbas)>BRKINCR+BRKINCR
THEN setbrk(-BRKINCR);
FI
}
STKPTR cpystak(x)
STKPTR x;
{
return(endstak(movstr(x,locstak())));
}