do case insensitive comparison on domain name
[unix-history] / usr / src / usr.bin / window / string.c
index 30cd82b..10b83af 100644 (file)
@@ -1,6 +1,23 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)string.c    3.1 83/11/22";
-#endif
+static char sccsid[] = "@(#)string.c   3.11 (Berkeley) %G%";
+#endif /* not lint */
 
 #include "string.h"
 
 
 #include "string.h"
 
@@ -13,7 +30,7 @@ register char *s;
        char *str;
        register char *p;
 
        char *str;
        register char *p;
 
-       str = p = malloc((unsigned) strlen(s) + 1);
+       str = p = str_alloc(strlen(s) + 1);
        if (p == 0)
                return 0;
        while (*p++ = *s++)
        if (p == 0)
                return 0;
        while (*p++ = *s++)
@@ -21,6 +38,26 @@ register char *s;
        return str;
 }
 
        return str;
 }
 
+char *
+str_ncpy(s, n)
+register char *s;
+register n;
+{
+       int l = strlen(s);
+       char *str;
+       register char *p;
+
+       if (n > l)
+               n = l;
+       str = p = str_alloc(n + 1);
+       if (p == 0)
+               return 0;
+       while (--n >= 0)
+               *p++ = *s++;
+       *p = 0;
+       return str;
+}
+
 char *
 str_itoa(i)
 int i;
 char *
 str_itoa(i)
 int i;
@@ -38,7 +75,7 @@ char *s1, *s2;
        char *str;
        register char *p, *q;
 
        char *str;
        register char *p, *q;
 
-       str = p = malloc((unsigned) strlen(s1) + strlen(s2) + 1);
+       str = p = str_alloc(strlen(s1) + strlen(s2) + 1);
        if (p == 0)
                return 0;
        for (q = s1; *p++ = *q++;)
        if (p == 0)
                return 0;
        for (q = s1; *p++ = *q++;)
@@ -48,15 +85,6 @@ char *s1, *s2;
        return str;
 }
 
        return str;
 }
 
-str_free(str)
-char *str;
-{
-       extern char end[];
-
-       if (str >= end)
-               free(str);
-}
-
 /*
  * match s against p.
  * s can be a prefix of p with at least min characters.
 /*
  * match s against p.
  * s can be a prefix of p with at least min characters.
@@ -69,3 +97,38 @@ register min;
                ;
        return *s == *p || *s == 0 && min <= 0;
 }
                ;
        return *s == *p || *s == 0 && min <= 0;
 }
+
+#ifdef STR_DEBUG
+char *
+str_alloc(l)
+int l;
+{
+       register struct string *s;
+
+       s = (struct string *) malloc((unsigned)l + str_offset);
+       if (s == 0)
+               return 0;
+       if (str_head.s_forw == 0)
+               str_head.s_forw = str_head.s_back = &str_head;
+       s->s_forw = str_head.s_forw;
+       s->s_back = &str_head;
+       str_head.s_forw = s;
+       s->s_forw->s_back = s;
+       return s->s_data;
+}
+
+str_free(str)
+char *str;
+{
+       register struct string *s;
+
+       for (s = str_head.s_forw; s != &str_head && s->s_data != str;
+            s = s->s_forw)
+               ;
+       if (s == &str_head)
+               abort();
+       s->s_back->s_forw = s->s_forw;
+       s->s_forw->s_back = s->s_back;
+       free((char *)s);
+}
+#endif