1 /*
2 * $Id: strings.c,v 1.5 2005/04/10 15:26:37 aonoto Exp $
3 */
4
5 /*
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
7 * This file is part of FreeWnn.
8 *
9 * Copyright Kyoto University Research Institute for Mathematical Sciences
10 * 1987, 1988, 1989, 1990, 1991, 1992
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
13 * Copyright FreeWnn Project 1999, 2000
14 *
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp>
16 *
17 * This library is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2 of the License, or (at your option) any later version.
21 *
22 * This library is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * Lesser General Public License for more details.
26 *
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with this library; if not, write to the
29 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
30 * Boston, MA 02111-1307, USA.
31 */
32
33 /*
34 long strings library. Copyed from GMW programs!!
35 */
36 #include <stdio.h>
37 #include "commonhd.h"
38 #include "wnn_string.h"
39
40 #define is_half_width(c) (! is_full_width(c))
41 #define is_full_width(c) (((c) & 0xff00))
42 #define is_gaiji(c) (is_full_width(c) && ! ((c) & 0x8080))
43 #define is_jis_kanji(c) (((c) & 0x8080) == 0x8080)
44
45 w_char *
wnn_Strcat(s1,s2)46 wnn_Strcat (s1, s2)
47 register w_char *s1;
48 register w_char *s2;
49 {
50 register w_char *d;
51
52 for (d = s1; *d++ != 0;);
53 for (--d; (*d++ = *s2++) != 0;);
54 return s1;
55 }
56
57 w_char *
wnn_Strncat(s1,s2,n)58 wnn_Strncat (s1, s2, n)
59 register w_char *s1;
60 register w_char *s2;
61 register int n;
62 {
63 register w_char *d;
64
65 for (d = s1; *d++ != 0;);
66 for (--d; n > 0 && (*d++ = *s2++) != 0; n--);
67 if (n <= 0)
68 {
69 *d = 0;
70 return d;
71 }
72 else
73 {
74 return --d;
75 }
76 }
77
78 int
wnn_Strcmp(s1,s2)79 wnn_Strcmp (s1, s2)
80 register w_char *s1;
81 register w_char *s2;
82 {
83 for (; *s1 != 0 && *s1 == *s2; s1++, s2++);
84 if (*s1 > *s2)
85 return 1;
86 if (*s1 == *s2)
87 return 0;
88 return (-1);
89 /* return (int)(*s1 - *s2); Since w_char, it is always positive */
90 }
91
92 /* s1 is substr of s2? then return 1*/
93 int
wnn_Substr(s1,s2)94 wnn_Substr (s1, s2)
95 register w_char *s1;
96 register w_char *s2;
97 {
98 for (; *s1 != 0 && *s1 == *s2; s1++, s2++);
99 return (int) (!*s1);
100 }
101
102
103
104 int
wnn_Strncmp(s1,s2,n)105 wnn_Strncmp (s1, s2, n)
106 register w_char *s1;
107 register w_char *s2;
108 register int n;
109 {
110 if (n == 0)
111 return (0);
112 for (; n > 0 && *s1++ == *s2++; n--);
113 return (int) (*--s1 - *--s2);
114 }
115
116 w_char *
wnn_Strcpy(s1,s2)117 wnn_Strcpy (s1, s2)
118 register w_char *s1;
119 register w_char *s2;
120 {
121 register w_char *d;
122
123 for (d = s1; (*d++ = *s2++) != 0;);
124 return s1;
125 }
126
127 w_char *
wnn_Strncpy(s1,s2,n)128 wnn_Strncpy (s1, s2, n)
129 register w_char *s1;
130 register w_char *s2;
131 register int n;
132 {
133 /*
134 register w_char *d;
135
136 for (d = s1;n > 0;n--) {
137 *d++ = *s2++;
138 }
139 return s1;
140 */
141 if (s2 > s1)
142 {
143 for (; n-- > 0;)
144 {
145 *s1++ = *s2++;
146 }
147 }
148 else if (s2 < s1)
149 {
150 s1 += n - 1;
151 s2 += n - 1;
152 for (; n-- > 0;)
153 {
154 *s1-- = *s2--;
155 }
156 }
157 return s1;
158 }
159
160 int
wnn_Strlen(s)161 wnn_Strlen (s)
162 register w_char *s;
163 {
164 register int n;
165
166 for (n = 0; *s++ != 0; n++);
167 return n;
168 }
169
170 void
wnn_Sreverse(d,s)171 wnn_Sreverse (d, s)
172 w_char *d, *s;
173 {
174 w_char *s0;
175
176 s0 = s;
177 for (; *s++;);
178 s--;
179 for (; --s >= s0;)
180 {
181 *d++ = *s;
182 }
183 *d = 0;
184 }
185
186 #ifdef nodef
187 w_char *
wnn_Index(s,c)188 wnn_Index (s, c)
189 register w_char *s;
190 register w_char c;
191 {
192 while (*s != c)
193 {
194 if (*s++ == 0)
195 return 0;
196 }
197 return s;
198 }
199
200 w_char *
wnn_Rindex(s,c)201 wnn_Rindex (s, c)
202 register w_char *s;
203 register w_char c;
204 {
205 register w_char *p = 0;
206
207 while (*s != 0)
208 {
209 if (*s++ == c)
210 p = s - 1;
211 }
212 return p;
213 }
214
215 w_char *
wnn_Strpbrk(s1,s2)216 wnn_Strpbrk (s1, s2)
217 register w_char *s1;
218 register w_char *s2;
219 {
220 register w_char *p;
221
222 while (*s1 != 0)
223 {
224 for (p = s2; *p != 0; p++)
225 {
226 if (*s1++ == *p)
227 return s1 - 1;
228 }
229 }
230 return 0;
231 }
232
233 int
wnn_Strspn(s1,s2)234 wnn_Strspn (s1, s2)
235 register w_char *s1;
236 register w_char *s2;
237 {
238 register w_char *p;
239 register int n;
240
241 while (*s1 != 0)
242 {
243 for (p = s2; *p != 0; p++)
244 {
245 if (*s1++ == *p)
246 {
247 n = 1;
248 while (*s1 != 0)
249 {
250 for (p = s2; *p != 0; p++)
251 {
252 if (*s1++ == *p)
253 {
254 n++;
255 break;
256 }
257 }
258 if (*p == 0)
259 {
260 return n;
261 }
262 }
263 return n;
264 }
265 }
266 }
267 return 0;
268 }
269
270 int
wnn_Strcspn(s1,s2)271 wnn_Strcspn (s1, s2)
272 register w_char *s1;
273 register w_char *s2;
274 {
275 register w_char *p;
276 register int n;
277
278 while (*s1 != 0)
279 {
280 for (p = s2; *p != 0; p++)
281 {
282 if (*s1++ != *p)
283 {
284 n = 1;
285 while (*s1 != 0)
286 {
287 for (p = s2; *p != 0; p++)
288 {
289 if (*s1++ != *p)
290 {
291 n++;
292 break;
293 }
294 }
295 if (*p == 0)
296 {
297 return n;
298 }
299 }
300 return n;
301 }
302 }
303 }
304 return 0;
305 }
306
307 w_char *
wnn_Strtok(s1,s2)308 wnn_Strtok (s1, s2)
309 register w_char *s1;
310 register w_char *s2;
311 {
312 static w_char *p = 0, *s;
313 static w_char c;
314 register int i, j, n;
315
316 if (s1 == 0)
317 {
318 if (p == 0)
319 return 0;
320 *p = c;
321 }
322 else
323 {
324 p = s1;
325 }
326 n = wnn_Strlen (p) - (j = wnn_Strlen (s2));
327 for (i = 0; i <= n; i++)
328 {
329 if (wnn_Strncmp (p++, s2, j) == 0)
330 {
331 s = p + j - 1;
332 break;
333 }
334 }
335 if (i > n)
336 return 0;
337 for (; i <= n; i++)
338 {
339 if (wnn_Strncmp (p++, s2, j) == 0)
340 {
341 p--;
342 c = *p;
343 *p = 0;
344 break;
345 }
346 }
347 return s;
348 }
349
350 int
wnn_Strwidth(buf)351 wnn_Strwidth (buf)
352 w_char *buf;
353 {
354 register int width;
355
356 for (width = 0; *buf != 0; buf++)
357 {
358 if (is_full_width (*buf))
359 {
360 width += 2;
361 }
362 else
363 {
364 width++;
365 }
366 }
367 return width;
368 }
369
370 int
wnn_Strnwidth(buf,n)371 wnn_Strnwidth (buf, n)
372 w_char *buf;
373 int n;
374 {
375 register int width, i;
376
377 for (width = 0, i = 0; i < n; buf++, i++)
378 {
379 if (is_full_width (*buf))
380 {
381 width += 2;
382 }
383 else
384 {
385 width++;
386 }
387 }
388 return width;
389 }
390
391 void
wnn_delete_ss2(s,n)392 wnn_delete_ss2 (s, n)
393 register unsigned int *s;
394 register int n;
395 {
396 register unsigned int x;
397
398 for (; n != 0 && (x = *s); n--, s++)
399 {
400 if ((x & 0xff00) == 0x8e00)
401 *s &= ~0xff00;
402 if (x == 0xffffffff)
403 break;
404 }
405 }
406
407 void
wnn_delete_w_ss2(s,n)408 wnn_delete_w_ss2 (s, n)
409 register w_char *s;
410 register int n;
411 {
412 register w_char x;
413
414 for (; n != 0 && (x = *s); n--, s++)
415 {
416 if ((x & 0xff00) == 0x8e00)
417 *s &= ~0xff00;
418 }
419 }
420
421 int
wnn_byte_count(in)422 wnn_byte_count (in)
423 register int in;
424 {
425 return (((in <= 0xa0 && in != 0x00 && in != 0x8e) || in == 0xff) ? 1 : 2);
426 }
427 #endif /* nodef */
428