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