#include "defs.h"
unsigned char *
getstak(asize)
int asize;
{
unsigned char *oldstak;
int size;
size = round(asize, BYTESPERWORD);
oldstak = stakbot;
staktop = stakbot += size;
if (staktop >= brkend)
growstak(staktop);
return(oldstak);
}
unsigned char *
locstak()
{
if (brkend - stakbot < BRKINCR)
{
if (setbrk(brkincr) == -1)
error(nostack);
if (brkincr < BRKMAX)
brkincr += 256;
}
return(stakbot);
}
void
growstak(newtop)
unsigned char *newtop;
{
unsigned incr;
incr = (unsigned)round(newtop - brkend + 1, BYTESPERWORD);
if (brkincr > incr)
incr = brkincr;
if (setbrk(incr) == -1)
error(nospace);
}
unsigned char *
savstak()
{
assert(staktop == stakbot);
return(stakbot);
}
unsigned char *
endstak(unsigned char *argp)
{
unsigned char *oldstak;
if (argp >= brkend)
growstak(argp);
*argp++ = 0;
oldstak = stakbot;
stakbot = staktop = (unsigned char *)round(argp, BYTESPERWORD);
if (staktop >= brkend)
growstak(staktop);
return(oldstak);
}
void
tdystak(unsigned char *x)
{
struct blk *next;
while ((unsigned char *)stakbsy > x)
{
next = stakbsy->word;
free(stakbsy);
stakbsy = next;
}
staktop = stakbot = max(x, stakbas);
rmtemp(x);
}
void
stakchk(void)
{
if ((brkend - stakbas) > BRKINCR + BRKINCR)
setbrk(-BRKINCR);
}
unsigned char *
cpystak(x)
unsigned char *x;
{
return(endstak(movstrstak(x, locstak())));
}
unsigned char *
movstrstak(unsigned char *a, unsigned char *b)
{
do
{
if (b >= brkend)
growstak(b);
}
while (*b++ = *a++);
return(--b);
}
unsigned char *
memcpystak(unsigned char *s1, unsigned char *s2, int n)
{
unsigned char *os1 = s1;
while (--n >= 0) {
if (s1 >= brkend)
growstak(s1);
*s1++ = *s2++;
}
return (os1);
}