1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
7 * Reserved.  This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License').  You may not use this file
10 * except in compliance with the License.  Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24#import <string.h>
25#import <stdlib.h>
26#import <stdio.h>
27#import <stdarg.h>
28#import "stringops.h"
29
30char *copyString(char *s)
31{
32	int len;
33	char *t;
34
35	if (s == NULL) return NULL;
36
37	len = strlen(s) + 1;
38	t = malloc(len);
39	bcopy(s, t, len);
40	return t;
41}
42
43char *concatString(char *s, char *t)
44{
45	int len;
46
47	if (t == NULL) return s;
48
49	len = strlen(s) + strlen(t) + 1;
50	s = realloc(s, len);
51	strcat(s, t);
52	return s;
53}
54
55char **insertString(char *s, char **l, unsigned int x)
56{
57	int i, len;
58
59	if (s == NULL) return l;
60	if (l == NULL)
61	{
62		l = (char **)malloc(2 * sizeof(char *));
63		l[0] = copyString(s);
64		l[1] = NULL;
65		return l;
66	}
67
68	for (i = 0; l[i] != NULL; i++);
69	len = i + 1; /* count the NULL on the end of the list too! */
70
71	l = (char **)realloc(l, (len + 1) * sizeof(char *));
72
73	if ((x >= (len - 1)) || (x == IndexNull))
74	{
75		l[len - 1] = copyString(s);
76		l[len] = NULL;
77		return l;
78	}
79
80	for (i = len; i > x; i--) l[i] = l[i - 1];
81	l[x] = copyString(s);
82	return l;
83}
84
85char **appendString(char *s, char **l)
86{
87	return insertString(s, l, IndexNull);
88}
89
90void freeList(char **l)
91{
92	int i;
93
94	if (l == NULL) return;
95	for (i = 0; l[i] != NULL; i++)
96	{
97		if (l[i] != NULL) free(l[i]);
98		l[i] = NULL;
99	}
100	if (l != NULL) free(l);
101}
102
103void freeString(char *s)
104{
105	if (s == NULL) return;
106	free(s);
107}
108
109unsigned int listLength(char **l)
110{
111	int i;
112
113	if (l == NULL) return 0;
114	for (i = 0; l[i] != NULL; i++);
115	return i;
116}
117
118unsigned int listIndex(char *s,char **l)
119{
120	int i;
121
122	if (l == NULL) return IndexNull;
123	for (i = 0; l[i] != NULL; i++)
124	{
125		if (strcmp(s, l[i]) == 0) return i;
126	}
127	return IndexNull;
128}
129
130char *prefix(char *s, char c)
131{
132	int i;
133	char *t;
134
135	if (s == NULL) return NULL;
136
137	for (i = 0; ((s[i] != '\0') && (s[i] != c)); i++);
138	if (i == 0) return NULL;
139	if (s[i] == '\0') return copyString(s);
140
141	t = malloc(i + 1);
142	bcopy(s, t, i);
143	t[i] = '\0';
144	return t;
145}
146
147char *postfix(char *s, char c)
148{
149	int i, len;
150	char *t;
151
152	if (s == NULL) return NULL;
153
154	for (i = 0; ((s[i] != '\0') && (s[i] != c)); i++);
155	if (s[i] == '\0') return NULL;
156	len = strlen(s) - i;
157	if (len == 1) return NULL;
158
159	t = malloc(len);
160	len--;
161	bcopy((s + i + 1), t, len);
162	t[len] = '\0';
163	return t;
164}
165
166char *presuffix(char *s, char c)
167{
168	int i, len;
169	char *t;
170
171	if (s == NULL) return NULL;
172
173	len = strlen(s);
174	for (i = len - 1; ((i >= 0) && (s[i] != c)); i--);
175	if (i == 0) return NULL;
176	if (s[0] == '\0') return NULL;
177
178	t = malloc(i + 1);
179	bcopy(s, t, i);
180	t[i] = '\0';
181	return t;
182}
183
184char *suffix(char *s, char c)
185{
186	int i, len;
187	char *t;
188
189	if (s == NULL) return NULL;
190
191	len = strlen(s);
192	for (i = len - 1; ((i >= 0) && (s[i] != c)); i--);
193	if (i == 0) return NULL;
194	len -= i;
195	if (len == 1) return NULL;
196	t = malloc(len);
197	len--;
198	bcopy((s + i + 1), t, len);
199	t[len] = '\0';
200	return t;
201}
202
203char *lowerCase(char *s)
204{
205	int i;
206	char *t;
207
208	if (s == NULL) return NULL;
209	t = malloc(strlen(s) + 1);
210
211	for (i = 0; s[i] != '\0'; i++)
212	{
213		if ((s[i] >= 'A') && (s[i] <= 'Z')) t[i] = s[i] + 32;
214		else t[i] = s[i];
215	}
216	t[i] = '\0';
217	return t;
218}
219
220char **explode(char *s, char c)
221{
222	char **l = NULL;
223	char *p, *t;
224	int i, n;
225
226	if (s == NULL) return NULL;
227
228	p = s;
229	while (p[0] != '\0')
230	{
231		for (i = 0; ((p[i] != '\0') && p[i] != c); i++);
232		n = i;
233		t = malloc(n + 1);
234		for (i = 0; i < n; i++) t[i] = p[i];
235		t[n] = '\0';
236		l = appendString(t, l);
237		free(t);
238		t = NULL;
239		if (p[i] == '\0') return l;
240		if (p[i + 1] == '\0') l = appendString("", l);
241		p = p + i + 1;
242	}
243	return l;
244}
245