fix xfree() so it can be re-written as a macro
[unix-history] / usr / src / bin / csh / misc.c
index e37e6ce..e8398f9 100644 (file)
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)misc.c     5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)misc.c     5.15 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
-#include "sh.h"
+#include <sys/param.h>
+#include <stdlib.h>
+#include <unistd.h>
+#if __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
 
 
-/*
- * C Shell
- */
+#include "csh.h"
+#include "extern.h"
 
 
-onlyread(cp)
-       char *cp;
-{
-       extern char end[];
+static int     renum __P((int, int));
 
 
-       return (cp < end);
-}
-
-xfree(cp)
-       char *cp;
+int
+any(s, c)
+    register char *s;
+    register int c;
 {
 {
-       extern char end[];
-
-       if (cp >= end && cp < (char *) &cp)
-               free(cp);
+    if (!s)
+       return (0);             /* Check for nil pointer */
+    while (*s)
+       if (*s++ == c)
+           return (1);
+    return (0);
 }
 
 }
 
-char *
-savestr(s)
-       register char *s;
+void
+setzero(cp, i)
+    char   *cp;
+    int     i;
 {
 {
-       char *n;
-       register char *p;
-
-       if (s == 0)
-               s = "";
-       for (p = s; *p++;)
-               ;
-       n = p = xalloc((unsigned) (p - s));
-       while (*p++ = *s++)
-               ;
-       return (n);
+    if (i != 0)
+       do
+           *cp++ = 0;
+       while (--i);
 }
 
 }
 
-char *
-calloc(i, j)
-       register unsigned i;
-       unsigned j;
+char   *
+strsave(s)
+    register char *s;
 {
 {
-       char *cp;
-
-       i *= j;
-       cp = xalloc(i);
-       bzero(cp, (int)i);
-       return (cp);
+    char   *n;
+    register char *p;
+
+    if (s == NULL)
+       s = "";
+    for (p = s; *p++;);
+    n = p = (char *) xmalloc((size_t) ((p - s) * sizeof(char)));
+    while (*p++ = *s++);
+    return (n);
 }
 
 }
 
-nomem(i)
-       unsigned i;
+Char  **
+blkend(up)
+    register Char **up;
 {
 {
-#ifdef debug
-       static char *av[2] = {0, 0};
-#endif
 
 
-       child++;
-#ifndef debug
-       error("Out of memory");
-#ifdef lint
-       i = i;
-#endif
-#else
-       showall(av);
-       printf("i=%d: Out of memory\n", i);
-       chdir("/usr/bill/cshcore");
-       abort();
-#endif
-       return 0;               /* fool lint */
+    while (*up)
+       up++;
+    return (up);
 }
 
 }
 
-char **
-blkend(up)
-       register char **up;
-{
 
 
-       while (*up)
-               up++;
-       return (up);
-}
-blkpr(av)
-       register char **av;
+void
+blkpr(fp, av)
+    FILE *fp;
+    register Char **av;
 {
 
 {
 
-       for (; *av; av++) {
-               printf("%s", *av);
-               if (av[1])
-                       printf(" ");
-       }
+    for (; *av; av++) {
+       (void) fprintf(fp, "%s", short2str(*av));
+       if (av[1])
+           (void) fprintf(fp, " ");
+    }
 }
 
 }
 
+int
 blklen(av)
 blklen(av)
-       register char **av;
+    register Char **av;
 {
 {
-       register int i = 0;
+    register int i = 0;
 
 
-       while (*av++)
-               i++;
-       return (i);
+    while (*av++)
+       i++;
+    return (i);
 }
 
 }
 
-char **
+Char  **
 blkcpy(oav, bv)
 blkcpy(oav, bv)
-       char **oav;
-       register char **bv;
+    Char  **oav;
+    register Char **bv;
 {
 {
-       register char **av = oav;
+    register Char **av = oav;
 
 
-       while (*av++ = *bv++)
-               continue;
-       return (oav);
+    while (*av++ = *bv++)
+       continue;
+    return (oav);
 }
 
 }
 
-char **
+Char  **
 blkcat(up, vp)
 blkcat(up, vp)
-       char **up, **vp;
+    Char  **up, **vp;
 {
 
 {
 
-       (void) blkcpy(blkend(up), vp);
-       return (up);
+    (void) blkcpy(blkend(up), vp);
+    return (up);
 }
 
 }
 
+void
 blkfree(av0)
 blkfree(av0)
