summaryrefslogtreecommitdiffstats
path: root/contrib/tcsh/sh.misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcsh/sh.misc.c')
-rw-r--r--contrib/tcsh/sh.misc.c516
1 files changed, 516 insertions, 0 deletions
diff --git a/contrib/tcsh/sh.misc.c b/contrib/tcsh/sh.misc.c
new file mode 100644
index 0000000..5b35953
--- /dev/null
+++ b/contrib/tcsh/sh.misc.c
@@ -0,0 +1,516 @@
+/* $Header: /src/pub/tcsh/sh.misc.c,v 3.23 1997/02/23 19:03:23 christos Exp $ */
+/*
+ * sh.misc.c: Miscelaneous functions
+ */
+/*-
+ * Copyright (c) 1980, 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include "sh.h"
+
+RCSID("$Id: sh.misc.c,v 3.23 1997/02/23 19:03:23 christos Exp $")
+
+static int renum __P((int, int));
+static Char **blkend __P((Char **));
+static Char **blkcat __P((Char **, Char **));
+
+/*
+ * C Shell
+ */
+
+int
+any(s, c)
+ register char *s;
+ register int c;
+{
+ if (!s)
+ return (0); /* Check for nil pointer */
+ while (*s)
+ if (*s++ == c)
+ return (1);
+ return (0);
+}
+
+void
+setzero(cp, i)
+ char *cp;
+ int i;
+{
+ if (i != 0)
+ do
+ *cp++ = 0;
+ while (--i);
+}
+
+char *
+strsave(s)
+ register const char *s;
+{
+ char *n;
+ register char *p;
+
+ if (s == NULL)
+ s = (const char *) "";
+ for (p = (char *) s; *p++ != '\0';)
+ continue;
+ n = p = (char *) xmalloc((size_t)
+ ((((const char *) p) - s) * sizeof(char)));
+ while ((*p++ = *s++) != '\0')
+ continue;
+ return (n);
+}
+
+static Char **
+blkend(up)
+ register Char **up;
+{
+
+ while (*up)
+ up++;
+ return (up);
+}
+
+
+void
+blkpr(av)
+ register Char **av;
+{
+
+ for (; *av; av++) {
+ xprintf("%S", *av);
+ if (av[1])
+ xprintf(" ");
+ }
+}
+
+void
+blkexpand(av, str)
+ register Char **av;
+ Char *str;
+{
+ *str = '\0';
+ for (; *av; av++) {
+ (void) Strcat(str, *av);
+ if (av[1])
+ (void) Strcat(str, STRspace);
+ }
+}
+
+int
+blklen(av)
+ register Char **av;
+{
+ register int i = 0;
+
+ while (*av++)
+ i++;
+ return (i);
+}
+
+Char **
+blkcpy(oav, bv)
+ Char **oav;
+ register Char **bv;
+{
+ register Char **av = oav;
+
+ while ((*av++ = *bv++) != NULL)
+ continue;
+ return (oav);
+}
+
+static Char **
+blkcat(up, vp)
+ Char **up, **vp;
+{
+
+ (void) blkcpy(blkend(up), vp);
+ return (up);
+}
+
+void
+blkfree(av0)
+ Char **av0;
+{
+ register Char **av = av0;
+
+ if (!av0)
+ return;
+ for (; *av; av++)
+ xfree((ptr_t) * av);
+ xfree((ptr_t) av0);
+}
+
+Char **
+saveblk(v)
+ register Char **v;
+{
+ register Char **newv =
+ (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
+ Char **onewv = newv;
+
+ while (*v)
+ *newv++ = Strsave(*v++);
+ return (onewv);
+}
+
+#if !defined(SHORT_STRINGS) && !defined(POSIX)
+char *
+strstr(s, t)
+ register const char *s, *t;
+{
+ do {
+ register const char *ss = s;
+ register const char *tt = t;
+
+ do
+ if (*tt == '\0')
+ return ((char *) s);
+ while (*ss++ == *tt++);
+ } while (*s++ != '\0');
+ return (NULL);
+}
+
+#endif /* !SHORT_STRINGS && !POSIX */
+
+#ifndef SHORT_STRINGS
+char *
+strspl(cp, dp)
+ char *cp, *dp;
+{
+ char *ep;
+ register char *p, *q;
+
+ if (!cp)
+ cp = "";
+ if (!dp)
+ dp = "";
+ for (p = cp; *p++ != '\0';)
+ continue;
+ for (q = dp; *q++ != '\0';)
+ continue;
+ ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char)));
+ for (p = ep, q = cp; (*p++ = *q++) != '\0';)
+ continue;
+ for (p--, q = dp; (*p++ = *q++) != '\0';)
+ continue;
+ return (ep);
+}
+
+#endif /* !SHORT_STRINGS */
+
+Char **
+blkspl(up, vp)
+ register Char **up, **vp;
+{
+ register Char **wp =
+ (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1),
+ sizeof(Char **));
+
+ (void) blkcpy(wp, up);
+ return (blkcat(wp, vp));
+}
+
+Char
+lastchr(cp)
+ register Char *cp;
+{
+
+ if (!cp)
+ return (0);
+ if (!*cp)
+ return (0);
+ while (cp[1])
+ cp++;
+ return (*cp);
+}
+
+/*
+ * This routine is called after an error to close up
+ * any units which may have been left open accidentally.
+ */
+void
+closem()
+{
+ register int f;
+
+#ifdef YPBUGS
+ /* suggested by Justin Bur; thanks to Karl Kleinpaste */
+ fix_yp_bugs();
+#endif /* YPBUGS */
+ for (f = 0; f < NOFILE; f++)
+ if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
+ f != FSHTTY
+#ifdef MALLOC_TRACE
+ && f != 25
+#endif /* MALLOC_TRACE */
+ )
+ {
+ (void) close(f);
+#ifdef NISPLUS
+ if(f < 3)
+ (void) open(_PATH_DEVNULL, O_RDONLY);
+#endif /* NISPLUS */
+ }
+}
+
+#ifndef CLOSE_ON_EXEC
+/*
+ * Close files before executing a file.
+ * We could be MUCH more intelligent, since (on a version 7 system)
+ * we need only close files here during a source, the other
+ * shell fd's being in units 16-19 which are closed automatically!
+ */
+void
+closech()
+{
+ register int f;
+
+ if (didcch)
+ return;
+ didcch = 1;
+ SHIN = 0;
+ SHOUT = 1;
+ SHDIAG = 2;
+ OLDSTD = 0;
+ isoutatty = isatty(SHOUT);
+ isdiagatty = isatty(SHDIAG);
+ for (f = 3; f < NOFILE; f++)
+ (void) close(f);
+}
+
+#endif /* CLOSE_ON_EXEC */
+
+void
+donefds()
+{
+
+ (void) close(0);
+ (void) close(1);
+ (void) close(2);
+ didfds = 0;
+#ifdef NISPLUS
+ {
+ int fd = open(_PATH_DEVNULL, O_RDONLY);
+ (void) dup2(fd, 1);
+ (void) dup2(fd, 2);
+ if (fd != 0) {
+ (void) dup2(fd, 0);
+ (void) close(fd);
+ }
+ }
+#endif /*NISPLUS*/
+}
+
+/*
+ * Move descriptor i to j.
+ * If j is -1 then we just want to get i to a safe place,
+ * i.e. to a unit > 2. This also happens in dcopy.
+ */
+int
+dmove(i, j)
+ register int i, j;
+{
+
+ if (i == j || i < 0)
+ return (i);
+#ifdef HAVEDUP2
+ if (j >= 0) {
+ (void) dup2(i, j);
+ if (j != i)
+ (void) close(i);
+ return (j);
+ }
+#endif
+ j = dcopy(i, j);
+ if (j != i)
+ (void) close(i);
+ return (j);
+}
+
+int
+dcopy(i, j)
+ register int i, j;
+{
+
+ if (i == j || i < 0 || (j < 0 && i > 2))
+ return (i);
+ if (j >= 0) {
+#ifdef HAVEDUP2
+ (void) dup2(i, j);
+ return (j);
+#else
+ (void) close(j);
+#endif
+ }
+ return (renum(i, j));
+}
+
+static int
+renum(i, j)
+ register int i, j;
+{
+ register int k = dup(i);
+
+ if (k < 0)
+ return (-1);
+ if (j == -1 && k > 2)
+ return (k);
+ if (k != j) {
+ j = renum(k, j);
+ (void) close(k);
+ return (j);
+ }
+ return (k);
+}
+
+/*
+ * Left shift a command argument list, discarding
+ * the first c arguments. Used in "shift" commands
+ * as well as by commands like "repeat".
+ */
+void
+lshift(v, c)
+ register Char **v;
+ register int c;
+{
+ register Char **u;
+
+ for (u = v; *u && --c >= 0; u++)
+ xfree((ptr_t) *u);
+ (void) blkcpy(v, u);
+}
+
+int
+number(cp)
+ Char *cp;
+{
+ if (!cp)
+ return (0);
+ if (*cp == '-') {
+ cp++;
+ if (!Isdigit(*cp))
+ return (0);
+ cp++;
+ }
+ while (*cp && Isdigit(*cp))
+ cp++;
+ return (*cp == 0);
+}
+
+Char **
+copyblk(v)
+ register Char **v;
+{
+ register Char **nv =
+ (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
+
+ return (blkcpy(nv, v));
+}
+
+#ifndef SHORT_STRINGS
+char *
+strend(cp)
+ register char *cp;
+{
+ if (!cp)
+ return (cp);
+ while (*cp)
+ cp++;
+ return (cp);
+}
+
+#endif /* SHORT_STRINGS */
+
+Char *
+strip(cp)
+ Char *cp;
+{
+ register Char *dp = cp;
+
+ if (!cp)
+ return (cp);
+ while ((*dp++ &= TRIM) != '\0')
+ continue;
+ return (cp);
+}
+
+Char *
+quote(cp)
+ Char *cp;
+{
+ register Char *dp = cp;
+
+ if (!cp)
+ return (cp);
+ while (*dp != '\0')
+ *dp++ |= QUOTE;
+ return (cp);
+}
+
+Char *
+quote_meta(d, s)
+ Char *d;
+ const Char *s;
+{
+ Char *r = d;
+ while (*s != '\0') {
+ if (cmap(*s, _META | _DOL | _QF | _QB | _ESC | _GLOB))
+ *d++ = '\\';
+ *d++ = *s++;
+ }
+ *d = '\0';
+ return r;
+}
+
+void
+udvar(name)
+ Char *name;
+{
+
+ setname(short2str(name));
+ stderror(ERR_NAME | ERR_UNDVAR);
+}
+
+int
+prefix(sub, str)
+ register Char *sub, *str;
+{
+
+ for (;;) {
+ if (*sub == 0)
+ return (1);
+ if (*str == 0)
+ return (0);
+ if ((*sub++ & TRIM) != (*str++ & TRIM))
+ return (0);
+ }
+}
OpenPOWER on IntegriCloud