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