rename all the files (they weren't going to diff anyway)
[unix-history] / usr / src / bin / csh / misc.c
CommitLineData
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 9static 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 15static int renum();
35371dec 16
6e37afca
KB
17int
18any(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
30void
31setzero(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
41char *
42strsave(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
56Char **
57blkend(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 67void
cf8f66fb 68blkpr(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 79int
cf8f66fb 80blklen(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 90Char **
cf8f66fb 91blkcpy(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 102Char **
cf8f66fb 103blkcat(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 111void
cf8f66fb 112blkfree(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 124Char **
cf8f66fb 125saveblk(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
138char *
139strstr(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
157char *
cf8f66fb 158strspl(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
178Char **
cf8f66fb 179blkspl(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 190Char
cf8f66fb 191lastchr(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 208void
cf8f66fb
BJ
209closem()
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 219void
cf8f66fb
BJ
220donefds()
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 234int
cf8f66fb 235dmove(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 251int
cf8f66fb 252dcopy(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 266static int
cf8f66fb 267renum(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 289void
cf8f66fb 290lshift(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 301int
cf8f66fb 302number(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 318Char **
cf8f66fb 319copyblk(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
328char *
cf8f66fb 329strend(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
341Char *
cf8f66fb 342strip(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 354void
cf8f66fb 355udvar(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 363int
cf8f66fb 364prefix(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}