xref: /csrg-svn/local/toolchest/ksh/sh/stak.c (revision 35163)
1*35163Smarc /*
2*35163Smarc 
3*35163Smarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*35163Smarc  *      All Rights Reserved
5*35163Smarc 
6*35163Smarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*35163Smarc  *      CODE OF AT&T.
8*35163Smarc  *      The copyright notice above does not
9*35163Smarc  *      evidence any actual or intended
10*35163Smarc  *      publication of such source code.
11*35163Smarc 
12*35163Smarc  */
13*35163Smarc /* @(#)stak.c	1.1 */
14*35163Smarc /*
15*35163Smarc  * UNIX shell
16*35163Smarc  *
17*35163Smarc  * S. R. Bourne
18*35163Smarc  * Rewritten by David Korn
19*35163Smarc  * AT&T Bell Laboratories
20*35163Smarc  *
21*35163Smarc  */
22*35163Smarc 
23*35163Smarc #include	"defs.h"
24*35163Smarc #include	"stak.h"
25*35163Smarc #include	"brkincr.h"
26*35163Smarc 
27*35163Smarc extern char	*movstr();
28*35163Smarc extern void	setbrk();
29*35163Smarc extern void	rmtemp();
30*35163Smarc extern void	free();
31*35163Smarc 
32*35163Smarc 
33*35163Smarc 
34*35163Smarc /* ========	storage allocation	======== */
35*35163Smarc 
36*35163Smarc /*
37*35163Smarc  * allocate requested stack
38*35163Smarc  */
39*35163Smarc 
getstak(asize)40*35163Smarc STKPTR	getstak(asize)
41*35163Smarc int 	asize;
42*35163Smarc {
43*35163Smarc 	register STKPTR oldstak;
44*35163Smarc 	register int 	size;
45*35163Smarc 	size=round(asize,BYTESPERWORD);
46*35163Smarc 	oldstak=stakbot;
47*35163Smarc 	staktop = stakbot += size;
48*35163Smarc 	if(staktop >= brkend)
49*35163Smarc 		setbrk(round(staktop-brkend,BRKINCR));
50*35163Smarc 	return(oldstak);
51*35163Smarc }
52*35163Smarc 
53*35163Smarc /*
54*35163Smarc  * set up stack for local use
55*35163Smarc  * should be followed by `endstak'
56*35163Smarc  */
57*35163Smarc 
locstak()58*35163Smarc STKPTR	locstak()
59*35163Smarc {
60*35163Smarc 	if(brkend-stakbot<BRKINCR)
61*35163Smarc 		setbrk(BRKINCR);
62*35163Smarc 	return(staktop=stakbot);
63*35163Smarc }
64*35163Smarc 
65*35163Smarc 
66*35163Smarc /*
67*35163Smarc  * tidy up after `locstak'
68*35163Smarc  */
69*35163Smarc 
endstak(argp)70*35163Smarc STKPTR	endstak(argp)
71*35163Smarc register char *argp;
72*35163Smarc {
73*35163Smarc 	register STKPTR oldstak;
74*35163Smarc 	*argp++=0;
75*35163Smarc 	oldstak=stakbot; stakbot=staktop=(STKPTR) round(argp,BYTESPERWORD);
76*35163Smarc 	return(oldstak);
77*35163Smarc }
78*35163Smarc 
79*35163Smarc /*
80*35163Smarc  * try to bring stack back to x
81*35163Smarc  */
82*35163Smarc 
tdystak(x)83*35163Smarc void	tdystak(x)
84*35163Smarc register STKPTR  x;
85*35163Smarc {
86*35163Smarc 	while(ADR(stakbsy)>ADR(x))
87*35163Smarc 	{
88*35163Smarc 		free((char*)stakbsy);
89*35163Smarc 		stakbsy = stakbsy->word;
90*35163Smarc 	}
91*35163Smarc 	staktop=stakbot=max(ADR(x),ADR(stakbas));
92*35163Smarc 	if(iotemp > (IOPTR)x)
93*35163Smarc 		rmtemp((IOPTR)x);
94*35163Smarc }
95*35163Smarc 
stakchk()96*35163Smarc stakchk()
97*35163Smarc {
98*35163Smarc 	register int size = -3*BRKINCR;
99*35163Smarc #ifdef INT16
100*35163Smarc 	if((brkend-stakbas) >= BRKMAX)
101*35163Smarc 		size = BRKMAX;
102*35163Smarc 	else
103*35163Smarc #endif /* INT16 */
104*35163Smarc 		size += round(brkend-stakbas,BRKINCR);
105*35163Smarc 	if(size > 0)
106*35163Smarc 		setbrk(-size);
107*35163Smarc }
108*35163Smarc 
cpystak(x)109*35163Smarc STKPTR	cpystak(x)
110*35163Smarc STKPTR		x;
111*35163Smarc {
112*35163Smarc 	return(endstak(movstr(x,((char*)locstak()))));
113*35163Smarc }
114