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