xref: /csrg-svn/local/toolchest/ksh/sh/stak.h (revision 35164)
1*35164Smarc /*
2*35164Smarc 
3*35164Smarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*35164Smarc  *      All Rights Reserved
5*35164Smarc 
6*35164Smarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*35164Smarc  *      CODE OF AT&T.
8*35164Smarc  *      The copyright notice above does not
9*35164Smarc  *      evidence any actual or intended
10*35164Smarc  *      publication of such source code.
11*35164Smarc 
12*35164Smarc  */
13*35164Smarc /* @(#)stak.h	1.1 */
14*35164Smarc 
15*35164Smarc /*
16*35164Smarc  *	UNIX shell
17*35164Smarc  *
18*35164Smarc  *	S. R. Bourne
19*35164Smarc  *	AT&T Bell Laboratories
20*35164Smarc  *
21*35164Smarc  */
22*35164Smarc 
23*35164Smarc /*
24*35164Smarc  * To use stack as temporary workspace across
25*35164Smarc  * possible storage allocation (eg name lookup)
26*35164Smarc  * a) get ptr from `relstak'
27*35164Smarc  * b) can now use `pushstak'
28*35164Smarc  * c) then reset with `setstak'
29*35164Smarc  * d) `absstak' gives real address if needed
30*35164Smarc  */
31*35164Smarc #define		relstak()	(staktop-stakbot)
32*35164Smarc #define		absstak(x)	(stakbot+Rcheat(x))
33*35164Smarc #define		setstak(x)	(staktop=absstak(x))
34*35164Smarc #define		pushstak(c)	(*staktop++=(c))
35*35164Smarc #define		zerostak()	(*staktop=0)
36*35164Smarc #define	savstak()	(stakbot)
37*35164Smarc 
38*35164Smarc /*
39*35164Smarc  * Used to address an item left on the top of
40*35164Smarc  * the stack (very temporary)
41*35164Smarc  */
42*35164Smarc #define		curstak()	(stakbot)
43*35164Smarc 
44*35164Smarc /*
45*35164Smarc  * `usestak' before `pushstak' then `fixstak'
46*35164Smarc  * These routines are safe against heap
47*35164Smarc  * being allocated.
48*35164Smarc  */
49*35164Smarc #define		usestak()	{locstak();}
50*35164Smarc 
51*35164Smarc /*
52*35164Smarc  * for local use only since it hands
53*35164Smarc  * out a real address for the stack top
54*35164Smarc  */
55*35164Smarc STKPTR		locstak();
56*35164Smarc 
57*35164Smarc /*
58*35164Smarc  * Will allocate the item being used and return its
59*35164Smarc  * address (safe now).
60*35164Smarc  */
61*35164Smarc #define		fixstak()	endstak(staktop)
62*35164Smarc 
63*35164Smarc /*
64*35164Smarc  * For use after `locstak' to hand back
65*35164Smarc  * new stack top and then allocate item
66*35164Smarc  */
67*35164Smarc STKPTR		endstak();
68*35164Smarc 
69*35164Smarc /*
70*35164Smarc  * Copy a string onto the stack and
71*35164Smarc  * allocate the space.
72*35164Smarc  */
73*35164Smarc STKPTR		cpystak();
74*35164Smarc 
75*35164Smarc /* Allocate given amount of stack space */
76*35164Smarc STKPTR		getstak();
77*35164Smarc 
78*35164Smarc /*
79*35164Smarc  * A chain of ptrs of stack blocks that
80*35164Smarc  * have become covered by heap allocation.
81*35164Smarc  * `tdystak' will return them to the heap.
82*35164Smarc  */
83*35164Smarc extern BLKPTR		stakbsy;
84*35164Smarc 
85*35164Smarc /* Base of the entire stack */
86*35164Smarc extern STKPTR		stakbas;
87*35164Smarc 
88*35164Smarc /* Top of entire stack */
89*35164Smarc extern STKPTR		brkend;
90*35164Smarc 
91*35164Smarc /* Base of current item */
92*35164Smarc extern STKPTR		stakbot;
93*35164Smarc 
94*35164Smarc /* Top of current item */
95*35164Smarc extern STKPTR		staktop;
96*35164Smarc 
97