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