added "more" command
[unix-history] / usr / src / usr.bin / window / string.c
index 30cd82b..dd781fa 100644 (file)
@@ -1,10 +1,17 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)string.c    3.1 83/11/22";
+static char sccsid[] = "@(#)string.c   3.8 %G%";
 #endif
 
 #endif
 
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
+
 #include "string.h"
 
 char *malloc();
 #include "string.h"
 
 char *malloc();
+char *sprintf();
 
 char *
 str_cpy(s)
 
 char *
 str_cpy(s)
@@ -13,7 +20,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 +28,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 +65,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 +75,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 +87,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