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