Commit | Line | Data |
---|---|---|
ecc449eb KB |
1 | /*- |
2 | * Copyright (c) 1980, 1991 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * %sccs.include.redist.c% | |
b79f4fa9 DF |
6 | */ |
7 | ||
35371dec | 8 | #ifndef lint |
4734a71b | 9 | static char sccsid[] = "@(#)misc.c 5.17 (Berkeley) %G%"; |
ecc449eb | 10 | #endif /* not lint */ |
cf8f66fb | 11 | |
b9c4f741 KB |
12 | #include <sys/param.h> |
13 | #include <stdlib.h> | |
14 | #include <unistd.h> | |
4df6491c CZ |
15 | #if __STDC__ |
16 | # include <stdarg.h> | |
17 | #else | |
18 | # include <varargs.h> | |
19 | #endif | |
20 | ||
4d7b2685 KB |
21 | #include "csh.h" |
22 | #include "extern.h" | |
cf8f66fb | 23 | |
0aec749d | 24 | static int renum __P((int, int)); |
35371dec | 25 | |
6e37afca KB |
26 | int |
27 | any(s, c) | |
28 | register char *s; | |
29 | register int c; | |
35371dec | 30 | { |
6e37afca KB |
31 | if (!s) |
32 | return (0); /* Check for nil pointer */ | |
33 | while (*s) | |
34 | if (*s++ == c) | |
35 | return (1); | |
36 | return (0); | |
35371dec EW |
37 | } |
38 | ||
6e37afca KB |
39 | void |
40 | setzero(cp, i) | |
41 | char *cp; | |
42 | int i; | |
35371dec | 43 | { |
6e37afca KB |
44 | if (i != 0) |
45 | do | |
46 | *cp++ = 0; | |
47 | while (--i); | |
35371dec EW |
48 | } |
49 | ||
6e37afca KB |
50 | char * |
51 | strsave(s) | |
52 | register char *s; | |
cf8f66fb | 53 | { |
6e37afca KB |
54 | char *n; |
55 | register char *p; | |
56 | ||
4d7b2685 | 57 | if (s == NULL) |
6e37afca | 58 | s = ""; |
c28e64a2 CL |
59 | for (p = s; *p++;) |
60 | continue; | |
6e37afca | 61 | n = p = (char *) xmalloc((size_t) ((p - s) * sizeof(char))); |
c28e64a2 CL |
62 | while (*p++ = *s++) |
63 | continue; | |
6e37afca | 64 | return (n); |
cf8f66fb BJ |
65 | } |
66 | ||
6e37afca KB |
67 | Char ** |
68 | blkend(up) | |
69 | register Char **up; | |
35371dec | 70 | { |
35371dec | 71 | |
6e37afca KB |
72 | while (*up) |
73 | up++; | |
74 | return (up); | |
35371dec EW |
75 | } |
76 | ||
cf8f66fb | 77 | |
6e37afca | 78 | void |
454c2aa3 CZ |
79 | blkpr(fp, av) |
80 | FILE *fp; | |
6e37afca | 81 | register Char **av; |
cf8f66fb BJ |
82 | { |
83 | ||
6e37afca | 84 | for (; *av; av++) { |
454c2aa3 | 85 | (void) fprintf(fp, "%s", short2str(*av)); |
6e37afca | 86 | if (av[1]) |
454c2aa3 | 87 | (void) fprintf(fp, " "); |
6e37afca | 88 | } |
cf8f66fb BJ |
89 | } |
90 | ||
6e37afca | 91 | int |
cf8f66fb | 92 | blklen(av) |
6e37afca | 93 | register Char **av; |
cf8f66fb | 94 | { |
6e37afca | 95 | register int i = 0; |
cf8f66fb | 96 | |
6e37afca KB |
97 | while (*av++) |
98 | i++; | |
99 | return (i); | |
cf8f66fb BJ |
100 | } |
101 | ||
6e37afca | 102 | Char ** |
cf8f66fb | 103 | blkcpy(oav, bv) |
6e37afca KB |
104 | Char **oav; |
105 | register Char **bv; | |
cf8f66fb | 106 | { |
6e37afca | 107 | register Char **av = oav; |
cf8f66fb | 108 | |
6e37afca KB |
109 | while (*av++ = *bv++) |
110 | continue; | |
111 | return (oav); | |
cf8f66fb BJ |
112 | } |
113 | ||
6e37afca | 114 | Char ** |
cf8f66fb | 115 | blkcat(up, vp) |
6e37afca | 116 | Char **up, **vp; |
cf8f66fb BJ |
117 | { |
118 | ||
6e37afca KB |
119 | (void) blkcpy(blkend(up), vp); |
120 | return (up); | |
cf8f66fb BJ |
121 | } |
122 | ||
6e37afca | 123 | void |
cf8f66fb | 124 | blkfree(av0) |
6e37afca | 125 | Char **av0; |
cf8f66fb | 126 | { |
6e37afca | 127 | register Char **av = av0; |
cf8f66fb | 128 | |
6e37afca KB |
129 | if (!av0) |
130 | return; | |
131 | for (; *av; av++) | |
132 | xfree((ptr_t) * av); | |
133 | xfree((ptr_t) av0); | |
cf8f66fb BJ |
134 | } |
135 | ||
6e37afca | 136 | Char ** |
cf8f66fb | 137 | saveblk(v) |
6e37afca | 138 | register Char **v; |
cf8f66fb | 139 | { |
6e37afca KB |
140 | register Char **newv = |
141 | (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); | |
142 | Char **onewv = newv; | |
143 | ||
144 | while (*v) | |
145 | *newv++ = Strsave(*v++); | |
146 | return (onewv); | |
147 | } | |
cf8f66fb | 148 | |
171af061 | 149 | #ifdef NOTUSED |
6e37afca KB |
150 | char * |
151 | strstr(s, t) | |
152 | register char *s, *t; | |
153 | { | |
154 | do { | |
155 | register char *ss = s; | |
156 | register char *tt = t; | |
157 | ||
158 | do | |
159 | if (*tt == '\0') | |
160 | return (s); | |
161 | while (*ss++ == *tt++); | |
162 | } while (*s++ != '\0'); | |
0aec749d | 163 | return (NULL); |
cf8f66fb BJ |
164 | } |
165 | ||
171af061 | 166 | #endif /* NOTUSED */ |
6e37afca KB |
167 | |
168 | #ifndef SHORT_STRINGS | |
169 | char * | |
cf8f66fb | 170 | strspl(cp, dp) |
6e37afca | 171 | char *cp, *dp; |
cf8f66fb | 172 | { |
6e37afca KB |
173 | char *ep; |
174 | register char *p, *q; | |
175 | ||
176 | if (!cp) | |
177 | cp = ""; | |
178 | if (!dp) | |
179 | dp = ""; | |
c28e64a2 CL |
180 | for (p = cp; *p++;) |
181 | continue; | |
182 | for (q = dp; *q++;) | |
183 | continue; | |
6e37afca | 184 | ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char))); |
c28e64a2 CL |
185 | for (p = ep, q = cp; *p++ = *q++;) |
186 | continue; | |
187 | for (p--, q = dp; *p++ = *q++;) | |
188 | continue; | |
6e37afca | 189 | return (ep); |
cf8f66fb BJ |
190 | } |
191 | ||
6e37afca KB |
192 | #endif |
193 | ||
194 | Char ** | |
cf8f66fb | 195 | blkspl(up, vp) |
6e37afca | 196 | register Char **up, **vp; |
cf8f66fb | 197 | { |
6e37afca KB |
198 | register Char **wp = |
199 | (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1), | |
200 | sizeof(Char **)); | |
cf8f66fb | 201 | |
6e37afca KB |
202 | (void) blkcpy(wp, up); |
203 | return (blkcat(wp, vp)); | |
cf8f66fb BJ |
204 | } |
205 | ||
6e37afca | 206 | Char |
cf8f66fb | 207 | lastchr(cp) |
6e37afca | 208 | register Char *cp; |
cf8f66fb BJ |
209 | { |
210 | ||
6e37afca KB |
211 | if (!cp) |
212 | return (0); | |
213 | if (!*cp) | |
214 | return (0); | |
215 | while (cp[1]) | |
216 | cp++; | |
217 | return (*cp); | |
cf8f66fb BJ |
218 | } |
219 | ||
220 | /* | |
221 | * This routine is called after an error to close up | |
222 | * any units which may have been left open accidentally. | |
223 | */ | |
6e37afca | 224 | void |
cf8f66fb BJ |
225 | closem() |
226 | { | |
6e37afca | 227 | register int f; |
cf8f66fb | 228 | |
6e37afca | 229 | for (f = 0; f < NOFILE; f++) |
454c2aa3 | 230 | if (f != SHIN && f != SHOUT && f != SHERR && f != OLDSTD && |
6e37afca KB |
231 | f != FSHTTY) |
232 | (void) close(f); | |
cf8f66fb BJ |
233 | } |
234 | ||
6e37afca | 235 | void |
cf8f66fb BJ |
236 | donefds() |
237 | { | |
6e37afca KB |
238 | (void) close(0); |
239 | (void) close(1); | |
240 | (void) close(2); | |
454c2aa3 | 241 | |
6e37afca | 242 | didfds = 0; |
cf8f66fb BJ |
243 | } |
244 | ||
245 | /* | |
246 | * Move descriptor i to j. | |
247 | * If j is -1 then we just want to get i to a safe place, | |
248 | * i.e. to a unit > 2. This also happens in dcopy. | |
249 | */ | |
6e37afca | 250 | int |
cf8f66fb | 251 | dmove(i, j) |
6e37afca | 252 | register int i, j; |
cf8f66fb BJ |
253 | { |
254 | ||
6e37afca KB |
255 | if (i == j || i < 0) |
256 | return (i); | |
257 | if (j >= 0) { | |
258 | (void) dup2(i, j); | |
21df6530 CZ |
259 | if (j != i) |
260 | (void) close(i); | |
cf8f66fb | 261 | return (j); |
6e37afca KB |
262 | } |
263 | j = dcopy(i, j); | |
264 | if (j != i) | |
265 | (void) close(i); | |
266 | return (j); | |
cf8f66fb BJ |
267 | } |
268 | ||
6e37afca | 269 | int |
cf8f66fb | 270 | dcopy(i, j) |
6e37afca | 271 | register int i, j; |
cf8f66fb BJ |
272 | { |
273 | ||
6e37afca KB |
274 | if (i == j || i < 0 || j < 0 && i > 2) |
275 | return (i); | |
276 | if (j >= 0) { | |
277 | (void) dup2(i, j); | |
278 | return (j); | |
279 | } | |
280 | (void) close(j); | |
281 | return (renum(i, j)); | |
cf8f66fb BJ |
282 | } |
283 | ||
6e37afca | 284 | static int |
cf8f66fb | 285 | renum(i, j) |
6e37afca | 286 | register int i, j; |
cf8f66fb | 287 | { |
6e37afca KB |
288 | register int k = dup(i); |
289 | ||
290 | if (k < 0) | |
291 | return (-1); | |
292 | if (j == -1 && k > 2) | |
cf8f66fb | 293 | return (k); |
6e37afca KB |
294 | if (k != j) { |
295 | j = renum(k, j); | |
296 | (void) close(k); | |
297 | return (j); | |
298 | } | |
299 | return (k); | |
cf8f66fb BJ |
300 | } |
301 | ||
cf8f66fb BJ |
302 | /* |
303 | * Left shift a command argument list, discarding | |
304 | * the first c arguments. Used in "shift" commands | |
305 | * as well as by commands like "repeat". | |
306 | */ | |
6e37afca | 307 | void |
cf8f66fb | 308 | lshift(v, c) |
6e37afca KB |
309 | register Char **v; |
310 | register int c; | |
cf8f66fb | 311 | { |
f52b9180 | 312 | register Char **u; |
cf8f66fb | 313 | |
f52b9180 CZ |
314 | for (u = v; *u && --c >= 0; u++) |
315 | xfree((ptr_t) *u); | |
6e37afca | 316 | (void) blkcpy(v, u); |
cf8f66fb BJ |
317 | } |
318 | ||
6e37afca | 319 | int |
cf8f66fb | 320 | number(cp) |
6e37afca | 321 | Char *cp; |
cf8f66fb | 322 | { |
6e37afca KB |
323 | if (!cp) |
324 | return(0); | |
325 | if (*cp == '-') { | |
326 | cp++; | |
327 | if (!Isdigit(*cp)) | |
328 | return (0); | |
329 | cp++; | |
330 | } | |
331 | while (*cp && Isdigit(*cp)) | |
332 | cp++; | |
333 | return (*cp == 0); | |
cf8f66fb BJ |
334 | } |
335 | ||
6e37afca | 336 | Char ** |
cf8f66fb | 337 | copyblk(v) |
6e37afca | 338 | register Char **v; |
cf8f66fb | 339 | { |
6e37afca | 340 | Char **nv = (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); |
cf8f66fb | 341 | |
6e37afca | 342 | return (blkcpy(nv, v)); |
cf8f66fb BJ |
343 | } |
344 | ||
6e37afca KB |
345 | #ifndef SHORT_STRINGS |
346 | char * | |
cf8f66fb | 347 | strend(cp) |
6e37afca | 348 | register char *cp; |
cf8f66fb | 349 | { |
6e37afca | 350 | if (!cp) |
cf8f66fb | 351 | return (cp); |
6e37afca KB |
352 | while (*cp) |
353 | cp++; | |
354 | return (cp); | |
cf8f66fb BJ |
355 | } |
356 | ||
6e37afca KB |
357 | #endif /* SHORT_STRINGS */ |
358 | ||
359 | Char * | |
cf8f66fb | 360 | strip(cp) |
6e37afca | 361 | Char *cp; |
cf8f66fb | 362 | { |
6e37afca | 363 | register Char *dp = cp; |
cf8f66fb | 364 | |
6e37afca | 365 | if (!cp) |
cf8f66fb | 366 | return (cp); |
6e37afca KB |
367 | while (*dp++ &= TRIM) |
368 | continue; | |
369 | return (cp); | |
cf8f66fb BJ |
370 | } |
371 | ||
6e37afca | 372 | void |
cf8f66fb | 373 | udvar(name) |
6e37afca | 374 | Char *name; |
cf8f66fb BJ |
375 | { |
376 | ||
6e37afca KB |
377 | setname(short2str(name)); |
378 | stderror(ERR_NAME | ERR_UNDVAR); | |
cf8f66fb BJ |
379 | } |
380 | ||
6e37afca | 381 | int |
cf8f66fb | 382 | prefix(sub, str) |
6e37afca | 383 | register Char *sub, *str; |
cf8f66fb BJ |
384 | { |
385 | ||
6e37afca KB |
386 | for (;;) { |
387 | if (*sub == 0) | |
388 | return (1); | |
389 | if (*str == 0) | |
390 | return (0); | |
391 | if (*sub++ != *str++) | |
392 | return (0); | |
393 | } | |
cf8f66fb | 394 | } |