1*d1e4d7ceSDavid van Moolenbroek /* $NetBSD: misc.c,v 1.20 2013/07/16 17:47:43 christos Exp $ */
2*d1e4d7ceSDavid van Moolenbroek
3*d1e4d7ceSDavid van Moolenbroek /*-
4*d1e4d7ceSDavid van Moolenbroek * Copyright (c) 1980, 1991, 1993
5*d1e4d7ceSDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
6*d1e4d7ceSDavid van Moolenbroek *
7*d1e4d7ceSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
8*d1e4d7ceSDavid van Moolenbroek * modification, are permitted provided that the following conditions
9*d1e4d7ceSDavid van Moolenbroek * are met:
10*d1e4d7ceSDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
11*d1e4d7ceSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
12*d1e4d7ceSDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
13*d1e4d7ceSDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
14*d1e4d7ceSDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
15*d1e4d7ceSDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
16*d1e4d7ceSDavid van Moolenbroek * may be used to endorse or promote products derived from this software
17*d1e4d7ceSDavid van Moolenbroek * without specific prior written permission.
18*d1e4d7ceSDavid van Moolenbroek *
19*d1e4d7ceSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*d1e4d7ceSDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*d1e4d7ceSDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*d1e4d7ceSDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*d1e4d7ceSDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*d1e4d7ceSDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*d1e4d7ceSDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*d1e4d7ceSDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*d1e4d7ceSDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*d1e4d7ceSDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*d1e4d7ceSDavid van Moolenbroek * SUCH DAMAGE.
30*d1e4d7ceSDavid van Moolenbroek */
31*d1e4d7ceSDavid van Moolenbroek
32*d1e4d7ceSDavid van Moolenbroek #include <sys/cdefs.h>
33*d1e4d7ceSDavid van Moolenbroek #ifndef lint
34*d1e4d7ceSDavid van Moolenbroek #if 0
35*d1e4d7ceSDavid van Moolenbroek static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93";
36*d1e4d7ceSDavid van Moolenbroek #else
37*d1e4d7ceSDavid van Moolenbroek __RCSID("$NetBSD: misc.c,v 1.20 2013/07/16 17:47:43 christos Exp $");
38*d1e4d7ceSDavid van Moolenbroek #endif
39*d1e4d7ceSDavid van Moolenbroek #endif /* not lint */
40*d1e4d7ceSDavid van Moolenbroek
41*d1e4d7ceSDavid van Moolenbroek #include <sys/param.h>
42*d1e4d7ceSDavid van Moolenbroek
43*d1e4d7ceSDavid van Moolenbroek #include <stdarg.h>
44*d1e4d7ceSDavid van Moolenbroek #include <stdlib.h>
45*d1e4d7ceSDavid van Moolenbroek #include <string.h>
46*d1e4d7ceSDavid van Moolenbroek #include <unistd.h>
47*d1e4d7ceSDavid van Moolenbroek #include <fcntl.h>
48*d1e4d7ceSDavid van Moolenbroek
49*d1e4d7ceSDavid van Moolenbroek #include "csh.h"
50*d1e4d7ceSDavid van Moolenbroek #include "extern.h"
51*d1e4d7ceSDavid van Moolenbroek
52*d1e4d7ceSDavid van Moolenbroek static int renum(int, int);
53*d1e4d7ceSDavid van Moolenbroek
54*d1e4d7ceSDavid van Moolenbroek int
any(const char * s,int c)55*d1e4d7ceSDavid van Moolenbroek any(const char *s, int c)
56*d1e4d7ceSDavid van Moolenbroek {
57*d1e4d7ceSDavid van Moolenbroek if (!s)
58*d1e4d7ceSDavid van Moolenbroek return (0); /* Check for nil pointer */
59*d1e4d7ceSDavid van Moolenbroek while (*s)
60*d1e4d7ceSDavid van Moolenbroek if (*s++ == c)
61*d1e4d7ceSDavid van Moolenbroek return (1);
62*d1e4d7ceSDavid van Moolenbroek return (0);
63*d1e4d7ceSDavid van Moolenbroek }
64*d1e4d7ceSDavid van Moolenbroek
65*d1e4d7ceSDavid van Moolenbroek char *
strsave(const char * s)66*d1e4d7ceSDavid van Moolenbroek strsave(const char *s)
67*d1e4d7ceSDavid van Moolenbroek {
68*d1e4d7ceSDavid van Moolenbroek const char *n;
69*d1e4d7ceSDavid van Moolenbroek char *p, *r;
70*d1e4d7ceSDavid van Moolenbroek
71*d1e4d7ceSDavid van Moolenbroek if (s == NULL)
72*d1e4d7ceSDavid van Moolenbroek s = "";
73*d1e4d7ceSDavid van Moolenbroek for (n = s; *n++;)
74*d1e4d7ceSDavid van Moolenbroek continue;
75*d1e4d7ceSDavid van Moolenbroek r = p = xmalloc((size_t)(n - s) * sizeof(*p));
76*d1e4d7ceSDavid van Moolenbroek while ((*p++ = *s++) != '\0')
77*d1e4d7ceSDavid van Moolenbroek continue;
78*d1e4d7ceSDavid van Moolenbroek return (r);
79*d1e4d7ceSDavid van Moolenbroek }
80*d1e4d7ceSDavid van Moolenbroek
81*d1e4d7ceSDavid van Moolenbroek Char **
blkend(Char ** up)82*d1e4d7ceSDavid van Moolenbroek blkend(Char **up)
83*d1e4d7ceSDavid van Moolenbroek {
84*d1e4d7ceSDavid van Moolenbroek while (*up)
85*d1e4d7ceSDavid van Moolenbroek up++;
86*d1e4d7ceSDavid van Moolenbroek return (up);
87*d1e4d7ceSDavid van Moolenbroek }
88*d1e4d7ceSDavid van Moolenbroek
89*d1e4d7ceSDavid van Moolenbroek
90*d1e4d7ceSDavid van Moolenbroek void
blkpr(FILE * fp,Char ** av)91*d1e4d7ceSDavid van Moolenbroek blkpr(FILE *fp, Char **av)
92*d1e4d7ceSDavid van Moolenbroek {
93*d1e4d7ceSDavid van Moolenbroek for (; *av; av++) {
94*d1e4d7ceSDavid van Moolenbroek (void)fprintf(fp, "%s", vis_str(*av));
95*d1e4d7ceSDavid van Moolenbroek if (av[1])
96*d1e4d7ceSDavid van Moolenbroek (void)fprintf(fp, " ");
97*d1e4d7ceSDavid van Moolenbroek }
98*d1e4d7ceSDavid van Moolenbroek }
99*d1e4d7ceSDavid van Moolenbroek
100*d1e4d7ceSDavid van Moolenbroek int
blklen(Char ** av)101*d1e4d7ceSDavid van Moolenbroek blklen(Char **av)
102*d1e4d7ceSDavid van Moolenbroek {
103*d1e4d7ceSDavid van Moolenbroek int i;
104*d1e4d7ceSDavid van Moolenbroek
105*d1e4d7ceSDavid van Moolenbroek i = 0;
106*d1e4d7ceSDavid van Moolenbroek while (*av++)
107*d1e4d7ceSDavid van Moolenbroek i++;
108*d1e4d7ceSDavid van Moolenbroek return (i);
109*d1e4d7ceSDavid van Moolenbroek }
110*d1e4d7ceSDavid van Moolenbroek
111*d1e4d7ceSDavid van Moolenbroek Char **
blkcpy(Char ** oav,Char ** bv)112*d1e4d7ceSDavid van Moolenbroek blkcpy(Char **oav, Char **bv)
113*d1e4d7ceSDavid van Moolenbroek {
114*d1e4d7ceSDavid van Moolenbroek Char **av;
115*d1e4d7ceSDavid van Moolenbroek
116*d1e4d7ceSDavid van Moolenbroek av = oav;
117*d1e4d7ceSDavid van Moolenbroek while ((*av++ = *bv++) != NULL)
118*d1e4d7ceSDavid van Moolenbroek continue;
119*d1e4d7ceSDavid van Moolenbroek return (oav);
120*d1e4d7ceSDavid van Moolenbroek }
121*d1e4d7ceSDavid van Moolenbroek
122*d1e4d7ceSDavid van Moolenbroek Char **
blkcat(Char ** up,Char ** vp)123*d1e4d7ceSDavid van Moolenbroek blkcat(Char **up, Char **vp)
124*d1e4d7ceSDavid van Moolenbroek {
125*d1e4d7ceSDavid van Moolenbroek (void)blkcpy(blkend(up), vp);
126*d1e4d7ceSDavid van Moolenbroek return (up);
127*d1e4d7ceSDavid van Moolenbroek }
128*d1e4d7ceSDavid van Moolenbroek
129*d1e4d7ceSDavid van Moolenbroek void
blkfree(Char ** av0)130*d1e4d7ceSDavid van Moolenbroek blkfree(Char **av0)
131*d1e4d7ceSDavid van Moolenbroek {
132*d1e4d7ceSDavid van Moolenbroek Char **av;
133*d1e4d7ceSDavid van Moolenbroek
134*d1e4d7ceSDavid van Moolenbroek av = av0;
135*d1e4d7ceSDavid van Moolenbroek if (!av0)
136*d1e4d7ceSDavid van Moolenbroek return;
137*d1e4d7ceSDavid van Moolenbroek for (; *av; av++)
138*d1e4d7ceSDavid van Moolenbroek xfree((ptr_t) * av);
139*d1e4d7ceSDavid van Moolenbroek xfree((ptr_t) av0);
140*d1e4d7ceSDavid van Moolenbroek }
141*d1e4d7ceSDavid van Moolenbroek
142*d1e4d7ceSDavid van Moolenbroek Char **
saveblk(Char ** v)143*d1e4d7ceSDavid van Moolenbroek saveblk(Char **v)
144*d1e4d7ceSDavid van Moolenbroek {
145*d1e4d7ceSDavid van Moolenbroek Char **newv, **onewv;
146*d1e4d7ceSDavid van Moolenbroek
147*d1e4d7ceSDavid van Moolenbroek if (v == NULL)
148*d1e4d7ceSDavid van Moolenbroek return NULL;
149*d1e4d7ceSDavid van Moolenbroek
150*d1e4d7ceSDavid van Moolenbroek newv = xcalloc((size_t)(blklen(v) + 1), sizeof(*newv));
151*d1e4d7ceSDavid van Moolenbroek onewv = newv;
152*d1e4d7ceSDavid van Moolenbroek while (*v)
153*d1e4d7ceSDavid van Moolenbroek *newv++ = Strsave(*v++);
154*d1e4d7ceSDavid van Moolenbroek return (onewv);
155*d1e4d7ceSDavid van Moolenbroek }
156*d1e4d7ceSDavid van Moolenbroek
157*d1e4d7ceSDavid van Moolenbroek #ifdef NOTUSED
158*d1e4d7ceSDavid van Moolenbroek char *
strstr(char * s,char * t)159*d1e4d7ceSDavid van Moolenbroek strstr(char *s, char *t)
160*d1e4d7ceSDavid van Moolenbroek {
161*d1e4d7ceSDavid van Moolenbroek do {
162*d1e4d7ceSDavid van Moolenbroek char *ss;
163*d1e4d7ceSDavid van Moolenbroek char *tt;
164*d1e4d7ceSDavid van Moolenbroek
165*d1e4d7ceSDavid van Moolenbroek ss = s;
166*d1e4d7ceSDavid van Moolenbroek tt = t;
167*d1e4d7ceSDavid van Moolenbroek
168*d1e4d7ceSDavid van Moolenbroek do
169*d1e4d7ceSDavid van Moolenbroek if (*tt == '\0')
170*d1e4d7ceSDavid van Moolenbroek return (s);
171*d1e4d7ceSDavid van Moolenbroek while (*ss++ == *tt++);
172*d1e4d7ceSDavid van Moolenbroek } while (*s++ != '\0');
173*d1e4d7ceSDavid van Moolenbroek return (NULL);
174*d1e4d7ceSDavid van Moolenbroek }
175*d1e4d7ceSDavid van Moolenbroek
176*d1e4d7ceSDavid van Moolenbroek #endif /* NOTUSED */
177*d1e4d7ceSDavid van Moolenbroek
178*d1e4d7ceSDavid van Moolenbroek #ifndef SHORT_STRINGS
179*d1e4d7ceSDavid van Moolenbroek char *
strspl(char * cp,char * dp)180*d1e4d7ceSDavid van Moolenbroek strspl(char *cp, char *dp)
181*d1e4d7ceSDavid van Moolenbroek {
182*d1e4d7ceSDavid van Moolenbroek char *ep, *p, *q;
183*d1e4d7ceSDavid van Moolenbroek
184*d1e4d7ceSDavid van Moolenbroek if (!cp)
185*d1e4d7ceSDavid van Moolenbroek cp = "";
186*d1e4d7ceSDavid van Moolenbroek if (!dp)
187*d1e4d7ceSDavid van Moolenbroek dp = "";
188*d1e4d7ceSDavid van Moolenbroek for (p = cp; *p++;)
189*d1e4d7ceSDavid van Moolenbroek continue;
190*d1e4d7ceSDavid van Moolenbroek for (q = dp; *q++;)
191*d1e4d7ceSDavid van Moolenbroek continue;
192*d1e4d7ceSDavid van Moolenbroek ep = xmalloc((size_t)(((p - cp) + (q - dp) - 1) * sizeof(*ep)));
193*d1e4d7ceSDavid van Moolenbroek for (p = ep, q = cp; *p++ = *q++;)
194*d1e4d7ceSDavid van Moolenbroek continue;
195*d1e4d7ceSDavid van Moolenbroek for (p--, q = dp; *p++ = *q++;)
196*d1e4d7ceSDavid van Moolenbroek continue;
197*d1e4d7ceSDavid van Moolenbroek return (ep);
198*d1e4d7ceSDavid van Moolenbroek }
199*d1e4d7ceSDavid van Moolenbroek
200*d1e4d7ceSDavid van Moolenbroek #endif
201*d1e4d7ceSDavid van Moolenbroek
202*d1e4d7ceSDavid van Moolenbroek Char **
blkspl(Char ** up,Char ** vp)203*d1e4d7ceSDavid van Moolenbroek blkspl(Char **up, Char **vp)
204*d1e4d7ceSDavid van Moolenbroek {
205*d1e4d7ceSDavid van Moolenbroek Char **wp;
206*d1e4d7ceSDavid van Moolenbroek
207*d1e4d7ceSDavid van Moolenbroek wp = xcalloc((size_t)(blklen(up) + blklen(vp) + 1), sizeof(*wp));
208*d1e4d7ceSDavid van Moolenbroek (void)blkcpy(wp, up);
209*d1e4d7ceSDavid van Moolenbroek return (blkcat(wp, vp));
210*d1e4d7ceSDavid van Moolenbroek }
211*d1e4d7ceSDavid van Moolenbroek
212*d1e4d7ceSDavid van Moolenbroek Char
lastchr(Char * cp)213*d1e4d7ceSDavid van Moolenbroek lastchr(Char *cp)
214*d1e4d7ceSDavid van Moolenbroek {
215*d1e4d7ceSDavid van Moolenbroek if (!cp)
216*d1e4d7ceSDavid van Moolenbroek return (0);
217*d1e4d7ceSDavid van Moolenbroek if (!*cp)
218*d1e4d7ceSDavid van Moolenbroek return (0);
219*d1e4d7ceSDavid van Moolenbroek while (cp[1])
220*d1e4d7ceSDavid van Moolenbroek cp++;
221*d1e4d7ceSDavid van Moolenbroek return (*cp);
222*d1e4d7ceSDavid van Moolenbroek }
223*d1e4d7ceSDavid van Moolenbroek
224*d1e4d7ceSDavid van Moolenbroek /*
225*d1e4d7ceSDavid van Moolenbroek * This routine is called after an error to close up
226*d1e4d7ceSDavid van Moolenbroek * any units which may have been left open accidentally.
227*d1e4d7ceSDavid van Moolenbroek */
228*d1e4d7ceSDavid van Moolenbroek void
closem(void)229*d1e4d7ceSDavid van Moolenbroek closem(void)
230*d1e4d7ceSDavid van Moolenbroek {
231*d1e4d7ceSDavid van Moolenbroek int f;
232*d1e4d7ceSDavid van Moolenbroek int nofile;
233*d1e4d7ceSDavid van Moolenbroek
234*d1e4d7ceSDavid van Moolenbroek #ifdef F_CLOSEM
235*d1e4d7ceSDavid van Moolenbroek nofile = FOLDSTD + 1;
236*d1e4d7ceSDavid van Moolenbroek if (fcntl(nofile, F_CLOSEM, 0) == -1)
237*d1e4d7ceSDavid van Moolenbroek #endif
238*d1e4d7ceSDavid van Moolenbroek nofile = NOFILE;
239*d1e4d7ceSDavid van Moolenbroek
240*d1e4d7ceSDavid van Moolenbroek for (f = 0; f < nofile; f++)
241*d1e4d7ceSDavid van Moolenbroek if (f != SHIN && f != SHOUT && f != SHERR && f != OLDSTD &&
242*d1e4d7ceSDavid van Moolenbroek f != FSHTTY)
243*d1e4d7ceSDavid van Moolenbroek (void) close(f);
244*d1e4d7ceSDavid van Moolenbroek }
245*d1e4d7ceSDavid van Moolenbroek
246*d1e4d7ceSDavid van Moolenbroek void
donefds(void)247*d1e4d7ceSDavid van Moolenbroek donefds(void)
248*d1e4d7ceSDavid van Moolenbroek {
249*d1e4d7ceSDavid van Moolenbroek (void)close(0);
250*d1e4d7ceSDavid van Moolenbroek (void)close(1);
251*d1e4d7ceSDavid van Moolenbroek (void)close(2);
252*d1e4d7ceSDavid van Moolenbroek
253*d1e4d7ceSDavid van Moolenbroek didfds = 0;
254*d1e4d7ceSDavid van Moolenbroek }
255*d1e4d7ceSDavid van Moolenbroek
256*d1e4d7ceSDavid van Moolenbroek /*
257*d1e4d7ceSDavid van Moolenbroek * Move descriptor i to j.
258*d1e4d7ceSDavid van Moolenbroek * If j is -1 then we just want to get i to a safe place,
259*d1e4d7ceSDavid van Moolenbroek * i.e. to a unit > 2. This also happens in dcopy.
260*d1e4d7ceSDavid van Moolenbroek */
261*d1e4d7ceSDavid van Moolenbroek int
dmove(int i,int j)262*d1e4d7ceSDavid van Moolenbroek dmove(int i, int j)
263*d1e4d7ceSDavid van Moolenbroek {
264*d1e4d7ceSDavid van Moolenbroek if (i == j || i < 0)
265*d1e4d7ceSDavid van Moolenbroek return (i);
266*d1e4d7ceSDavid van Moolenbroek if (j >= 0) {
267*d1e4d7ceSDavid van Moolenbroek (void)dup2(i, j);
268*d1e4d7ceSDavid van Moolenbroek if (j != i)
269*d1e4d7ceSDavid van Moolenbroek (void)close(i);
270*d1e4d7ceSDavid van Moolenbroek return (j);
271*d1e4d7ceSDavid van Moolenbroek }
272*d1e4d7ceSDavid van Moolenbroek j = dcopy(i, j);
273*d1e4d7ceSDavid van Moolenbroek if (j != i)
274*d1e4d7ceSDavid van Moolenbroek (void)close(i);
275*d1e4d7ceSDavid van Moolenbroek return (j);
276*d1e4d7ceSDavid van Moolenbroek }
277*d1e4d7ceSDavid van Moolenbroek
278*d1e4d7ceSDavid van Moolenbroek int
dcopy(int i,int j)279*d1e4d7ceSDavid van Moolenbroek dcopy(int i, int j)
280*d1e4d7ceSDavid van Moolenbroek {
281*d1e4d7ceSDavid van Moolenbroek if (i == j || i < 0 || (j < 0 && i > 2))
282*d1e4d7ceSDavid van Moolenbroek return (i);
283*d1e4d7ceSDavid van Moolenbroek if (j >= 0) {
284*d1e4d7ceSDavid van Moolenbroek (void)dup2(i, j);
285*d1e4d7ceSDavid van Moolenbroek return (j);
286*d1e4d7ceSDavid van Moolenbroek }
287*d1e4d7ceSDavid van Moolenbroek return (renum(i, j));
288*d1e4d7ceSDavid van Moolenbroek }
289*d1e4d7ceSDavid van Moolenbroek
290*d1e4d7ceSDavid van Moolenbroek static int
renum(int i,int j)291*d1e4d7ceSDavid van Moolenbroek renum(int i, int j)
292*d1e4d7ceSDavid van Moolenbroek {
293*d1e4d7ceSDavid van Moolenbroek int k;
294*d1e4d7ceSDavid van Moolenbroek
295*d1e4d7ceSDavid van Moolenbroek k = dup(i);
296*d1e4d7ceSDavid van Moolenbroek if (k < 0)
297*d1e4d7ceSDavid van Moolenbroek return (-1);
298*d1e4d7ceSDavid van Moolenbroek if (j == -1 && k > 2)
299*d1e4d7ceSDavid van Moolenbroek return (k);
300*d1e4d7ceSDavid van Moolenbroek if (k != j) {
301*d1e4d7ceSDavid van Moolenbroek j = renum(k, j);
302*d1e4d7ceSDavid van Moolenbroek (void)close(k);
303*d1e4d7ceSDavid van Moolenbroek return (j);
304*d1e4d7ceSDavid van Moolenbroek }
305*d1e4d7ceSDavid van Moolenbroek return (k);
306*d1e4d7ceSDavid van Moolenbroek }
307*d1e4d7ceSDavid van Moolenbroek
308*d1e4d7ceSDavid van Moolenbroek /*
309*d1e4d7ceSDavid van Moolenbroek * Left shift a command argument list, discarding
310*d1e4d7ceSDavid van Moolenbroek * the first c arguments. Used in "shift" commands
311*d1e4d7ceSDavid van Moolenbroek * as well as by commands like "repeat".
312*d1e4d7ceSDavid van Moolenbroek */
313*d1e4d7ceSDavid van Moolenbroek void
lshift(Char ** v,size_t c)314*d1e4d7ceSDavid van Moolenbroek lshift(Char **v, size_t c)
315*d1e4d7ceSDavid van Moolenbroek {
316*d1e4d7ceSDavid van Moolenbroek Char **u;
317*d1e4d7ceSDavid van Moolenbroek
318*d1e4d7ceSDavid van Moolenbroek for (u = v; *u && c-- > 0; u++)
319*d1e4d7ceSDavid van Moolenbroek xfree((ptr_t) *u);
320*d1e4d7ceSDavid van Moolenbroek (void)blkcpy(v, u);
321*d1e4d7ceSDavid van Moolenbroek }
322*d1e4d7ceSDavid van Moolenbroek
323*d1e4d7ceSDavid van Moolenbroek int
number(Char * cp)324*d1e4d7ceSDavid van Moolenbroek number(Char *cp)
325*d1e4d7ceSDavid van Moolenbroek {
326*d1e4d7ceSDavid van Moolenbroek if (!cp)
327*d1e4d7ceSDavid van Moolenbroek return(0);
328*d1e4d7ceSDavid van Moolenbroek if (*cp == '-') {
329*d1e4d7ceSDavid van Moolenbroek cp++;
330*d1e4d7ceSDavid van Moolenbroek if (!Isdigit(*cp))
331*d1e4d7ceSDavid van Moolenbroek return (0);
332*d1e4d7ceSDavid van Moolenbroek cp++;
333*d1e4d7ceSDavid van Moolenbroek }
334*d1e4d7ceSDavid van Moolenbroek while (*cp && Isdigit(*cp))
335*d1e4d7ceSDavid van Moolenbroek cp++;
336*d1e4d7ceSDavid van Moolenbroek return (*cp == 0);
337*d1e4d7ceSDavid van Moolenbroek }
338*d1e4d7ceSDavid van Moolenbroek
339*d1e4d7ceSDavid van Moolenbroek Char **
copyblk(Char ** v)340*d1e4d7ceSDavid van Moolenbroek copyblk(Char **v)
341*d1e4d7ceSDavid van Moolenbroek {
342*d1e4d7ceSDavid van Moolenbroek Char **nv;
343*d1e4d7ceSDavid van Moolenbroek
344*d1e4d7ceSDavid van Moolenbroek nv = xcalloc((size_t)(blklen(v) + 1), sizeof(*nv));
345*d1e4d7ceSDavid van Moolenbroek
346*d1e4d7ceSDavid van Moolenbroek return (blkcpy(nv, v));
347*d1e4d7ceSDavid van Moolenbroek }
348*d1e4d7ceSDavid van Moolenbroek
349*d1e4d7ceSDavid van Moolenbroek #ifndef SHORT_STRINGS
350*d1e4d7ceSDavid van Moolenbroek char *
strend(char * cp)351*d1e4d7ceSDavid van Moolenbroek strend(char *cp)
352*d1e4d7ceSDavid van Moolenbroek {
353*d1e4d7ceSDavid van Moolenbroek if (!cp)
354*d1e4d7ceSDavid van Moolenbroek return (cp);
355*d1e4d7ceSDavid van Moolenbroek while (*cp)
356*d1e4d7ceSDavid van Moolenbroek cp++;
357*d1e4d7ceSDavid van Moolenbroek return (cp);
358*d1e4d7ceSDavid van Moolenbroek }
359*d1e4d7ceSDavid van Moolenbroek
360*d1e4d7ceSDavid van Moolenbroek #endif /* SHORT_STRINGS */
361*d1e4d7ceSDavid van Moolenbroek
362*d1e4d7ceSDavid van Moolenbroek Char *
strip(Char * cp)363*d1e4d7ceSDavid van Moolenbroek strip(Char *cp)
364*d1e4d7ceSDavid van Moolenbroek {
365*d1e4d7ceSDavid van Moolenbroek Char *dp;
366*d1e4d7ceSDavid van Moolenbroek
367*d1e4d7ceSDavid van Moolenbroek dp = cp;
368*d1e4d7ceSDavid van Moolenbroek if (!cp)
369*d1e4d7ceSDavid van Moolenbroek return (cp);
370*d1e4d7ceSDavid van Moolenbroek while ((*dp++ &= TRIM) != '\0')
371*d1e4d7ceSDavid van Moolenbroek continue;
372*d1e4d7ceSDavid van Moolenbroek return (cp);
373*d1e4d7ceSDavid van Moolenbroek }
374*d1e4d7ceSDavid van Moolenbroek
375*d1e4d7ceSDavid van Moolenbroek Char *
quote(Char * cp)376*d1e4d7ceSDavid van Moolenbroek quote(Char *cp)
377*d1e4d7ceSDavid van Moolenbroek {
378*d1e4d7ceSDavid van Moolenbroek Char *dp;
379*d1e4d7ceSDavid van Moolenbroek
380*d1e4d7ceSDavid van Moolenbroek dp = cp;
381*d1e4d7ceSDavid van Moolenbroek if (!cp)
382*d1e4d7ceSDavid van Moolenbroek return (cp);
383*d1e4d7ceSDavid van Moolenbroek while (*dp != '\0')
384*d1e4d7ceSDavid van Moolenbroek *dp++ |= QUOTE;
385*d1e4d7ceSDavid van Moolenbroek return (cp);
386*d1e4d7ceSDavid van Moolenbroek }
387*d1e4d7ceSDavid van Moolenbroek
388*d1e4d7ceSDavid van Moolenbroek void
udvar(Char * name)389*d1e4d7ceSDavid van Moolenbroek udvar(Char *name)
390*d1e4d7ceSDavid van Moolenbroek {
391*d1e4d7ceSDavid van Moolenbroek setname(vis_str(name));
392*d1e4d7ceSDavid van Moolenbroek stderror(ERR_NAME | ERR_UNDVAR);
393*d1e4d7ceSDavid van Moolenbroek /* NOTREACHED */
394*d1e4d7ceSDavid van Moolenbroek }
395*d1e4d7ceSDavid van Moolenbroek
396*d1e4d7ceSDavid van Moolenbroek int
prefix(Char * sub,Char * str)397*d1e4d7ceSDavid van Moolenbroek prefix(Char *sub, Char *str)
398*d1e4d7ceSDavid van Moolenbroek {
399*d1e4d7ceSDavid van Moolenbroek for (;;) {
400*d1e4d7ceSDavid van Moolenbroek if (*sub == 0)
401*d1e4d7ceSDavid van Moolenbroek return (1);
402*d1e4d7ceSDavid van Moolenbroek if (*str == 0)
403*d1e4d7ceSDavid van Moolenbroek return (0);
404*d1e4d7ceSDavid van Moolenbroek if (*sub++ != *str++)
405*d1e4d7ceSDavid van Moolenbroek return (0);
406*d1e4d7ceSDavid van Moolenbroek }
407*d1e4d7ceSDavid van Moolenbroek }
408