|
|
1.1 root 1: /* @(#)stak.c 1.4 */
2: /*
3: * UNIX shell
4: *
5: * Bell Telephone Laboratories
6: *
7: */
8:
9: #include "defs.h"
10:
11:
12: /* ======== storage allocation ======== */
13:
14: char *
15: getstak(asize) /* allocate requested stack */
16: int asize;
17: {
18: register char *oldstak;
19: register int size;
20:
21: size = round(asize, BYTESPERWORD);
22: oldstak = stakbot;
23: staktop = stakbot += size;
24: return(oldstak);
25: }
26:
27: /*
28: * set up stack for local use
29: * should be followed by `endstak'
30: */
31: char *
32: locstak()
33: {
34: if (brkend - stakbot < BRKINCR)
35: {
36: if (setbrk(brkincr) == -1)
37: error(nostack);
38: if (brkincr < BRKMAX)
39: brkincr += 256;
40: }
41: return(stakbot);
42: }
43:
44: char *
45: savstak()
46: {
47: assert(staktop == stakbot);
48: return(stakbot);
49: }
50:
51: char *
52: endstak(argp) /* tidy up after `locstak' */
53: register char *argp;
54: {
55: register char *oldstak;
56:
57: *argp++ = 0;
58: oldstak = stakbot;
59: stakbot = staktop = (char *)round(argp, BYTESPERWORD);
60: return(oldstak);
61: }
62:
63: tdystak(x) /* try to bring stack back to x */
64: register char *x;
65: {
66: while ((char *)(stakbsy) > (char *)(x))
67: {
68: free(stakbsy);
69: stakbsy = stakbsy->word;
70: }
71: staktop = stakbot = max((char *)(x), (char *)(stakbas));
72: rmtemp(x);
73: }
74:
75: stakchk()
76: {
77: if ((brkend - stakbas) > BRKINCR + BRKINCR)
78: setbrk(-BRKINCR);
79: }
80:
81: char *
82: cpystak(x)
83: char *x;
84: {
85: return(endstak(movstr(x, locstak())));
86: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.