2021-10-11 18:37:13 -03:00

145 lines
2.2 KiB
C

/* Copyright (c) 1984 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ifndef lint
static char sccsid[] = "@(#)stak.c 1.1 94/10/31 SMI"; /* from S5R3.1 1.8 */
#endif
/*
* UNIX shell
*/
#include "defs.h"
/* ======== 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;
if (staktop >= brkend)
growstak(staktop);
return(oldstak);
}
/*
* set up stack for local use
* should be followed by `endstak'
*/
char *
locstak()
{
if (brkend - stakbot < BRKINCR)
{
if (setbrk(brkincr) == -1)
error(nostack);
if (brkincr < BRKMAX)
brkincr += 256;
}
return(stakbot);
}
void
growstak(newtop)
char *newtop;
{
register unsigned incr;
incr = (unsigned)round(newtop - brkend + 1, BYTESPERWORD);
if (brkincr > incr)
incr = brkincr;
if (setbrk(incr) == -1)
error(nospace);
}
char *
savstak()
{
assert(staktop == stakbot);
return(stakbot);
}
char *
endstak(argp) /* tidy up after `locstak' */
register char *argp;
{
register char *oldstak;
if (argp >= brkend)
growstak(argp);
*argp++ = 0;
oldstak = stakbot;
stakbot = staktop = (char *)round(argp, BYTESPERWORD);
if (staktop >= brkend)
growstak(staktop);
return(oldstak);
}
tdystak(x) /* try to bring stack back to x */
register char *x;
{
while ((char *)(stakbsy) > (char *)(x))
{
free(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(movstrstak(x, locstak())));
}
char *
movstrstak(a, b)
register char *a, *b;
{
do
{
if (b >= brkend)
growstak(b);
}
while (*b++ = *a++);
return(--b);
}
/*
* Copy s2 to s1, always copy n bytes.
* Return s1
*/
char *
memcpystak(s1, s2, n)
register char *s1, *s2;
register int n;
{
register char *os1 = s1;
while (--n >= 0) {
if (s1 >= brkend)
growstak(s1);
*s1++ = *s2++;
}
return (os1);
}