Annotation of src/usr.bin/window/string.c, Revision 1.1.1.1
1.1 deraadt 1: /* $NetBSD: string.c,v 1.5 1995/09/29 00:44:06 cgd Exp $ */
2:
3: /*
4: * Copyright (c) 1983, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * This code is derived from software contributed to Berkeley by
8: * Edward Wang at The University of California, Berkeley.
9: *
10: * Redistribution and use in source and binary forms, with or without
11: * modification, are permitted provided that the following conditions
12: * are met:
13: * 1. Redistributions of source code must retain the above copyright
14: * notice, this list of conditions and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
18: * 3. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed by the University of
21: * California, Berkeley and its contributors.
22: * 4. Neither the name of the University nor the names of its contributors
23: * may be used to endorse or promote products derived from this software
24: * without specific prior written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36: * SUCH DAMAGE.
37: */
38:
39: #ifndef lint
40: #if 0
41: static char sccsid[] = "@(#)string.c 8.1 (Berkeley) 6/6/93";
42: #else
43: static char rcsid[] = "$NetBSD: string.c,v 1.5 1995/09/29 00:44:06 cgd Exp $";
44: #endif
45: #endif /* not lint */
46:
47: #include "string.h"
48: #include <stdlib.h>
49: #include <string.h>
50:
51: char *
52: str_cpy(s)
53: register char *s;
54: {
55: char *str;
56: register char *p;
57:
58: str = p = str_alloc(strlen(s) + 1);
59: if (p == 0)
60: return 0;
61: while (*p++ = *s++)
62: ;
63: return str;
64: }
65:
66: char *
67: str_ncpy(s, n)
68: register char *s;
69: register n;
70: {
71: int l = strlen(s);
72: char *str;
73: register char *p;
74:
75: if (n > l)
76: n = l;
77: str = p = str_alloc(n + 1);
78: if (p == 0)
79: return 0;
80: while (--n >= 0)
81: *p++ = *s++;
82: *p = 0;
83: return str;
84: }
85:
86: char *
87: str_itoa(i)
88: int i;
89: {
90: char buf[30];
91:
92: (void) sprintf(buf, "%d", i);
93: return str_cpy(buf);
94: }
95:
96: char *
97: str_cat(s1, s2)
98: char *s1, *s2;
99: {
100: char *str;
101: register char *p, *q;
102:
103: str = p = str_alloc(strlen(s1) + strlen(s2) + 1);
104: if (p == 0)
105: return 0;
106: for (q = s1; *p++ = *q++;)
107: ;
108: for (q = s2, p--; *p++ = *q++;)
109: ;
110: return str;
111: }
112:
113: /*
114: * match s against p.
115: * s can be a prefix of p with at least min characters.
116: */
117: str_match(s, p, min)
118: register char *s, *p;
119: register min;
120: {
121: for (; *s && *p && *s == *p; s++, p++, min--)
122: ;
123: return *s == *p || *s == 0 && min <= 0;
124: }
125:
126: #ifdef STR_DEBUG
127: char *
128: str_alloc(l)
129: int l;
130: {
131: register struct string *s;
132:
133: s = (struct string *) malloc((unsigned)l + str_offset);
134: if (s == 0)
135: return 0;
136: if (str_head.s_forw == 0)
137: str_head.s_forw = str_head.s_back = &str_head;
138: s->s_forw = str_head.s_forw;
139: s->s_back = &str_head;
140: str_head.s_forw = s;
141: s->s_forw->s_back = s;
142: return s->s_data;
143: }
144:
145: str_free(str)
146: char *str;
147: {
148: register struct string *s;
149:
150: for (s = str_head.s_forw; s != &str_head && s->s_data != str;
151: s = s->s_forw)
152: ;
153: if (s == &str_head)
154: abort();
155: s->s_back->s_forw = s->s_forw;
156: s->s_forw->s_back = s->s_back;
157: free((char *)s);
158: }
159: #endif