-       char **av0;
+    Char  **av0;
 {
 {
-       register char **av = av0;
+    register Char **av = av0;
 
 
-       for (; *av; av++)
-               XFREE(*av)
-       XFREE((char *)av0)
+    if (!av0)
+       return;
+    for (; *av; av++)
+       xfree((ptr_t) * av);
+    xfree((ptr_t) av0);
 }
 
 }
 
-char **
+Char  **
 saveblk(v)
 saveblk(v)
-       register char **v;
+    register Char **v;
 {
 {
-       register char **newv =
-               (char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **));
-       char **onewv = newv;
+    register Char **newv =
+    (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
+    Char  **onewv = newv;
+
+    while (*v)
+       *newv++ = Strsave(*v++);
+    return (onewv);
+}
 
 
-       while (*v)
-               *newv++ = savestr(*v++);
-       return (onewv);
+#ifdef NOTUSED
+char   *
+strstr(s, t)
+    register char *s, *t;
+{
+    do {
+       register char *ss = s;
+       register char *tt = t;
+
+       do
+           if (*tt == '\0')
+               return (s);
+       while (*ss++ == *tt++);
+    } while (*s++ != '\0');
+    return (NULL);
 }
 
 }
 
-char *
+#endif /* NOTUSED */
+
+#ifndef SHORT_STRINGS
+char   *
 strspl(cp, dp)
 strspl(cp, dp)
-       char *cp, *dp;
+    char   *cp, *dp;
 {
 {
-       char *ep;
-       register char *p, *q;
-
-       for (p = cp; *p++;)
-               ;
-       for (q = dp; *q++;)
-               ;
-       ep = xalloc((unsigned) ((p - cp) + (q - dp) - 1));
-       for (p = ep, q = cp; *p++ = *q++;)
-               ;
-       for (p--, q = dp; *p++ = *q++;)
-               ;
-       return (ep);
+    char   *ep;
+    register char *p, *q;
+
+    if (!cp)
+       cp = "";
+    if (!dp)
+       dp = "";
+    for (p = cp; *p++;);
+    for (q = dp; *q++;);
+    ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char)));
+    for (p = ep, q = cp; *p++ = *q++;);
+    for (p--, q = dp; *p++ = *q++;);
+    return (ep);
 }
 
 }
 
-char **
+#endif
+
+Char  **
 blkspl(up, vp)
 blkspl(up, vp)
-       register char **up, **vp;
+    register Char **up, **vp;
 {
 {
-       register char **wp =
-               (char **) calloc((unsigned) (blklen(up) + blklen(vp) + 1),
-                       sizeof (char **));
+    register Char **wp =
+    (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1),
+                     sizeof(Char **));
 
 
-       (void) blkcpy(wp, up);
-       return (blkcat(wp, vp));
+    (void) blkcpy(wp, up);
+    return (blkcat(wp, vp));
 }
 
 }
 
+Char
 lastchr(cp)
 lastchr(cp)
-       register char *cp;
+    register Char *cp;
 {
 
 {
 
-       if (!*cp)
-               return (0);
-       while (cp[1])
-               cp++;
-       return (*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.
  */
 }
 
 /*
  * This routine is called after an error to close up
  * any units which may have been left open accidentally.
  */
+void
 closem()
 {
 closem()
 {
-       register int f;
+    register int f;
 
 
-       for (f = 0; f < NOFILE; f++)
-               if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD &&
-                   f != FSHTTY)
-                       (void) close(f);
+    for (f = 0; f < NOFILE; f++)
+       if (f != SHIN && f != SHOUT && f != SHERR && f != OLDSTD &&
+           f != FSHTTY)
+           (void) close(f);
 }
 
 }
 
+void
 donefds()
 {
 donefds()
 {
+    (void) close(0);
+    (void) close(1);
+    (void) close(2);
 
 
-       (void) close(0);
-       (void) close(1);
-       (void) close(2);
-       didfds = 0;
+    didfds = 0;
 }
 
 /*
 }
 
 /*
@@ -229,51 +241,56 @@ donefds()
  * 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.
  */
  * 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)
 dmove(i, j)
-       register int i, j;
+    register int i, j;
 {
 
 {
 
-       if (i == j || i < 0)
-               return (i);
-       if (j >= 0) {
-               (void) dup2(i, j);
-               return (j);
-       }
-       j = dcopy(i, j);
+    if (i == j || i < 0)
+       return (i);
+    if (j >= 0) {
+       (void) dup2(i, j);
        if (j != i)
        if (j != i)
-               (void) close(i);
+           (void) close(i);
        return (j);
        return (j);
+    }
+    j = dcopy(i, j);
+    if (j != i)
+       (void) close(i);
+    return (j);
 }
 
 }
 
+int
 dcopy(i, j)
 dcopy(i, j)
-       register int i, j;
+    register int i, j;
 {
 
 {
 
-       if (i == j || i < 0 || j < 0 && i > 2)
-               return (i);
-       if (j >= 0) {
-               (void) dup2(i, j);
-               return (j);
-       }
-       (void) close(j);
-       return (renum(i, j));
+    if (i == j || i < 0 || j < 0 && i > 2)
+       return (i);
+    if (j >= 0) {
+       (void) dup2(i, j);
+       return (j);
+    }
+    (void) close(j);
+    return (renum(i, j));
 }
 
 }
 
+static int
 renum(i, j)
 renum(i, j)
-       register int 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);
-       }
+    register int k = dup(i);
+
+    if (k < 0)
+       return (-1);
+    if (j == -1 && k > 2)
        return (k);
        return (k);
