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