We need strstr now...
[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
4734a71b 9static 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 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 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
67Char **
68blkend(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 78void
454c2aa3
CZ
79blkpr(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 91int
cf8f66fb 92blklen(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 102Char **
cf8f66fb 103blkcpy(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 114Char **
cf8f66fb 115blkcat(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 123void
cf8f66fb 124blkfree(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 136Char **
cf8f66fb 137saveblk(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
150char *
151strstr(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
169char *
cf8f66fb 170strspl(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
194Char **
cf8f66fb 195blkspl(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 206Char
cf8f66fb 207lastchr(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 224void
cf8f66fb
BJ
225closem()
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 235void
cf8f66fb
BJ
236donefds()
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 250int
cf8f66fb 251dmove(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 269int
cf8f66fb 270dcopy(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 284static int
cf8f66fb 285renum(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 307void
cf8f66fb 308lshift(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 319int
cf8f66fb 320number(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 336Char **
cf8f66fb 337copyblk(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
346char *
cf8f66fb 347strend(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
359Char *
cf8f66fb 360strip(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 372void
cf8f66fb 373udvar(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 381int
cf8f66fb 382prefix(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}