+    if (k != j) {
+       j = renum(k, j);
+       (void) close(k);
+       return (j);
+    }
+    return (k);
 }
 
 /*
 }
 
 /*
@@ -281,80 +298,91 @@ renum(i, j)
  * the first c arguments.  Used in "shift" commands
  * as well as by commands like "repeat".
  */
  * the first c arguments.  Used in "shift" commands
  * as well as by commands like "repeat".
  */
+void
 lshift(v, c)
 lshift(v, c)
-       register char **v;
-       register int c;
+    register Char **v;
+    register int c;
 {
 {
-       register char **u = v;
+    register Char **u;
 
 
-       while (*u && --c >= 0)
-               xfree(*u++);
-       (void) blkcpy(v, u);
+    for (u = v; *u && --c >= 0; u++)
+       xfree((ptr_t) *u);
+    (void) blkcpy(v, u);
 }
 
 }
 
+int
 number(cp)
 number(cp)
-       char *cp;
+    Char   *cp;
 {
 {
-
-       if (*cp == '-') {
-               cp++;
-               if (!digit(*cp++))
-                       return (0);
-       }
-       while (*cp && digit(*cp))
-               cp++;
-       return (*cp == 0);
+    if (!cp)
+       return(0);
+    if (*cp == '-') {
+       cp++;
+       if (!Isdigit(*cp))
+           return (0);
+       cp++;
+    }
+    while (*cp && Isdigit(*cp))
+       cp++;
+    return (*cp == 0);
 }
 
 }
 
-char **
+Char  **
 copyblk(v)
 copyblk(v)
-       register char **v;
+    register Char **v;
 {
 {
-       register char **nv =
-               (char **) calloc((unsigned) (blklen(v) + 1), sizeof (char **));
+    Char  **nv = (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **));
 
 
-       return (blkcpy(nv, v));
+    return (blkcpy(nv, v));
 }
 
 }
 
-char *
+#ifndef SHORT_STRINGS
+char   *
 strend(cp)
 strend(cp)
-       register char *cp;
+    register char *cp;
 {
 {
-
-       while (*cp)
-               cp++;
+    if (!cp)
        return (cp);
        return (cp);
+    while (*cp)
+       cp++;
+    return (cp);
 }
 
 }
 
-char *
+#endif                         /* SHORT_STRINGS */
+
+Char   *
 strip(cp)
 strip(cp)
-       char *cp;
+    Char   *cp;
 {
 {
-       register char *dp = cp;
+    register Char *dp = cp;
 
 
-       while (*dp++ &= TRIM)
-               continue;
+    if (!cp)
        return (cp);
        return (cp);
+    while (*dp++ &= TRIM)
+       continue;
+    return (cp);
 }
 
 }
 
+void
 udvar(name)
 udvar(name)
-       char *name;
+    Char   *name;
 {
 
 {
 
-       setname(name);
-       bferr("Undefined variable");
+    setname(short2str(name));
+    stderror(ERR_NAME | ERR_UNDVAR);
 }
 
 }
 
+int
 prefix(sub, str)
 prefix(sub, str)
-       register char *sub, *str;
+    register Char *sub, *str;
 {
 
 {
 
-       for (;;) {
-               if (*sub == 0)
-                       return (1);
-               if (*str == 0)
-                       return (0);
-               if (*sub++ != *str++)
-                       return (0);
-       }
+    for (;;) {
+       if (*sub == 0)
+           return (1);
+       if (*str == 0)
+           return (0);
+       if (*sub++ != *str++)
+           return (0);
+    }
 }
 }