infinite loop in child()
[unix-history] / usr / src / bin / csh / misc.c
CommitLineData
d33af40e 1static char *sccsid = "@(#)misc.c 4.3 %G%";
cf8f66fb
BJ
2
3#include "sh.h"
4
5/*
6 * C Shell
7 */
8
9letter(c)
10 register char c;
11{
12
13 return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
14}
15
16digit(c)
17 register char c;
18{
19
20 return (c >= '0' && c <= '9');
21}
22
23alnum(c)
24 register char c;
25{
26 return (letter(c) || digit(c));
27}
28
29any(c, s)
30 register int c;
31 register char *s;
32{
33
34 while (*s)
35 if (*s++ == c)
36 return(1);
37 return(0);
38}
39
40char *
41calloc(i, j)
42 register unsigned i;
43 unsigned j;
44{
45 register char *cp, *dp;
46#ifdef debug
47 static char *av[2] = {0, 0};
48#endif
49
50 i *= j;
51 cp = (char *) malloc(i);
52 if (cp == 0) {
53 child++;
54#ifndef debug
55 error("Out of memory");
56#else
57 showall(av);
58 printf("i=%d, j=%d: ", i/j, j);
59 printf("Out of memory\n");
60 chdir("/usr/bill/cshcore");
61 abort();
62#endif
63 }
64 dp = cp;
65 if (i != 0)
66 do
67 *dp++ = 0;
68 while (--i);
69 return (cp);
70}
71
cf8f66fb
BJ
72char **
73blkend(up)
74 register char **up;
75{
76
77 while (*up)
78 up++;
79 return (up);
80}
81
82blkpr(av)
83 register char **av;
84{
85
86 for (; *av; av++) {
87 printf("%s", *av);
88 if (av[1])
89 printf(" ");
90 }
91}
92
93blklen(av)
94 register char **av;
95{
96 register int i = 0;
97
98 while (*av++)
99 i++;
100 return (i);
101}
102
103char **
104blkcpy(oav, bv)
105 char **oav;
106 register char **bv;
107{
108 register char **av = oav;
109
110 while (*av++ = *bv++)
111 continue;
112 return (oav);
113}
114
115char **
116blkcat(up, vp)
117 char **up, **vp;
118{
119
120 blkcpy(blkend(up), vp);
121 return (up);
122}
123
124blkfree(av0)
125 char **av0;
126{
127 register char **av = av0;
128
129 while (*av)
130 xfree(*av++);
131 xfree((char *)av0);
132}
133
134char **
135saveblk(v)
136 register char **v;
137{
138 register int len = blklen(v) + 1;
139 register char **newv = (char **) calloc(len, sizeof (char **));
140 char **onewv = newv;
141
142 while (*v)
143 *newv++ = savestr(*v++);
144 return (onewv);
145}
146
147char *
148strspl(cp, dp)
149 register char *cp, *dp;
150{
151 register char *ep = calloc(1, strlen(cp) + strlen(dp) + 1);
152
153 strcpy(ep, cp);
154 strcat(ep, dp);
155 return (ep);
156}
157
158char **
159blkspl(up, vp)
160 register char **up, **vp;
161{
162 register char **wp = (char **) calloc(blklen(up) + blklen(vp) + 1, sizeof (char **));
163
164 blkcpy(wp, up);
165 return (blkcat(wp, vp));
166}
167
168lastchr(cp)
169 register char *cp;
170{
171
172 if (!*cp)
173 return (0);
174 while (cp[1])
175 cp++;
176 return (*cp);
177}
178
179/*
180 * This routine is called after an error to close up
181 * any units which may have been left open accidentally.
182 */
183closem()
184{
185 register int f;
186
187 for (f = 0; f < NOFILE; f++)
188 if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
189 f != FSHTTY)
190 close(f);
191}
192
193/*
194 * Close files before executing a file.
195 * We could be MUCH more intelligent, since (on a version 7 system)
196 * we need only close files here during a source, the other
197 * shell fd's being in units 16-19 which are closed automatically!
198 */
199closech()
200{
201 register int f;
202
203 if (didcch)
204 return;
205 didcch = 1;
206 SHIN = 0; SHOUT = 1; SHDIAG = 2; OLDSTD = 0;
207 for (f = 3; f < NOFILE; f++)
208 close(f);
209}
210
211donefds()
212{
213
214 close(0), close(1), close(2);
215 didfds = 0;
216}
217
218/*
219 * Move descriptor i to j.
220 * If j is -1 then we just want to get i to a safe place,
221 * i.e. to a unit > 2. This also happens in dcopy.
222 */
223dmove(i, j)
224 register int i, j;
225{
226
227 if (i == j || i < 0)
228 return (i);
229#ifdef V7
230 if (j >= 0) {
231 dup2(i, j);
232 return (j);
233 } else
234#endif
235 j = dcopy(i, j);
236 if (j != i)
237 close(i);
238 return (j);
239}
240
241dcopy(i, j)
242 register int i, j;
243{
244
245 if (i == j || i < 0 || j < 0 && i > 2)
246 return (i);
247#ifdef V7
248 if (j >= 0) {
249 dup2(i, j);
250 return (j);
251 }
252#endif
253 close(j);
254 return (renum(i, j));
255}
256
257renum(i, j)
258 register int i, j;
259{
260 register int k = dup(i);
261
262 if (k < 0)
263 return (-1);
264 if (j == -1 && k > 2)
265 return (k);
266 if (k != j) {
267 j = renum(k, j);
268 close(k);
269 return (j);
270 }
271 return (k);
272}
273
a6f57ddd 274#ifndef copy
cf8f66fb
BJ
275copy(to, from, size)
276 register char *to, *from;
277 register int size;
278{
279
280 if (size)
281 do
282 *to++ = *from++;
283 while (--size != 0);
284}
a6f57ddd 285#endif
cf8f66fb
BJ
286
287/*
288 * Left shift a command argument list, discarding
289 * the first c arguments. Used in "shift" commands
290 * as well as by commands like "repeat".
291 */
292lshift(v, c)
293 register char **v;
294 register int c;
295{
296 register char **u = v;
297
298 while (*u && --c >= 0)
299 xfree(*u++);
300 blkcpy(v, u);
301}
302
303number(cp)
304 char *cp;
305{
306
307 if (*cp == '-') {
308 cp++;
309 if (!digit(*cp++))
310 return (0);
311 }
312 while (*cp && digit(*cp))
313 cp++;
314 return (*cp == 0);
315}
316
317char **
318copyblk(v)
319 register char **v;
320{
321 register char **nv = (char **) calloc(blklen(v) + 1, sizeof (char **));
322
323 return (blkcpy(nv, v));
324}
325
326char *
327strend(cp)
328 register char *cp;
329{
330
331 while (*cp)
332 cp++;
333 return (cp);
334}
335
336char *
337strip(cp)
338 char *cp;
339{
340 register char *dp = cp;
341
342 while (*dp++ &= TRIM)
343 continue;
344 return (cp);
345}
346
347udvar(name)
348 char *name;
349{
350
351 setname(name);
352 bferr("Undefined variable");
353}
354
355prefix(sub, str)
356 register char *sub, *str;
357{
358
359 for (;;) {
360 if (*sub == 0)
361 return (1);
362 if (*str == 0)
363 return (0);
364 if (*sub++ != *str++)
365 return (0);
366 }
367}