xref: /freebsd/contrib/tcsh/sh.misc.c (revision b2d5d167edc56df47468e5836b8129dfd3d0369a)
1b2d5d167SMark Peek /* $Header: /src/pub/tcsh/sh.misc.c,v 3.26 2003/03/12 19:14:51 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 
35b2d5d167SMark Peek RCSID("$Id: sh.misc.c,v 3.26 2003/03/12 19:14:51 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 
261b2d5d167SMark Peek #ifdef NLS_BUGS
262b2d5d167SMark Peek #ifdef NLS_CATALOGS
263b2d5d167SMark Peek     (void)catclose(catd);
264b2d5d167SMark Peek #endif /* NLS_CATALOGS */
265b2d5d167SMark Peek #endif /* NLS_BUGS */
266c80476e4SDavid E. O'Brien #ifdef YPBUGS
267c80476e4SDavid E. O'Brien     /* suggested by Justin Bur; thanks to Karl Kleinpaste */
268c80476e4SDavid E. O'Brien     fix_yp_bugs();
269c80476e4SDavid E. O'Brien #endif /* YPBUGS */
270c80476e4SDavid E. O'Brien     for (f = 0; f < NOFILE; f++)
271c80476e4SDavid E. O'Brien 	if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
272c80476e4SDavid E. O'Brien 	    f != FSHTTY
273c80476e4SDavid E. O'Brien #ifdef MALLOC_TRACE
274c80476e4SDavid E. O'Brien 	    && f != 25
275c80476e4SDavid E. O'Brien #endif /* MALLOC_TRACE */
276c80476e4SDavid E. O'Brien 	    )
277c80476e4SDavid E. O'Brien 	  {
278c80476e4SDavid E. O'Brien 	    (void) close(f);
279c80476e4SDavid E. O'Brien #ifdef NISPLUS
280c80476e4SDavid E. O'Brien 	    if(f < 3)
281b2d5d167SMark Peek 		(void) open(_PATH_DEVNULL, O_RDONLY|O_LARGEFILE);
282c80476e4SDavid E. O'Brien #endif /* NISPLUS */
283c80476e4SDavid E. O'Brien 	  }
284b2d5d167SMark Peek #ifdef NLS_BUGS
285b2d5d167SMark Peek #ifdef NLS_CATALOGS
286b2d5d167SMark Peek     nlsinit();
287b2d5d167SMark Peek #endif /* NLS_CATALOGS */
288b2d5d167SMark Peek #endif /* NLS_BUGS */
289c80476e4SDavid E. O'Brien }
290c80476e4SDavid E. O'Brien 
291c80476e4SDavid E. O'Brien #ifndef CLOSE_ON_EXEC
292c80476e4SDavid E. O'Brien /*
293c80476e4SDavid E. O'Brien  * Close files before executing a file.
294c80476e4SDavid E. O'Brien  * We could be MUCH more intelligent, since (on a version 7 system)
295c80476e4SDavid E. O'Brien  * we need only close files here during a source, the other
296c80476e4SDavid E. O'Brien  * shell fd's being in units 16-19 which are closed automatically!
297c80476e4SDavid E. O'Brien  */
298c80476e4SDavid E. O'Brien void
299c80476e4SDavid E. O'Brien closech()
300c80476e4SDavid E. O'Brien {
301c80476e4SDavid E. O'Brien     register int f;
302c80476e4SDavid E. O'Brien 
303c80476e4SDavid E. O'Brien     if (didcch)
304c80476e4SDavid E. O'Brien 	return;
305c80476e4SDavid E. O'Brien     didcch = 1;
306c80476e4SDavid E. O'Brien     SHIN = 0;
307c80476e4SDavid E. O'Brien     SHOUT = 1;
308c80476e4SDavid E. O'Brien     SHDIAG = 2;
309c80476e4SDavid E. O'Brien     OLDSTD = 0;
310c80476e4SDavid E. O'Brien     isoutatty = isatty(SHOUT);
311c80476e4SDavid E. O'Brien     isdiagatty = isatty(SHDIAG);
312c80476e4SDavid E. O'Brien     for (f = 3; f < NOFILE; f++)
313c80476e4SDavid E. O'Brien 	(void) close(f);
314c80476e4SDavid E. O'Brien }
315c80476e4SDavid E. O'Brien 
316c80476e4SDavid E. O'Brien #endif /* CLOSE_ON_EXEC */
317c80476e4SDavid E. O'Brien 
318c80476e4SDavid E. O'Brien void
319c80476e4SDavid E. O'Brien donefds()
320c80476e4SDavid E. O'Brien {
321c80476e4SDavid E. O'Brien 
322c80476e4SDavid E. O'Brien     (void) close(0);
323c80476e4SDavid E. O'Brien     (void) close(1);
324c80476e4SDavid E. O'Brien     (void) close(2);
325c80476e4SDavid E. O'Brien     didfds = 0;
326c80476e4SDavid E. O'Brien #ifdef NISPLUS
327c80476e4SDavid E. O'Brien     {
328b2d5d167SMark Peek 	int fd = open(_PATH_DEVNULL, O_RDONLY|O_LARGEFILE);
329c80476e4SDavid E. O'Brien 	(void) dup2(fd, 1);
330c80476e4SDavid E. O'Brien 	(void) dup2(fd, 2);
331c80476e4SDavid E. O'Brien 	if (fd != 0) {
332c80476e4SDavid E. O'Brien 	    (void) dup2(fd, 0);
333c80476e4SDavid E. O'Brien 	    (void) close(fd);
334c80476e4SDavid E. O'Brien 	}
335c80476e4SDavid E. O'Brien     }
336c80476e4SDavid E. O'Brien #endif /*NISPLUS*/
337c80476e4SDavid E. O'Brien }
338c80476e4SDavid E. O'Brien 
339c80476e4SDavid E. O'Brien /*
340c80476e4SDavid E. O'Brien  * Move descriptor i to j.
341c80476e4SDavid E. O'Brien  * If j is -1 then we just want to get i to a safe place,
342c80476e4SDavid E. O'Brien  * i.e. to a unit > 2.  This also happens in dcopy.
343c80476e4SDavid E. O'Brien  */
344c80476e4SDavid E. O'Brien int
345c80476e4SDavid E. O'Brien dmove(i, j)
346c80476e4SDavid E. O'Brien     register int i, j;
347c80476e4SDavid E. O'Brien {
348c80476e4SDavid E. O'Brien 
349c80476e4SDavid E. O'Brien     if (i == j || i < 0)
350c80476e4SDavid E. O'Brien 	return (i);
351c80476e4SDavid E. O'Brien #ifdef HAVEDUP2
352c80476e4SDavid E. O'Brien     if (j >= 0) {
353c80476e4SDavid E. O'Brien 	(void) dup2(i, j);
354c80476e4SDavid E. O'Brien 	if (j != i)
355c80476e4SDavid E. O'Brien 	    (void) close(i);
356c80476e4SDavid E. O'Brien 	return (j);
357c80476e4SDavid E. O'Brien     }
358c80476e4SDavid E. O'Brien #endif
359c80476e4SDavid E. O'Brien     j = dcopy(i, j);
360c80476e4SDavid E. O'Brien     if (j != i)
361c80476e4SDavid E. O'Brien 	(void) close(i);
362c80476e4SDavid E. O'Brien     return (j);
363c80476e4SDavid E. O'Brien }
364c80476e4SDavid E. O'Brien 
365c80476e4SDavid E. O'Brien int
366c80476e4SDavid E. O'Brien dcopy(i, j)
367c80476e4SDavid E. O'Brien     register int i, j;
368c80476e4SDavid E. O'Brien {
369c80476e4SDavid E. O'Brien 
370c80476e4SDavid E. O'Brien     if (i == j || i < 0 || (j < 0 && i > 2))
371c80476e4SDavid E. O'Brien 	return (i);
372c80476e4SDavid E. O'Brien     if (j >= 0) {
373c80476e4SDavid E. O'Brien #ifdef HAVEDUP2
374c80476e4SDavid E. O'Brien 	(void) dup2(i, j);
375c80476e4SDavid E. O'Brien 	return (j);
376c80476e4SDavid E. O'Brien #else
377c80476e4SDavid E. O'Brien 	(void) close(j);
378c80476e4SDavid E. O'Brien #endif
379c80476e4SDavid E. O'Brien     }
380c80476e4SDavid E. O'Brien     return (renum(i, j));
381c80476e4SDavid E. O'Brien }
382c80476e4SDavid E. O'Brien 
383c80476e4SDavid E. O'Brien static int
384c80476e4SDavid E. O'Brien renum(i, j)
385c80476e4SDavid E. O'Brien     register int i, j;
386c80476e4SDavid E. O'Brien {
387c80476e4SDavid E. O'Brien     register int k = dup(i);
388c80476e4SDavid E. O'Brien 
389c80476e4SDavid E. O'Brien     if (k < 0)
390c80476e4SDavid E. O'Brien 	return (-1);
391c80476e4SDavid E. O'Brien     if (j == -1 && k > 2)
392c80476e4SDavid E. O'Brien 	return (k);
393c80476e4SDavid E. O'Brien     if (k != j) {
394c80476e4SDavid E. O'Brien 	j = renum(k, j);
395c80476e4SDavid E. O'Brien 	(void) close(k);
396c80476e4SDavid E. O'Brien 	return (j);
397c80476e4SDavid E. O'Brien     }
398c80476e4SDavid E. O'Brien     return (k);
399c80476e4SDavid E. O'Brien }
400c80476e4SDavid E. O'Brien 
401c80476e4SDavid E. O'Brien /*
402c80476e4SDavid E. O'Brien  * Left shift a command argument list, discarding
403c80476e4SDavid E. O'Brien  * the first c arguments.  Used in "shift" commands
404c80476e4SDavid E. O'Brien  * as well as by commands like "repeat".
405c80476e4SDavid E. O'Brien  */
406c80476e4SDavid E. O'Brien void
407c80476e4SDavid E. O'Brien lshift(v, c)
408c80476e4SDavid E. O'Brien     register Char **v;
409c80476e4SDavid E. O'Brien     register int c;
410c80476e4SDavid E. O'Brien {
411c80476e4SDavid E. O'Brien     register Char **u;
412c80476e4SDavid E. O'Brien 
413c80476e4SDavid E. O'Brien     for (u = v; *u && --c >= 0; u++)
414c80476e4SDavid E. O'Brien 	xfree((ptr_t) *u);
415c80476e4SDavid E. O'Brien     (void) blkcpy(v, u);
416c80476e4SDavid E. O'Brien }
417c80476e4SDavid E. O'Brien 
418c80476e4SDavid E. O'Brien int
419c80476e4SDavid E. O'Brien number(cp)
420c80476e4SDavid E. O'Brien     Char   *cp;
421c80476e4SDavid E. O'Brien {
422c80476e4SDavid E. O'Brien     if (!cp)
423c80476e4SDavid E. O'Brien 	return (0);
424c80476e4SDavid E. O'Brien     if (*cp == '-') {
425c80476e4SDavid E. O'Brien 	cp++;
426c80476e4SDavid E. O'Brien 	if (!Isdigit(*cp))
427c80476e4SDavid E. O'Brien 	    return (0);
428c80476e4SDavid E. O'Brien 	cp++;
429c80476e4SDavid E. O'Brien     }
430c80476e4SDavid E. O'Brien     while (*cp && Isdigit(*cp))
431c80476e4SDavid E. O'Brien 	cp++;
432c80476e4SDavid E. O'Brien     return (*cp == 0);
433c80476e4SDavid E. O'Brien }
434c80476e4SDavid E. O'Brien 
435c80476e4SDavid E. O'Brien Char  **
436c80476e4SDavid E. O'Brien copyblk(v)
437c80476e4SDavid E. O'Brien     register Char **v;
438c80476e4SDavid E. O'Brien {
439c80476e4SDavid E. O'Brien     register Char **nv =
440c80476e4SDavid E. O'Brien     (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
441c80476e4SDavid E. O'Brien 
442c80476e4SDavid E. O'Brien     return (blkcpy(nv, v));
443c80476e4SDavid E. O'Brien }
444c80476e4SDavid E. O'Brien 
445c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS
446c80476e4SDavid E. O'Brien char   *
447c80476e4SDavid E. O'Brien strend(cp)
448c80476e4SDavid E. O'Brien     register char *cp;
449c80476e4SDavid E. O'Brien {
450c80476e4SDavid E. O'Brien     if (!cp)
451c80476e4SDavid E. O'Brien 	return (cp);
452c80476e4SDavid E. O'Brien     while (*cp)
453c80476e4SDavid E. O'Brien 	cp++;
454c80476e4SDavid E. O'Brien     return (cp);
455c80476e4SDavid E. O'Brien }
456c80476e4SDavid E. O'Brien 
457c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */
458c80476e4SDavid E. O'Brien 
459c80476e4SDavid E. O'Brien Char   *
460c80476e4SDavid E. O'Brien strip(cp)
461c80476e4SDavid E. O'Brien     Char   *cp;
462c80476e4SDavid E. O'Brien {
463c80476e4SDavid E. O'Brien     register Char *dp = cp;
464c80476e4SDavid E. O'Brien 
465c80476e4SDavid E. O'Brien     if (!cp)
466c80476e4SDavid E. O'Brien 	return (cp);
467c80476e4SDavid E. O'Brien     while ((*dp++ &= TRIM) != '\0')
468c80476e4SDavid E. O'Brien 	continue;
469c80476e4SDavid E. O'Brien     return (cp);
470c80476e4SDavid E. O'Brien }
471c80476e4SDavid E. O'Brien 
472c80476e4SDavid E. O'Brien Char   *
473c80476e4SDavid E. O'Brien quote(cp)
474c80476e4SDavid E. O'Brien     Char   *cp;
475c80476e4SDavid E. O'Brien {
476c80476e4SDavid E. O'Brien     register Char *dp = cp;
477c80476e4SDavid E. O'Brien 
478c80476e4SDavid E. O'Brien     if (!cp)
479c80476e4SDavid E. O'Brien 	return (cp);
480c80476e4SDavid E. O'Brien     while (*dp != '\0')
481c80476e4SDavid E. O'Brien 	*dp++ |= QUOTE;
482c80476e4SDavid E. O'Brien     return (cp);
483c80476e4SDavid E. O'Brien }
484c80476e4SDavid E. O'Brien 
485c80476e4SDavid E. O'Brien Char   *
486c80476e4SDavid E. O'Brien quote_meta(d, s)
487c80476e4SDavid E. O'Brien     Char   *d;
488c80476e4SDavid E. O'Brien     const Char   *s;
489c80476e4SDavid E. O'Brien {
490c80476e4SDavid E. O'Brien     Char *r = d;
491c80476e4SDavid E. O'Brien     while (*s != '\0') {
492c80476e4SDavid E. O'Brien 	if (cmap(*s, _META | _DOL | _QF | _QB | _ESC | _GLOB))
493c80476e4SDavid E. O'Brien 		*d++ = '\\';
494c80476e4SDavid E. O'Brien 	*d++ = *s++;
495c80476e4SDavid E. O'Brien     }
496c80476e4SDavid E. O'Brien     *d = '\0';
497c80476e4SDavid E. O'Brien     return r;
498c80476e4SDavid E. O'Brien }
499c80476e4SDavid E. O'Brien 
500c80476e4SDavid E. O'Brien void
501c80476e4SDavid E. O'Brien udvar(name)
502c80476e4SDavid E. O'Brien     Char   *name;
503c80476e4SDavid E. O'Brien {
504c80476e4SDavid E. O'Brien 
505c80476e4SDavid E. O'Brien     setname(short2str(name));
506c80476e4SDavid E. O'Brien     stderror(ERR_NAME | ERR_UNDVAR);
507c80476e4SDavid E. O'Brien }
508c80476e4SDavid E. O'Brien 
509c80476e4SDavid E. O'Brien int
510c80476e4SDavid E. O'Brien prefix(sub, str)
511c80476e4SDavid E. O'Brien     register Char *sub, *str;
512c80476e4SDavid E. O'Brien {
513c80476e4SDavid E. O'Brien 
514c80476e4SDavid E. O'Brien     for (;;) {
515c80476e4SDavid E. O'Brien 	if (*sub == 0)
516c80476e4SDavid E. O'Brien 	    return (1);
517c80476e4SDavid E. O'Brien 	if (*str == 0)
518c80476e4SDavid E. O'Brien 	    return (0);
519c80476e4SDavid E. O'Brien 	if ((*sub++ & TRIM) != (*str++ & TRIM))
520c80476e4SDavid E. O'Brien 	    return (0);
521c80476e4SDavid E. O'Brien     }
522c80476e4SDavid E. O'Brien }
523