1 /*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)string.c 8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14
15 #include "string.h"
16
17 char *malloc();
18
19 char *
str_cpy(s)20 str_cpy(s)
21 register char *s;
22 {
23 char *str;
24 register char *p;
25
26 str = p = str_alloc(strlen(s) + 1);
27 if (p == 0)
28 return 0;
29 while (*p++ = *s++)
30 ;
31 return str;
32 }
33
34 char *
str_ncpy(s,n)35 str_ncpy(s, n)
36 register char *s;
37 register n;
38 {
39 int l = strlen(s);
40 char *str;
41 register char *p;
42
43 if (n > l)
44 n = l;
45 str = p = str_alloc(n + 1);
46 if (p == 0)
47 return 0;
48 while (--n >= 0)
49 *p++ = *s++;
50 *p = 0;
51 return str;
52 }
53
54 char *
str_itoa(i)55 str_itoa(i)
56 int i;
57 {
58 char buf[30];
59
60 (void) sprintf(buf, "%d", i);
61 return str_cpy(buf);
62 }
63
64 char *
str_cat(s1,s2)65 str_cat(s1, s2)
66 char *s1, *s2;
67 {
68 char *str;
69 register char *p, *q;
70
71 str = p = str_alloc(strlen(s1) + strlen(s2) + 1);
72 if (p == 0)
73 return 0;
74 for (q = s1; *p++ = *q++;)
75 ;
76 for (q = s2, p--; *p++ = *q++;)
77 ;
78 return str;
79 }
80
81 /*
82 * match s against p.
83 * s can be a prefix of p with at least min characters.
84 */
str_match(s,p,min)85 str_match(s, p, min)
86 register char *s, *p;
87 register min;
88 {
89 for (; *s && *p && *s == *p; s++, p++, min--)
90 ;
91 return *s == *p || *s == 0 && min <= 0;
92 }
93
94 #ifdef STR_DEBUG
95 char *
str_alloc(l)96 str_alloc(l)
97 int l;
98 {
99 register struct string *s;
100
101 s = (struct string *) malloc((unsigned)l + str_offset);
102 if (s == 0)
103 return 0;
104 if (str_head.s_forw == 0)
105 str_head.s_forw = str_head.s_back = &str_head;
106 s->s_forw = str_head.s_forw;
107 s->s_back = &str_head;
108 str_head.s_forw = s;
109 s->s_forw->s_back = s;
110 return s->s_data;
111 }
112
str_free(str)113 str_free(str)
114 char *str;
115 {
116 register struct string *s;
117
118 for (s = str_head.s_forw; s != &str_head && s->s_data != str;
119 s = s->s_forw)
120 ;
121 if (s == &str_head)
122 abort();
123 s->s_back->s_forw = s->s_forw;
124 s->s_forw->s_back = s->s_back;
125 free((char *)s);
126 }
127 #endif
128