V9/cmd/sh/stak.c
/* @(#)stak.c 1.4 */
/*
* UNIX shell
*
* Bell Telephone Laboratories
*
*/
#include "defs.h"
char *setbrk();
/* ======== storage allocation ======== */
char *
getstak(asize) /* allocate requested stack */
int asize;
{
register char *oldstak;
register int size;
size = round(asize, BYTESPERWORD);
oldstak = stakbot;
staktop = stakbot += size;
while (staktop >= brkend)
setbrk(round(staktop - brkend + 1, BRKINCR));
return(oldstak);
}
/*
* set up stack for local use
* should be followed by `endstak'
*/
char *
locstak()
{
if (brkend - stakbot < BRKINCR)
{
if (setbrk(brkincr) == (char *) -1)
error(nostack);
if (brkincr < BRKMAX)
brkincr += 256;
}
return(stakbot);
}
char *
savstak()
{
assert(staktop == stakbot);
return(stakbot);
}
char *
endstak(argp) /* tidy up after `locstak' */
register char *argp;
{
register char *oldstak;
*argp++ = 0;
oldstak = stakbot;
stakbot = staktop = (char *)sround(argp, BYTESPERWORD);
return(oldstak);
}
tdystak(x) /* try to bring stack back to x */
register char *x;
{
while ((char *)(stakbsy) > (char *)(x))
{
shfree(stakbsy);
stakbsy = stakbsy->word;
}
staktop = stakbot = max((char *)(x), (char *)(stakbas));
rmtemp(x);
}
stakchk()
{
if ((brkend - stakbas) > BRKINCR + BRKINCR)
setbrk(-BRKINCR);
}
char *
cpystak(x)
char *x;
{
return(endstak(movstr(x, locstak())));
}
setstak(x)
char *x;
{
staktop = absstak(x);
while (staktop >= brkend)
setbrk(BRKINCR);
}
pushstak(c)
char c;
{
*staktop++ = c;
while (staktop >= brkend)
setbrk(BRKINCR);
}