xref: /csrg-svn/bin/csh/misc.c (revision 21938)
1*21938Sdist /*
2*21938Sdist  * Copyright (c) 1980 Regents of the University of California.
3*21938Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21938Sdist  * specifies the terms and conditions for redistribution.
5*21938Sdist  */
6*21938Sdist 
717511Sedward #ifndef lint
8*21938Sdist static char sccsid[] = "@(#)misc.c	5.1 (Berkeley) 06/04/85";
9*21938Sdist #endif not lint
101300Sbill 
111300Sbill #include "sh.h"
121300Sbill 
131300Sbill /*
141300Sbill  * C Shell
151300Sbill  */
161300Sbill 
171300Sbill letter(c)
181300Sbill 	register char c;
191300Sbill {
201300Sbill 
211300Sbill 	return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
221300Sbill }
231300Sbill 
241300Sbill digit(c)
251300Sbill 	register char c;
261300Sbill {
271300Sbill 
281300Sbill 	return (c >= '0' && c <= '9');
291300Sbill }
301300Sbill 
311300Sbill alnum(c)
321300Sbill 	register char c;
331300Sbill {
341300Sbill 	return (letter(c) || digit(c));
351300Sbill }
361300Sbill 
371300Sbill any(c, s)
381300Sbill 	register int c;
391300Sbill 	register char *s;
401300Sbill {
411300Sbill 
421300Sbill 	while (*s)
431300Sbill 		if (*s++ == c)
441300Sbill 			return(1);
451300Sbill 	return(0);
461300Sbill }
471300Sbill 
4817511Sedward onlyread(cp)
4917511Sedward 	char *cp;
5017511Sedward {
5117511Sedward 	extern char end[];
5217511Sedward 
5317511Sedward 	return (cp < end);
5417511Sedward }
5517511Sedward 
5617511Sedward xfree(cp)
5717511Sedward 	char *cp;
5817511Sedward {
5917511Sedward 	extern char end[];
6017511Sedward 
6117511Sedward 	if (cp >= end && cp < (char *) &cp)
6217511Sedward 		free(cp);
6317511Sedward }
6417511Sedward 
651300Sbill char *
6617511Sedward savestr(s)
6717511Sedward 	register char *s;
6817511Sedward {
6917511Sedward 	char *n;
7017511Sedward 	register char *p;
7117511Sedward 
7217511Sedward 	if (s == 0)
7317511Sedward 		s = "";
7417511Sedward 	for (p = s; *p++;)
7517511Sedward 		;
7617511Sedward 	n = p = xalloc((unsigned) (p - s));
7717511Sedward 	while (*p++ = *s++)
7817511Sedward 		;
7917511Sedward 	return (n);
8017511Sedward }
8117511Sedward 
8217511Sedward char *
831300Sbill calloc(i, j)
841300Sbill 	register unsigned i;
851300Sbill 	unsigned j;
861300Sbill {
871300Sbill 	register char *cp, *dp;
881300Sbill 
891300Sbill 	i *= j;
9017511Sedward 	dp = cp = xalloc(i);
911300Sbill 	if (i != 0)
921300Sbill 		do
931300Sbill 			*dp++ = 0;
941300Sbill 		while (--i);
951300Sbill 	return (cp);
961300Sbill }
971300Sbill 
9817511Sedward nomem(i)
9917511Sedward 	unsigned i;
10017511Sedward {
10117511Sedward #ifdef debug
10217511Sedward 	static char *av[2] = {0, 0};
10317511Sedward #endif
10417511Sedward 
10517511Sedward 	child++;
10617511Sedward #ifndef debug
10717511Sedward 	error("Out of memory");
10817511Sedward #ifdef lint
10917511Sedward 	i = i;
11017511Sedward #endif
11117511Sedward #else
11217511Sedward 	showall(av);
11317511Sedward 	printf("i=%d: Out of memory\n", i);
11417511Sedward 	chdir("/usr/bill/cshcore");
11517511Sedward 	abort();
11617511Sedward #endif
11717511Sedward 	return 0;		/* fool lint */
11817511Sedward }
11917511Sedward 
1201300Sbill char **
1211300Sbill blkend(up)
1221300Sbill 	register char **up;
1231300Sbill {
1241300Sbill 
1251300Sbill 	while (*up)
1261300Sbill 		up++;
1271300Sbill 	return (up);
1281300Sbill }
1291300Sbill 
1301300Sbill blkpr(av)
1311300Sbill 	register char **av;
1321300Sbill {
1331300Sbill 
1341300Sbill 	for (; *av; av++) {
1351300Sbill 		printf("%s", *av);
1361300Sbill 		if (av[1])
1371300Sbill 			printf(" ");
1381300Sbill 	}
1391300Sbill }
1401300Sbill 
1411300Sbill blklen(av)
1421300Sbill 	register char **av;
1431300Sbill {
1441300Sbill 	register int i = 0;
1451300Sbill 
1461300Sbill 	while (*av++)
1471300Sbill 		i++;
1481300Sbill 	return (i);
1491300Sbill }
1501300Sbill 
1511300Sbill char **
1521300Sbill blkcpy(oav, bv)
1531300Sbill 	char **oav;
1541300Sbill 	register char **bv;
1551300Sbill {
1561300Sbill 	register char **av = oav;
1571300Sbill 
1581300Sbill 	while (*av++ = *bv++)
1591300Sbill 		continue;
1601300Sbill 	return (oav);
1611300Sbill }
1621300Sbill 
1631300Sbill char **
1641300Sbill blkcat(up, vp)
1651300Sbill 	char **up, **vp;
1661300Sbill {
1671300Sbill 
16817511Sedward 	(void) blkcpy(blkend(up), vp);
1691300Sbill 	return (up);
1701300Sbill }
1711300Sbill 
1721300Sbill blkfree(av0)
1731300Sbill 	char **av0;
1741300Sbill {
1751300Sbill 	register char **av = av0;
1761300Sbill 
17717511Sedward 	for (; *av; av++)
17817511Sedward 		XFREE(*av)
17917511Sedward 	XFREE((char *)av0)
1801300Sbill }
1811300Sbill 
1821300Sbill char **
1831300Sbill saveblk(v)
1841300Sbill 	register char **v;
1851300Sbill {
18617511Sedward 	register char **newv =
18717511Sedward 		(char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **));
1881300Sbill 	char **onewv = newv;
1891300Sbill 
1901300Sbill 	while (*v)
1911300Sbill 		*newv++ = savestr(*v++);
1921300Sbill 	return (onewv);
1931300Sbill }
1941300Sbill 
1951300Sbill char *
1961300Sbill strspl(cp, dp)
19717511Sedward 	char *cp, *dp;
1981300Sbill {
19917511Sedward 	char *ep;
20017511Sedward 	register char *p, *q;
2011300Sbill 
20217511Sedward 	for (p = cp; *p++;)
20317511Sedward 		;
20417511Sedward 	for (q = dp; *q++;)
20517511Sedward 		;
20617511Sedward 	ep = xalloc((unsigned) ((p - cp) + (q - dp) - 1));
20717511Sedward 	for (p = ep, q = cp; *p++ = *q++;)
20817511Sedward 		;
20917511Sedward 	for (p--, q = dp; *p++ = *q++;)
21017511Sedward 		;
2111300Sbill 	return (ep);
2121300Sbill }
2131300Sbill 
2141300Sbill char **
2151300Sbill blkspl(up, vp)
2161300Sbill 	register char **up, **vp;
2171300Sbill {
21817511Sedward 	register char **wp =
21917511Sedward 		(char **) calloc((unsigned) (blklen(up) + blklen(vp) + 1),
22017511Sedward 			sizeof (char **));
2211300Sbill 
22217511Sedward 	(void) blkcpy(wp, up);
2231300Sbill 	return (blkcat(wp, vp));
2241300Sbill }
2251300Sbill 
2261300Sbill lastchr(cp)
2271300Sbill 	register char *cp;
2281300Sbill {
2291300Sbill 
2301300Sbill 	if (!*cp)
2311300Sbill 		return (0);
2321300Sbill 	while (cp[1])
2331300Sbill 		cp++;
2341300Sbill 	return (*cp);
2351300Sbill }
2361300Sbill 
2371300Sbill /*
2381300Sbill  * This routine is called after an error to close up
2391300Sbill  * any units which may have been left open accidentally.
2401300Sbill  */
2411300Sbill closem()
2421300Sbill {
2431300Sbill 	register int f;
2441300Sbill 
2451300Sbill 	for (f = 0; f < NOFILE; f++)
2461300Sbill 		if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
2471300Sbill 		    f != FSHTTY)
24817511Sedward 			(void) close(f);
2491300Sbill }
2501300Sbill 
2511300Sbill donefds()
2521300Sbill {
2531300Sbill 
25417511Sedward 	(void) close(0);
25517511Sedward 	(void) close(1);
25617511Sedward 	(void) close(2);
2571300Sbill 	didfds = 0;
2581300Sbill }
2591300Sbill 
2601300Sbill /*
2611300Sbill  * Move descriptor i to j.
2621300Sbill  * If j is -1 then we just want to get i to a safe place,
2631300Sbill  * i.e. to a unit > 2.  This also happens in dcopy.
2641300Sbill  */
2651300Sbill dmove(i, j)
2661300Sbill 	register int i, j;
2671300Sbill {
2681300Sbill 
2691300Sbill 	if (i == j || i < 0)
2701300Sbill 		return (i);
2711300Sbill 	if (j >= 0) {
27217511Sedward 		(void) dup2(i, j);
2731300Sbill 		return (j);
27417511Sedward 	}
27517511Sedward 	j = dcopy(i, j);
2761300Sbill 	if (j != i)
27717511Sedward 		(void) close(i);
2781300Sbill 	return (j);
2791300Sbill }
2801300Sbill 
2811300Sbill dcopy(i, j)
2821300Sbill 	register int i, j;
2831300Sbill {
2841300Sbill 
2851300Sbill 	if (i == j || i < 0 || j < 0 && i > 2)
2861300Sbill 		return (i);
2871300Sbill 	if (j >= 0) {
28817511Sedward 		(void) dup2(i, j);
2891300Sbill 		return (j);
2901300Sbill 	}
29117511Sedward 	(void) close(j);
2921300Sbill 	return (renum(i, j));
2931300Sbill }
2941300Sbill 
2951300Sbill renum(i, j)
2961300Sbill 	register int i, j;
2971300Sbill {
2981300Sbill 	register int k = dup(i);
2991300Sbill 
3001300Sbill 	if (k < 0)
3011300Sbill 		return (-1);
3021300Sbill 	if (j == -1 && k > 2)
3031300Sbill 		return (k);
3041300Sbill 	if (k != j) {
3051300Sbill 		j = renum(k, j);
30617511Sedward 		(void) close(k);
3071300Sbill 		return (j);
3081300Sbill 	}
3091300Sbill 	return (k);
3101300Sbill }
3111300Sbill 
31216678Ssam #ifndef copy
3131300Sbill copy(to, from, size)
3141300Sbill 	register char *to, *from;
3151300Sbill 	register int size;
3161300Sbill {
3171300Sbill 
3181300Sbill 	if (size)
3191300Sbill 		do
3201300Sbill 			*to++ = *from++;
3211300Sbill 		while (--size != 0);
3221300Sbill }
32316678Ssam #endif
3241300Sbill 
3251300Sbill /*
3261300Sbill  * Left shift a command argument list, discarding
3271300Sbill  * the first c arguments.  Used in "shift" commands
3281300Sbill  * as well as by commands like "repeat".
3291300Sbill  */
3301300Sbill lshift(v, c)
3311300Sbill 	register char **v;
3321300Sbill 	register int c;
3331300Sbill {
3341300Sbill 	register char **u = v;
3351300Sbill 
3361300Sbill 	while (*u && --c >= 0)
3371300Sbill 		xfree(*u++);
33817511Sedward 	(void) blkcpy(v, u);
3391300Sbill }
3401300Sbill 
3411300Sbill number(cp)
3421300Sbill 	char *cp;
3431300Sbill {
3441300Sbill 
3451300Sbill 	if (*cp == '-') {
3461300Sbill 		cp++;
3471300Sbill 		if (!digit(*cp++))
3481300Sbill 			return (0);
3491300Sbill 	}
3501300Sbill 	while (*cp && digit(*cp))
3511300Sbill 		cp++;
3521300Sbill 	return (*cp == 0);
3531300Sbill }
3541300Sbill 
3551300Sbill char **
3561300Sbill copyblk(v)
3571300Sbill 	register char **v;
3581300Sbill {
35917511Sedward 	register char **nv =
36017511Sedward 		(char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **));
3611300Sbill 
3621300Sbill 	return (blkcpy(nv, v));
3631300Sbill }
3641300Sbill 
3651300Sbill char *
3661300Sbill strend(cp)
3671300Sbill 	register char *cp;
3681300Sbill {
3691300Sbill 
3701300Sbill 	while (*cp)
3711300Sbill 		cp++;
3721300Sbill 	return (cp);
3731300Sbill }
3741300Sbill 
3751300Sbill char *
3761300Sbill strip(cp)
3771300Sbill 	char *cp;
3781300Sbill {
3791300Sbill 	register char *dp = cp;
3801300Sbill 
3811300Sbill 	while (*dp++ &= TRIM)
3821300Sbill 		continue;
3831300Sbill 	return (cp);
3841300Sbill }
3851300Sbill 
3861300Sbill udvar(name)
3871300Sbill 	char *name;
3881300Sbill {
3891300Sbill 
3901300Sbill 	setname(name);
3911300Sbill 	bferr("Undefined variable");
3921300Sbill }
3931300Sbill 
3941300Sbill prefix(sub, str)
3951300Sbill 	register char *sub, *str;
3961300Sbill {
3971300Sbill 
3981300Sbill 	for (;;) {
3991300Sbill 		if (*sub == 0)
4001300Sbill 			return (1);
4011300Sbill 		if (*str == 0)
4021300Sbill 			return (0);
4031300Sbill 		if (*sub++ != *str++)
4041300Sbill 			return (0);
4051300Sbill 	}
4061300Sbill }
407