xref: /csrg-svn/old/sh/stak.c (revision 14480)
1*14480Ssam #ifndef lint
2*14480Ssam static char sccsid[] = "@(#)stak.c	4.2 08/11/83";
3*14480Ssam #endif
46704Smckusick 
56704Smckusick #
66704Smckusick /*
76704Smckusick  * UNIX shell
86704Smckusick  *
96704Smckusick  * S. R. Bourne
106704Smckusick  * Bell Telephone Laboratories
116704Smckusick  *
126704Smckusick  */
136704Smckusick 
146704Smckusick #include	"defs.h"
156704Smckusick 
166704Smckusick STKPTR		stakbot=nullstr;
176704Smckusick 
186704Smckusick 
196704Smckusick 
206704Smckusick /* ========	storage allocation	======== */
216704Smckusick 
getstak(asize)226704Smckusick STKPTR	getstak(asize)
236704Smckusick 	INT		asize;
246704Smckusick {	/* allocate requested stack */
256704Smckusick 	REG STKPTR	oldstak;
266704Smckusick 	REG INT		size;
276704Smckusick 
286704Smckusick 	size=round(asize,BYTESPERWORD);
296704Smckusick 	oldstak=stakbot;
306704Smckusick 	staktop = stakbot += size;
316704Smckusick 	return(oldstak);
326704Smckusick }
336704Smckusick 
locstak()346704Smckusick STKPTR	locstak()
356704Smckusick {	/* set up stack for local use
366704Smckusick 	 * should be followed by `endstak'
376704Smckusick 	 */
386704Smckusick 	IF brkend-stakbot<BRKINCR
396704Smckusick 	THEN	setbrk(brkincr);
406704Smckusick 		IF brkincr < BRKMAX
416704Smckusick 		THEN	brkincr += 256;
426704Smckusick 		FI
436704Smckusick 	FI
446704Smckusick 	return(stakbot);
456704Smckusick }
466704Smckusick 
savstak()476704Smckusick STKPTR	savstak()
486704Smckusick {
496704Smckusick 	assert(staktop==stakbot);
506704Smckusick 	return(stakbot);
516704Smckusick }
526704Smckusick 
endstak(argp)536704Smckusick STKPTR	endstak(argp)
546704Smckusick 	REG STRING	argp;
556704Smckusick {	/* tidy up after `locstak' */
566704Smckusick 	REG STKPTR	oldstak;
576704Smckusick 	*argp++=0;
586704Smckusick 	oldstak=stakbot; stakbot=staktop=round(argp,BYTESPERWORD);
596704Smckusick 	return(oldstak);
606704Smckusick }
616704Smckusick 
tdystak(x)626704Smckusick VOID	tdystak(x)
636704Smckusick 	REG STKPTR 	x;
646704Smckusick {
656704Smckusick 	/* try to bring stack back to x */
666704Smckusick 	WHILE ADR(stakbsy)>ADR(x)
676704Smckusick 	DO free(stakbsy);
686704Smckusick 	   stakbsy = stakbsy->word;
696704Smckusick 	OD
706704Smckusick 	staktop=stakbot=max(ADR(x),ADR(stakbas));
716704Smckusick 	rmtemp(x);
726704Smckusick }
736704Smckusick 
stakchk()746704Smckusick stakchk()
756704Smckusick {
766704Smckusick 	IF (brkend-stakbas)>BRKINCR+BRKINCR
776704Smckusick 	THEN	setbrk(-BRKINCR);
786704Smckusick 	FI
796704Smckusick }
806704Smckusick 
cpystak(x)816704Smckusick STKPTR	cpystak(x)
826704Smckusick 	STKPTR		x;
836704Smckusick {
846704Smckusick 	return(endstak(movstr(x,locstak())));
856704Smckusick }
86