xref: /original-bsd/usr.bin/window/string.c (revision c3e32dec)
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 *
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 *
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 *
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 *
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  */
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 *
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 
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