Edinburgh Speech Tools 2.4-release
 
Loading...
Searching...
No Matches
string16.c
1/*************************************************************************/
2/* */
3/* Copyright (c) 1997-98 Richard Tobin, Language Technology Group, HCRC, */
4/* University of Edinburgh. */
5/* */
6/* THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, */
7/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
8/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
9/* IN NO EVENT SHALL THE AUTHOR OR THE UNIVERSITY OF EDINBURGH BE LIABLE */
10/* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF */
11/* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION */
12/* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
13/* */
14/*************************************************************************/
15#ifdef FOR_LT
16
17#include "lt-memory.h"
18
19#define Malloc salloc
20#define Realloc srealloc
21#define Free sfree
22
23#else
24
25#include "system.h"
26
27#endif
28
29#include "charset.h"
30#include "ctype16.h"
31#include "string16.h"
32
33int strcasecmp8(const char8 *s1, const char8 *s2)
34{
35 char8 c1, c2;
36
37 while(1)
38 {
39 c1 = Toupper(*s1++);
40 c2 = Toupper(*s2++);
41 if(c1 == 0 && c2 == 0)
42 return 0;
43 if(c1 == 0)
44 return -1;
45 if(c2 == 0)
46 return 1;
47 if(c1 < c2)
48 return -1;
49 if(c1 > c2)
50 return 1;
51 }
52}
53
54int strncasecmp8(const char8 *s1, const char8 *s2, size_t n)
55{
56 char8 c1, c2;
57
58 while(n-- > 0)
59 {
60 c1 = Toupper(*s1++);
61 c2 = Toupper(*s2++);
62 if(c1 == 0 && c2 == 0)
63 return 0;
64 if(c1 == 0)
65 return -1;
66 if(c2 == 0)
67 return 1;
68 if(c1 < c2)
69 return -1;
70 if(c1 > c2)
71 return 1;
72 }
73
74 return 0;
75}
76
77char8 *strdup8(const char8 *s)
78{
79 char8 *buf;
80 int len;
81
82 len = strlen8(s);
83 buf = Malloc(len + 1);
84 if(!buf)
85 return 0;
86
87 strcpy8(buf, s);
88
89 return buf;
90}
91
92/*
93 * NB these two functions return static storage, use Strdup or strdup8
94 * if you want to keep the result.
95 */
96
97/* Convert a Latin-1 string to UTF-16 (easy!) */
98
99char16 *char8tochar16(const char8 *s)
100{
101 static char16 *buf = 0;
102 int i, len;
103
104 len = strlen8(s);
105 buf = Realloc(buf, (len + 1) * sizeof(char16));
106 if(!buf)
107 return 0;
108
109 for(i=0; i<len; i++)
110 buf[i] = s[i];
111 buf[i] = 0;
112
113 return buf;
114}
115
116/* Convert a UTF-16 string to Latin-1, replacing missing characters with Xs */
117
118char8 *char16tochar8(const char16 *s)
119{
120 static char8 *buf = 0;
121 int i, len;
122
123 len = strlen16(s);
124 buf = Realloc(buf, len + 1);
125 if(!buf)
126 return 0;
127
128 for(i=0; i<len; i++)
129 buf[i] = s[i] > 255 ? 'X' : s[i];
130 buf[i] = 0;
131
132 return buf;
133}
134
135char16 *strcpy16(char16 *s1, const char16 *s2)
136{
137 char16 *t = s1;
138
139 while(*s2)
140 *s1++ = *s2++;
141 *s1 = 0;
142
143 return t;
144}
145
146char16 *strncpy16(char16 *s1, const char16 *s2, size_t n)
147{
148 char16 *t = s1;
149
150 while(n-- > 0 && *s2)
151 *s1++ = *s2++;
152 if(n > 0)
153 *s1 = 0;
154
155 return t;
156}
157
158char16 *strdup16(const char16 *s)
159{
160 char16 *buf;
161 int len;
162
163 len = strlen16(s);
164 buf = Malloc((len + 1) * sizeof(char16));
165 if(!buf)
166 return 0;
167
168 strcpy16(buf, s);
169
170 return buf;
171}
172
173size_t strlen16(const char16 *s)
174{
175 int len = 0;
176
177 while(*s++)
178 len++;
179
180 return len;
181}
182
183char16 *strchr16(const char16 *s, int c)
184{
185 for( ; *s; s++)
186 if(*s == c)
187 return (char16 *)s; /* Is const bogus or what? */
188
189 return 0;
190}
191
192int strcmp16(const char16 *s1, const char16 *s2)
193{
194 char16 c1, c2;
195
196 while(1)
197 {
198 c1 = *s1++;
199 c2 = *s2++;
200 if(c1 == 0 && c2 == 0)
201 return 0;
202 if(c1 == 0)
203 return -1;
204 if(c2 == 0)
205 return 1;
206 if(c1 < c2)
207 return -1;
208 if(c1 > c2)
209 return 1;
210 }
211}
212
213int strncmp16(const char16 *s1, const char16 *s2, size_t n)
214{
215 char16 c1, c2;
216
217 while(n-- > 0)
218 {
219 c1 = *s1++;
220 c2 = *s2++;
221 if(c1 == 0 && c2 == 0)
222 return 0;
223 if(c1 == 0)
224 return -1;
225 if(c2 == 0)
226 return 1;
227 if(c1 < c2)
228 return -1;
229 if(c1 > c2)
230 return 1;
231 }
232
233 return 0;
234}
235
236/* XXX only works for characters < 256 because Toupper does */
237
238int strcasecmp16(const char16 *s1, const char16 *s2)
239{
240 char16 c1, c2;
241
242 while(1)
243 {
244 c1 = Toupper(*s1++);
245 c2 = Toupper(*s2++);
246 if(c1 == 0 && c2 == 0)
247 return 0;
248 if(c1 == 0)
249 return -1;
250 if(c2 == 0)
251 return 1;
252 if(c1 < c2)
253 return -1;
254 if(c1 > c2)
255 return 1;
256 }
257}
258
259int strncasecmp16(const char16 *s1, const char16 *s2, size_t n)
260{
261 char16 c1, c2;
262
263 while(n-- > 0)
264 {
265 c1 = Toupper(*s1++);
266 c2 = Toupper(*s2++);
267 if(c1 == 0 && c2 == 0)
268 return 0;
269 if(c1 == 0)
270 return -1;
271 if(c2 == 0)
272 return 1;
273 if(c1 < c2)
274 return -1;
275 if(c1 > c2)
276 return 1;
277 }
278
279 return 0;
280}
281
282/* A very naive implementation */
283
284char16 *strstr16(const char16 *s1, const char16 *s2)
285{
286 int len, first;
287
288 first = s2[0];
289 if(first == 0)
290 return (char16 *)s1;
291
292 len = strlen16(s2);
293
294 while((s1 = strchr16(s1, first)))
295 {
296 if(strncmp16(s1, s2, len) == 0)
297 return (char16 *)s1;
298 else
299 s1++;
300 }
301
302 return 0;
303}
304