add symlin(1)
[unix-history] / usr / src / old / sh / stak.c
CommitLineData
f6227721
SL
1#ifndef lint
2static char sccsid[] = "@(#)stak.c 4.2 %G%";
3#endif
0ac28e48
KM
4
5#
6/*
7 * UNIX shell
8 *
9 * S. R. Bourne
10 * Bell Telephone Laboratories
11 *
12 */
13
14#include "defs.h"
15
16STKPTR stakbot=nullstr;
17
18
19
20/* ======== storage allocation ======== */
21
22STKPTR getstak(asize)
23 INT asize;
24{ /* allocate requested stack */
25 REG STKPTR oldstak;
26 REG INT size;
27
28 size=round(asize,BYTESPERWORD);
29 oldstak=stakbot;
30 staktop = stakbot += size;
31 return(oldstak);
32}
33
34STKPTR locstak()
35{ /* set up stack for local use
36 * should be followed by `endstak'
37 */
38 IF brkend-stakbot<BRKINCR
39 THEN setbrk(brkincr);
40 IF brkincr < BRKMAX
41 THEN brkincr += 256;
42 FI
43 FI
44 return(stakbot);
45}
46
47STKPTR savstak()
48{
49 assert(staktop==stakbot);
50 return(stakbot);
51}
52
53STKPTR endstak(argp)
54 REG STRING argp;
55{ /* tidy up after `locstak' */
56 REG STKPTR oldstak;
57 *argp++=0;
58 oldstak=stakbot; stakbot=staktop=round(argp,BYTESPERWORD);
59 return(oldstak);
60}
61
62VOID tdystak(x)
63 REG STKPTR x;
64{
65 /* try to bring stack back to x */
66 WHILE ADR(stakbsy)>ADR(x)
67 DO free(stakbsy);
68 stakbsy = stakbsy->word;
69 OD
70 staktop=stakbot=max(ADR(x),ADR(stakbas));
71 rmtemp(x);
72}
73
74stakchk()
75{
76 IF (brkend-stakbas)>BRKINCR+BRKINCR
77 THEN setbrk(-BRKINCR);
78 FI
79}
80
81STKPTR cpystak(x)
82 STKPTR x;
83{
84 return(endstak(movstr(x,locstak())));
85}