fix xfree() so it can be re-written as a macro
[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
f52b9180 9static 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 24static int renum __P((int, int));
35371dec 25
6e37afca
KB
26int
27any(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
39void
40setzero(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
50char *
51strsave(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
65Char **
66blkend(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 76void
454c2aa3
CZ
77blkpr(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 89int
cf8f66fb 90blklen(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 100Char **
cf8f66fb 101blkcpy(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 112Char **
cf8f66fb 113blkcat(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 121void
cf8f66fb 122blkfree(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 134Char **
cf8f66fb 135saveblk(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
148char *
149strstr(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
167char *
cf8f66fb 168strspl(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
188Char **
cf8f66fb 189blkspl(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 200Char
cf8f66fb 201lastchr(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 218void
cf8f66fb
BJ
219closem()
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 229void
cf8f66fb
BJ
230donefds()
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 244int
cf8f66fb 245dmove(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 263int
cf8f66fb 264dcopy(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 278static int
cf8f66fb 279renum(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 301void
cf8f66fb 302lshift(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 313int
cf8f66fb 314number(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 330Char **
cf8f66fb 331copyblk(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
340char *
cf8f66fb 341strend(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
353Char *
cf8f66fb 354strip(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 366void
cf8f66fb 367udvar(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 375int
cf8f66fb 376prefix(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}