145 lines
2.2 KiB
C
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);
|
|
}
|