xref: /freebsd/contrib/tcsh/sh.misc.c (revision 2930157267fc56387bb43acf5bb441a84ff6e765)
129301572SMark Peek /* $Header: /src/pub/tcsh/sh.misc.c,v 3.24 2002/03/08 17:36:46 christos Exp $ */
2c80476e4SDavid E. O'Brien /*
3c80476e4SDavid E. O'Brien  * sh.misc.c: Miscelaneous functions
4c80476e4SDavid E. O'Brien  */
5c80476e4SDavid E. O'Brien /*-
6c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
7c80476e4SDavid E. O'Brien  * All rights reserved.
8c80476e4SDavid E. O'Brien  *
9c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
10c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
11c80476e4SDavid E. O'Brien  * are met:
12c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
13c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
14c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
15c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
16c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
1729301572SMark Peek  * 3. Neither the name of the University nor the names of its contributors
18c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
19c80476e4SDavid E. O'Brien  *    without specific prior written permission.
20c80476e4SDavid E. O'Brien  *
21c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
32c80476e4SDavid E. O'Brien  */
33c80476e4SDavid E. O'Brien #include "sh.h"
34c80476e4SDavid E. O'Brien 
3529301572SMark Peek RCSID("$Id: sh.misc.c,v 3.24 2002/03/08 17:36:46 christos Exp $")
36c80476e4SDavid E. O'Brien 
37c80476e4SDavid E. O'Brien static	int	renum	__P((int, int));
38c80476e4SDavid E. O'Brien static  Char  **blkend	__P((Char **));
39c80476e4SDavid E. O'Brien static  Char  **blkcat	__P((Char **, Char **));
40c80476e4SDavid E. O'Brien 
41c80476e4SDavid E. O'Brien /*
42c80476e4SDavid E. O'Brien  * C Shell
43c80476e4SDavid E. O'Brien  */
44c80476e4SDavid E. O'Brien 
45c80476e4SDavid E. O'Brien int
46c80476e4SDavid E. O'Brien any(s, c)
47c80476e4SDavid E. O'Brien     register char *s;
48c80476e4SDavid E. O'Brien     register int c;
49c80476e4SDavid E. O'Brien {
50c80476e4SDavid E. O'Brien     if (!s)
51c80476e4SDavid E. O'Brien 	return (0);		/* Check for nil pointer */
52c80476e4SDavid E. O'Brien     while (*s)
53c80476e4SDavid E. O'Brien 	if (*s++ == c)
54c80476e4SDavid E. O'Brien 	    return (1);
55c80476e4SDavid E. O'Brien     return (0);
56c80476e4SDavid E. O'Brien }
57c80476e4SDavid E. O'Brien 
58c80476e4SDavid E. O'Brien void
59c80476e4SDavid E. O'Brien setzero(cp, i)
60c80476e4SDavid E. O'Brien     char   *cp;
61c80476e4SDavid E. O'Brien     int     i;
62c80476e4SDavid E. O'Brien {
63c80476e4SDavid E. O'Brien     if (i != 0)
64c80476e4SDavid E. O'Brien 	do
65c80476e4SDavid E. O'Brien 	    *cp++ = 0;
66c80476e4SDavid E. O'Brien 	while (--i);
67c80476e4SDavid E. O'Brien }
68c80476e4SDavid E. O'Brien 
69c80476e4SDavid E. O'Brien char   *
70c80476e4SDavid E. O'Brien strsave(s)
71c80476e4SDavid E. O'Brien     register const char *s;
72c80476e4SDavid E. O'Brien {
73c80476e4SDavid E. O'Brien     char   *n;
74c80476e4SDavid E. O'Brien     register char *p;
75c80476e4SDavid E. O'Brien 
76c80476e4SDavid E. O'Brien     if (s == NULL)
77c80476e4SDavid E. O'Brien 	s = (const char *) "";
78c80476e4SDavid E. O'Brien     for (p = (char *) s; *p++ != '\0';)
79c80476e4SDavid E. O'Brien 	continue;
80c80476e4SDavid E. O'Brien     n = p = (char *) xmalloc((size_t)
81c80476e4SDavid E. O'Brien 			     ((((const char *) p) - s) * sizeof(char)));
82c80476e4SDavid E. O'Brien     while ((*p++ = *s++) != '\0')
83c80476e4SDavid E. O'Brien 	continue;
84c80476e4SDavid E. O'Brien     return (n);
85c80476e4SDavid E. O'Brien }
86c80476e4SDavid E. O'Brien 
87c80476e4SDavid E. O'Brien static Char  **
88c80476e4SDavid E. O'Brien blkend(up)
89c80476e4SDavid E. O'Brien     register Char **up;
90c80476e4SDavid E. O'Brien {
91c80476e4SDavid E. O'Brien 
92c80476e4SDavid E. O'Brien     while (*up)
93c80476e4SDavid E. O'Brien 	up++;
94c80476e4SDavid E. O'Brien     return (up);
95c80476e4SDavid E. O'Brien }
96c80476e4SDavid E. O'Brien 
97c80476e4SDavid E. O'Brien 
98c80476e4SDavid E. O'Brien void
99c80476e4SDavid E. O'Brien blkpr(av)
100c80476e4SDavid E. O'Brien     register Char **av;
101c80476e4SDavid E. O'Brien {
102c80476e4SDavid E. O'Brien 
103c80476e4SDavid E. O'Brien     for (; *av; av++) {
104c80476e4SDavid E. O'Brien 	xprintf("%S", *av);
105c80476e4SDavid E. O'Brien 	if (av[1])
106c80476e4SDavid E. O'Brien 	    xprintf(" ");
107c80476e4SDavid E. O'Brien     }
108c80476e4SDavid E. O'Brien }
109c80476e4SDavid E. O'Brien 
110c80476e4SDavid E. O'Brien void
111c80476e4SDavid E. O'Brien blkexpand(av, str)
112c80476e4SDavid E. O'Brien     register Char **av;
113c80476e4SDavid E. O'Brien     Char *str;
114c80476e4SDavid E. O'Brien {
115c80476e4SDavid E. O'Brien     *str = '\0';
116c80476e4SDavid E. O'Brien     for (; *av; av++) {
117c80476e4SDavid E. O'Brien 	(void) Strcat(str, *av);
118c80476e4SDavid E. O'Brien 	if (av[1])
119c80476e4SDavid E. O'Brien 	    (void) Strcat(str, STRspace);
120c80476e4SDavid E. O'Brien     }
121c80476e4SDavid E. O'Brien }
122c80476e4SDavid E. O'Brien 
123c80476e4SDavid E. O'Brien int
124c80476e4SDavid E. O'Brien blklen(av)
125c80476e4SDavid E. O'Brien     register Char **av;
126c80476e4SDavid E. O'Brien {
127c80476e4SDavid E. O'Brien     register int i = 0;
128c80476e4SDavid E. O'Brien 
129c80476e4SDavid E. O'Brien     while (*av++)
130c80476e4SDavid E. O'Brien 	i++;
131c80476e4SDavid E. O'Brien     return (i);
132c80476e4SDavid E. O'Brien }
133c80476e4SDavid E. O'Brien 
134c80476e4SDavid E. O'Brien Char  **
135c80476e4SDavid E. O'Brien blkcpy(oav, bv)
136c80476e4SDavid E. O'Brien     Char  **oav;
137c80476e4SDavid E. O'Brien     register Char **bv;
138c80476e4SDavid E. O'Brien {
139c80476e4SDavid E. O'Brien     register Char **av = oav;
140c80476e4SDavid E. O'Brien 
141c80476e4SDavid E. O'Brien     while ((*av++ = *bv++) != NULL)
142c80476e4SDavid E. O'Brien 	continue;
143c80476e4SDavid E. O'Brien     return (oav);
144c80476e4SDavid E. O'Brien }
145c80476e4SDavid E. O'Brien 
146c80476e4SDavid E. O'Brien static Char  **
147c80476e4SDavid E. O'Brien blkcat(up, vp)
148c80476e4SDavid E. O'Brien     Char  **up, **vp;
149c80476e4SDavid E. O'Brien {
150c80476e4SDavid E. O'Brien 
151c80476e4SDavid E. O'Brien     (void) blkcpy(blkend(up), vp);
152c80476e4SDavid E. O'Brien     return (up);
153c80476e4SDavid E. O'Brien }
154c80476e4SDavid E. O'Brien 
155c80476e4SDavid E. O'Brien void
156c80476e4SDavid E. O'Brien blkfree(av0)
157c80476e4SDavid E. O'Brien     Char  **av0;
158c80476e4SDavid E. O'Brien {
159c80476e4SDavid E. O'Brien     register Char **av = av0;
160c80476e4SDavid E. O'Brien 
161c80476e4SDavid E. O'Brien     if (!av0)
162c80476e4SDavid E. O'Brien 	return;
163c80476e4SDavid E. O'Brien     for (; *av; av++)
164c80476e4SDavid E. O'Brien 	xfree((ptr_t) * av);
165c80476e4SDavid E. O'Brien     xfree((ptr_t) av0);
166c80476e4SDavid E. O'Brien }
167c80476e4SDavid E. O'Brien 
168c80476e4SDavid E. O'Brien Char  **
169c80476e4SDavid E. O'Brien saveblk(v)
170c80476e4SDavid E. O'Brien     register Char **v;
171c80476e4SDavid E. O'Brien {
172c80476e4SDavid E. O'Brien     register Char **newv =
173c80476e4SDavid E. O'Brien     (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
174c80476e4SDavid E. O'Brien     Char  **onewv = newv;
175c80476e4SDavid E. O'Brien 
176c80476e4SDavid E. O'Brien     while (*v)
177c80476e4SDavid E. O'Brien 	*newv++ = Strsave(*v++);
178c80476e4SDavid E. O'Brien     return (onewv);
179c80476e4SDavid E. O'Brien }
180c80476e4SDavid E. O'Brien 
181c80476e4SDavid E. O'Brien #if !defined(SHORT_STRINGS) && !defined(POSIX)
182c80476e4SDavid E. O'Brien char   *
183c80476e4SDavid E. O'Brien strstr(s, t)
184c80476e4SDavid E. O'Brien     register const char *s, *t;
185c80476e4SDavid E. O'Brien {
186c80476e4SDavid E. O'Brien     do {
187c80476e4SDavid E. O'Brien 	register const char *ss = s;
188c80476e4SDavid E. O'Brien 	register const char *tt = t;
189c80476e4SDavid E. O'Brien 
190c80476e4SDavid E. O'Brien 	do
191c80476e4SDavid E. O'Brien 	    if (*tt == '\0')
192c80476e4SDavid E. O'Brien 		return ((char *) s);
193c80476e4SDavid E. O'Brien 	while (*ss++ == *tt++);
194c80476e4SDavid E. O'Brien     } while (*s++ != '\0');
195c80476e4SDavid E. O'Brien     return (NULL);
196c80476e4SDavid E. O'Brien }
197c80476e4SDavid E. O'Brien 
198c80476e4SDavid E. O'Brien #endif /* !SHORT_STRINGS && !POSIX */
199c80476e4SDavid E. O'Brien 
200c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
201c80476e4SDavid E. O'Brien char   *
202c80476e4SDavid E. O'Brien strspl(cp, dp)
203c80476e4SDavid E. O'Brien     char   *cp, *dp;
204c80476e4SDavid E. O'Brien {
205c80476e4SDavid E. O'Brien     char   *ep;
206c80476e4SDavid E. O'Brien     register char *p, *q;
207c80476e4SDavid E. O'Brien 
208c80476e4SDavid E. O'Brien     if (!cp)
209c80476e4SDavid E. O'Brien 	cp = "";
210c80476e4SDavid E. O'Brien     if (!dp)
211c80476e4SDavid E. O'Brien 	dp = "";
212c80476e4SDavid E. O'Brien     for (p = cp; *p++ != '\0';)
213c80476e4SDavid E. O'Brien 	continue;
214c80476e4SDavid E. O'Brien     for (q = dp; *q++ != '\0';)
215c80476e4SDavid E. O'Brien 	continue;
216c80476e4SDavid E. O'Brien     ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char)));
217c80476e4SDavid E. O'Brien     for (p = ep, q = cp; (*p++ = *q++) != '\0';)
218c80476e4SDavid E. O'Brien 	continue;
219c80476e4SDavid E. O'Brien     for (p--, q = dp; (*p++ = *q++) != '\0';)
220c80476e4SDavid E. O'Brien 	continue;
221c80476e4SDavid E. O'Brien     return (ep);
222c80476e4SDavid E. O'Brien }
223c80476e4SDavid E. O'Brien 
224c80476e4SDavid E. O'Brien #endif /* !SHORT_STRINGS */
225c80476e4SDavid E. O'Brien 
226c80476e4SDavid E. O'Brien Char  **
227c80476e4SDavid E. O'Brien blkspl(up, vp)
228c80476e4SDavid E. O'Brien     register Char **up, **vp;
229c80476e4SDavid E. O'Brien {
230c80476e4SDavid E. O'Brien     register Char **wp =
231c80476e4SDavid E. O'Brien     (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1),
232c80476e4SDavid E. O'Brien 		      sizeof(Char **));
233c80476e4SDavid E. O'Brien 
234c80476e4SDavid E. O'Brien     (void) blkcpy(wp, up);
235c80476e4SDavid E. O'Brien     return (blkcat(wp, vp));
236c80476e4SDavid E. O'Brien }
237c80476e4SDavid E. O'Brien 
238c80476e4SDavid E. O'Brien Char
239c80476e4SDavid E. O'Brien lastchr(cp)
240c80476e4SDavid E. O'Brien     register Char *cp;
241c80476e4SDavid E. O'Brien {
242c80476e4SDavid E. O'Brien 
243c80476e4SDavid E. O'Brien     if (!cp)
244c80476e4SDavid E. O'Brien 	return (0);
245c80476e4SDavid E. O'Brien     if (!*cp)
246c80476e4SDavid E. O'Brien 	return (0);
247c80476e4SDavid E. O'Brien     while (cp[1])
248c80476e4SDavid E. O'Brien 	cp++;
249c80476e4SDavid E. O'Brien     return (*cp);
250c80476e4SDavid E. O'Brien }
251c80476e4SDavid E. O'Brien 
252c80476e4SDavid E. O'Brien /*
253c80476e4SDavid E. O'Brien  * This routine is called after an error to close up
254c80476e4SDavid E. O'Brien  * any units which may have been left open accidentally.
255c80476e4SDavid E. O'Brien  */
256c80476e4SDavid E. O'Brien void
257c80476e4SDavid E. O'Brien closem()
258c80476e4SDavid E. O'Brien {
259c80476e4SDavid E. O'Brien     register int f;
260c80476e4SDavid E. O'Brien 
261c80476e4SDavid E. O'Brien #ifdef YPBUGS
262c80476e4SDavid E. O'Brien     /* suggested by Justin Bur; thanks to Karl Kleinpaste */
263c80476e4SDavid E. O'Brien     fix_yp_bugs();
264c80476e4SDavid E. O'Brien #endif /* YPBUGS */
265c80476e4SDavid E. O'Brien     for (f = 0; f < NOFILE; f++)
266c80476e4SDavid E. O'Brien 	if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
267c80476e4SDavid E. O'Brien 	    f != FSHTTY
268c80476e4SDavid E. O'Brien #ifdef MALLOC_TRACE
269c80476e4SDavid E. O'Brien 	    && f != 25
270c80476e4SDavid E. O'Brien #endif /* MALLOC_TRACE */
271c80476e4SDavid E. O'Brien 	    )
272c80476e4SDavid E. O'Brien 	  {
273c80476e4SDavid E. O'Brien 	    (void) close(f);
274c80476e4SDavid E. O'Brien #ifdef NISPLUS
275c80476e4SDavid E. O'Brien 	    if(f < 3)
276c80476e4SDavid E. O'Brien 		(void) open(_PATH_DEVNULL, O_RDONLY);
277c80476e4SDavid E. O'Brien #endif /* NISPLUS */
278c80476e4SDavid E. O'Brien 	  }
279c80476e4SDavid E. O'Brien }
280c80476e4SDavid E. O'Brien 
281c80476e4SDavid E. O'Brien #ifndef CLOSE_ON_EXEC
282c80476e4SDavid E. O'Brien /*
283c80476e4SDavid E. O'Brien  * Close files before executing a file.
284c80476e4SDavid E. O'Brien  * We could be MUCH more intelligent, since (on a version 7 system)
285c80476e4SDavid E. O'Brien  * we need only close files here during a source, the other
286c80476e4SDavid E. O'Brien  * shell fd's being in units 16-19 which are closed automatically!
287c80476e4SDavid E. O'Brien  */
288c80476e4SDavid E. O'Brien void
289c80476e4SDavid E. O'Brien closech()
290c80476e4SDavid E. O'Brien {
291c80476e4SDavid E. O'Brien     register int f;
292c80476e4SDavid E. O'Brien 
293c80476e4SDavid E. O'Brien     if (didcch)
294c80476e4SDavid E. O'Brien 	return;
295c80476e4SDavid E. O'Brien     didcch = 1;
296c80476e4SDavid E. O'Brien     SHIN = 0;
297c80476e4SDavid E. O'Brien     SHOUT = 1;
298c80476e4SDavid E. O'Brien     SHDIAG = 2;
299c80476e4SDavid E. O'Brien     OLDSTD = 0;
300c80476e4SDavid E. O'Brien     isoutatty = isatty(SHOUT);
301c80476e4SDavid E. O'Brien     isdiagatty = isatty(SHDIAG);
302c80476e4SDavid E. O'Brien     for (f = 3; f < NOFILE; f++)
303c80476e4SDavid E. O'Brien 	(void) close(f);
304c80476e4SDavid E. O'Brien }
305c80476e4SDavid E. O'Brien 
306c80476e4SDavid E. O'Brien #endif /* CLOSE_ON_EXEC */
307c80476e4SDavid E. O'Brien 
308c80476e4SDavid E. O'Brien void
309c80476e4SDavid E. O'Brien donefds()
310c80476e4SDavid E. O'Brien {
311c80476e4SDavid E. O'Brien 
312c80476e4SDavid E. O'Brien     (void) close(0);
313c80476e4SDavid E. O'Brien     (void) close(1);
314c80476e4SDavid E. O'Brien     (void) close(2);
315c80476e4SDavid E. O'Brien     didfds = 0;
316c80476e4SDavid E. O'Brien #ifdef NISPLUS
317c80476e4SDavid E. O'Brien     {
318c80476e4SDavid E. O'Brien 	int fd = open(_PATH_DEVNULL, O_RDONLY);
319c80476e4SDavid E. O'Brien 	(void) dup2(fd, 1);
320c80476e4SDavid E. O'Brien 	(void) dup2(fd, 2);
321c80476e4SDavid E. O'Brien 	if (fd != 0) {
322c80476e4SDavid E. O'Brien 	    (void) dup2(fd, 0);
323c80476e4SDavid E. O'Brien 	    (void) close(fd);
324c80476e4SDavid E. O'Brien 	}
325c80476e4SDavid E. O'Brien     }
326c80476e4SDavid E. O'Brien #endif /*NISPLUS*/
327c80476e4SDavid E. O'Brien }
328c80476e4SDavid E. O'Brien 
329c80476e4SDavid E. O'Brien /*
330c80476e4SDavid E. O'Brien  * Move descriptor i to j.
331c80476e4SDavid E. O'Brien  * If j is -1 then we just want to get i to a safe place,
332c80476e4SDavid E. O'Brien  * i.e. to a unit > 2.  This also happens in dcopy.
333c80476e4SDavid E. O'Brien  */
334c80476e4SDavid E. O'Brien int
335c80476e4SDavid E. O'Brien dmove(i, j)
336c80476e4SDavid E. O'Brien     register int i, j;
337c80476e4SDavid E. O'Brien {
338c80476e4SDavid E. O'Brien 
339c80476e4SDavid E. O'Brien     if (i == j || i < 0)
340c80476e4SDavid E. O'Brien 	return (i);
341c80476e4SDavid E. O'Brien #ifdef HAVEDUP2
342c80476e4SDavid E. O'Brien     if (j >= 0) {
343c80476e4SDavid E. O'Brien 	(void) dup2(i, j);
344c80476e4SDavid E. O'Brien 	if (j != i)
345c80476e4SDavid E. O'Brien 	    (void) close(i);
346c80476e4SDavid E. O'Brien 	return (j);
347c80476e4SDavid E. O'Brien     }
348c80476e4SDavid E. O'Brien #endif
349c80476e4SDavid E. O'Brien     j = dcopy(i, j);
350c80476e4SDavid E. O'Brien     if (j != i)
351c80476e4SDavid E. O'Brien 	(void) close(i);
352c80476e4SDavid E. O'Brien     return (j);
353c80476e4SDavid E. O'Brien }
354c80476e4SDavid E. O'Brien 
355c80476e4SDavid E. O'Brien int
356c80476e4SDavid E. O'Brien dcopy(i, j)
357c80476e4SDavid E. O'Brien     register int i, j;
358c80476e4SDavid E. O'Brien {
359c80476e4SDavid E. O'Brien 
360c80476e4SDavid E. O'Brien     if (i == j || i < 0 || (j < 0 && i > 2))
361c80476e4SDavid E. O'Brien 	return (i);
362c80476e4SDavid E. O'Brien     if (j >= 0) {
363c80476e4SDavid E. O'Brien #ifdef HAVEDUP2
364c80476e4SDavid E. O'Brien 	(void) dup2(i, j);
365c80476e4SDavid E. O'Brien 	return (j);
366c80476e4SDavid E. O'Brien #else
367c80476e4SDavid E. O'Brien 	(void) close(j);
368c80476e4SDavid E. O'Brien #endif
369c80476e4SDavid E. O'Brien     }
370c80476e4SDavid E. O'Brien     return (renum(i, j));
371c80476e4SDavid E. O'Brien }
372c80476e4SDavid E. O'Brien 
373c80476e4SDavid E. O'Brien static int
374c80476e4SDavid E. O'Brien renum(i, j)
375c80476e4SDavid E. O'Brien     register int i, j;
376c80476e4SDavid E. O'Brien {
377c80476e4SDavid E. O'Brien     register int k = dup(i);
378c80476e4SDavid E. O'Brien 
379c80476e4SDavid E. O'Brien     if (k < 0)
380c80476e4SDavid E. O'Brien 	return (-1);
381c80476e4SDavid E. O'Brien     if (j == -1 && k > 2)
382c80476e4SDavid E. O'Brien 	return (k);
383c80476e4SDavid E. O'Brien     if (k != j) {
384c80476e4SDavid E. O'Brien 	j = renum(k, j);
385c80476e4SDavid E. O'Brien 	(void) close(k);
386c80476e4SDavid E. O'Brien 	return (j);
387c80476e4SDavid E. O'Brien     }
388c80476e4SDavid E. O'Brien     return (k);
389c80476e4SDavid E. O'Brien }
390c80476e4SDavid E. O'Brien 
391c80476e4SDavid E. O'Brien /*
392c80476e4SDavid E. O'Brien  * Left shift a command argument list, discarding
393c80476e4SDavid E. O'Brien  * the first c arguments.  Used in "shift" commands
394c80476e4SDavid E. O'Brien  * as well as by commands like "repeat".
395c80476e4SDavid E. O'Brien  */
396c80476e4SDavid E. O'Brien void
397c80476e4SDavid E. O'Brien lshift(v, c)
398c80476e4SDavid E. O'Brien     register Char **v;
399c80476e4SDavid E. O'Brien     register int c;
400c80476e4SDavid E. O'Brien {
401c80476e4SDavid E. O'Brien     register Char **u;
402c80476e4SDavid E. O'Brien 
403c80476e4SDavid E. O'Brien     for (u = v; *u && --c >= 0; u++)
404c80476e4SDavid E. O'Brien 	xfree((ptr_t) *u);
405c80476e4SDavid E. O'Brien     (void) blkcpy(v, u);
406c80476e4SDavid E. O'Brien }
407c80476e4SDavid E. O'Brien 
408c80476e4SDavid E. O'Brien int
409c80476e4SDavid E. O'Brien number(cp)
410c80476e4SDavid E. O'Brien     Char   *cp;
411c80476e4SDavid E. O'Brien {
412c80476e4SDavid E. O'Brien     if (!cp)
413c80476e4SDavid E. O'Brien 	return (0);
414c80476e4SDavid E. O'Brien     if (*cp == '-') {
415c80476e4SDavid E. O'Brien 	cp++;
416c80476e4SDavid E. O'Brien 	if (!Isdigit(*cp))
417c80476e4SDavid E. O'Brien 	    return (0);
418c80476e4SDavid E. O'Brien 	cp++;
419c80476e4SDavid E. O'Brien     }
420c80476e4SDavid E. O'Brien     while (*cp && Isdigit(*cp))
421c80476e4SDavid E. O'Brien 	cp++;
422c80476e4SDavid E. O'Brien     return (*cp == 0);
423c80476e4SDavid E. O'Brien }
424c80476e4SDavid E. O'Brien 
425c80476e4SDavid E. O'Brien Char  **
426c80476e4SDavid E. O'Brien copyblk(v)
427c80476e4SDavid E. O'Brien     register Char **v;
428c80476e4SDavid E. O'Brien {
429c80476e4SDavid E. O'Brien     register Char **nv =
430c80476e4SDavid E. O'Brien     (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
431c80476e4SDavid E. O'Brien 
432c80476e4SDavid E. O'Brien     return (blkcpy(nv, v));
433c80476e4SDavid E. O'Brien }
434c80476e4SDavid E. O'Brien 
435c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
436c80476e4SDavid E. O'Brien char   *
437c80476e4SDavid E. O'Brien strend(cp)
438c80476e4SDavid E. O'Brien     register char *cp;
439c80476e4SDavid E. O'Brien {
440c80476e4SDavid E. O'Brien     if (!cp)
441c80476e4SDavid E. O'Brien 	return (cp);
442c80476e4SDavid E. O'Brien     while (*cp)
443c80476e4SDavid E. O'Brien 	cp++;
444c80476e4SDavid E. O'Brien     return (cp);
445c80476e4SDavid E. O'Brien }
446c80476e4SDavid E. O'Brien 
447c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */
448c80476e4SDavid E. O'Brien 
449c80476e4SDavid E. O'Brien Char   *
450c80476e4SDavid E. O'Brien strip(cp)
451c80476e4SDavid E. O'Brien     Char   *cp;
452c80476e4SDavid E. O'Brien {
453c80476e4SDavid E. O'Brien     register Char *dp = cp;
454c80476e4SDavid E. O'Brien 
455c80476e4SDavid E. O'Brien     if (!cp)
456c80476e4SDavid E. O'Brien 	return (cp);
457c80476e4SDavid E. O'Brien     while ((*dp++ &= TRIM) != '\0')
458c80476e4SDavid E. O'Brien 	continue;
459c80476e4SDavid E. O'Brien     return (cp);
460c80476e4SDavid E. O'Brien }
461c80476e4SDavid E. O'Brien 
462c80476e4SDavid E. O'Brien Char   *
463c80476e4SDavid E. O'Brien quote(cp)
464c80476e4SDavid E. O'Brien     Char   *cp;
465c80476e4SDavid E. O'Brien {
466c80476e4SDavid E. O'Brien     register Char *dp = cp;
467c80476e4SDavid E. O'Brien 
468c80476e4SDavid E. O'Brien     if (!cp)
469c80476e4SDavid E. O'Brien 	return (cp);
470c80476e4SDavid E. O'Brien     while (*dp != '\0')
471c80476e4SDavid E. O'Brien 	*dp++ |= QUOTE;
472c80476e4SDavid E. O'Brien     return (cp);
473c80476e4SDavid E. O'Brien }
474c80476e4SDavid E. O'Brien 
475c80476e4SDavid E. O'Brien Char   *
476c80476e4SDavid E. O'Brien quote_meta(d, s)
477c80476e4SDavid E. O'Brien     Char   *d;
478c80476e4SDavid E. O'Brien     const Char   *s;
479c80476e4SDavid E. O'Brien {
480c80476e4SDavid E. O'Brien     Char *r = d;
481c80476e4SDavid E. O'Brien     while (*s != '\0') {
482c80476e4SDavid E. O'Brien 	if (cmap(*s, _META | _DOL | _QF | _QB | _ESC | _GLOB))
483c80476e4SDavid E. O'Brien 		*d++ = '\\';
484c80476e4SDavid E. O'Brien 	*d++ = *s++;
485c80476e4SDavid E. O'Brien     }
486c80476e4SDavid E. O'Brien     *d = '\0';
487c80476e4SDavid E. O'Brien     return r;
488c80476e4SDavid E. O'Brien }
489c80476e4SDavid E. O'Brien 
490c80476e4SDavid E. O'Brien void
491c80476e4SDavid E. O'Brien udvar(name)
492c80476e4SDavid E. O'Brien     Char   *name;
493c80476e4SDavid E. O'Brien {
494c80476e4SDavid E. O'Brien 
495c80476e4SDavid E. O'Brien     setname(short2str(name));
496c80476e4SDavid E. O'Brien     stderror(ERR_NAME | ERR_UNDVAR);
497c80476e4SDavid E. O'Brien }
498c80476e4SDavid E. O'Brien 
499c80476e4SDavid E. O'Brien int
500c80476e4SDavid E. O'Brien prefix(sub, str)
501c80476e4SDavid E. O'Brien     register Char *sub, *str;
502c80476e4SDavid E. O'Brien {
503c80476e4SDavid E. O'Brien 
504c80476e4SDavid E. O'Brien     for (;;) {
505c80476e4SDavid E. O'Brien 	if (*sub == 0)
506c80476e4SDavid E. O'Brien 	    return (1);
507c80476e4SDavid E. O'Brien 	if (*str == 0)
508c80476e4SDavid E. O'Brien 	    return (0);
509c80476e4SDavid E. O'Brien 	if ((*sub++ & TRIM) != (*str++ & TRIM))
510c80476e4SDavid E. O'Brien 	    return (0);
511c80476e4SDavid E. O'Brien     }
512c80476e4SDavid E. O'Brien }
513