|
|
1.1 root 1: /* sh/alloc.c */
2:
3: #include "sh.h"
4:
5: extern char *malloc();
6:
7: /*
8: * Externals.
9: */
10: BUF *bufap = NULL; /* Head of allocation list */
11: BUF *buffp = NULL; /* Tail of free list */
12: BUF **bufapp = &bufap; /* Tail of allocation list */
13:
14: /*
15: * Given a string, return a pointer to a copy of it. If 'f'
16: * is set, don't add it onto the free list.
17: */
18: char *
19: duplstr(cp0, f)
20: register char *cp0;
21: {
22: register char *cp1, *cp2;
23:
24: cp1 = cp0;
25: while (*cp1++)
26: ;
27: cp2 = (char *) f ? salloc(cp1-cp0) : balloc(cp1-cp0);
28: cp1 = cp2;
29: while (*cp1++=*cp0++)
30: ;
31: return (cp2);
32: }
33:
34: /*
35: * Create an argument list.
36: */
37: char **
38: makargl()
39: {
40: register char **app;
41:
42: app = (char **)balloc((1+IALSIZE)*sizeof(char *));
43: app++;
44: app[-1] = (char *)IALSIZE;
45: app[0] = NULL;
46: return (app);
47: }
48:
49: /*
50: * Add an element to an argument list.
51: */
52: char **
53: addargl(app, sp)
54: char **app;
55: char *sp;
56: {
57: char **napp;
58: register char **rapp;
59: register unsigned n, i;
60:
61: rapp = app;
62: n = (int)rapp[-1];
63: while (*rapp++ != NULL)
64: ;
65: if (rapp-app >= n) {
66: napp = (char **)balloc((1+n*2)*sizeof(char *));
67: napp++;
68: napp[-1] = (char *)(n*2);
69: for (i=0; i<n; i++)
70: napp[i] = app[i];
71: napp[n-1] = sp;
72: napp[n] = NULL;
73: return (napp);
74: }
75: *rapp = NULL;
76: *--rapp = sp;
77: return (app);
78: }
79:
80: /*
81: * Save allocation position.
82: */
83: BUF **
84: savebuf()
85: {
86: return (bufapp);
87: }
88:
89: /*
90: * Free everything allocated since passed allocation position
91: * was saved.
92: */
93: freebuf(bpp)
94: register char **bpp;
95: {
96: *bufapp = buffp;
97: buffp = *bpp;
98: *bpp = NULL;
99: bufapp = bpp;
100: }
101:
102: /*
103: * Allocate a buffer 'n' bytes long.
104: * Add it onto the allocated buffer list.
105: */
106: char *
107: balloc(n)
108: {
109: register BUF *bp, **bpp;
110:
111: bpp = &buffp;
112: for (;;) {
113: if ((bp=*bpp) == NULL) {
114: bp = (BUF *) salloc(sizeof (BUF) + n);
115: bp->b_size = n;
116: break;
117: }
118: if (bp->b_size == n) {
119: *bpp = bp->b_next;
120: break;
121: }
122: bpp = &bp->b_next;
123: }
124: *bufapp = bp;
125: bufapp = &bp->b_next;
126: *bufapp = NULL;
127: return ((char *) bp + sizeof (BUF));
128: }
129:
130: /*
131: * Allocate 'n' bytes.
132: */
133: char *
134: salloc(n)
135: {
136: register char *cp;
137: char *malloc();
138:
139: if ((cp=malloc(n)) == NULL) {
140: prints("Out of memory\n");
141: reset(RNOSBRK);
142: NOTREACHED;
143: }
144: return (cp);
145: }
146:
147: /*
148: * Free something possibly allocated by 'salloc'.
149: * notmem is part of our customised malloc package which
150: * prevents freeing of static strings and automatic variables.
151: */
152: sfree(cp)
153: char *cp;
154: {
155: if (notmem(cp))
156: return;
157: free(cp);
158: }
159:
160: /*
161: * Deallocate a vector.
162: */
163: vfree(vecp)
164: char **vecp;
165: {
166: register char **vpp;
167:
168: if (notmem(vecp))
169: return;
170: for (vpp = vecp; *vpp!=NULL; vpp += 1)
171: sfree(*vpp);
172: sfree(vecp);
173: }
174:
175: char **
176: vdupl(vecp)
177: char **vecp;
178: {
179: register char **vp, **nvp, **tvp;
180:
181: for (vp=vecp; *vp++ != NULL; );
182: tvp = nvp = (char **)salloc((vp - vecp) * sizeof *vp);
183: for (vp=vecp; *vp != NULL; )
184: *tvp++ = duplstr(*vp++, 1);
185: *tvp = NULL;
186: return (nvp);
187: }
188:
189: /* end of sh/alloc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.