1 /* Copyright 1992 NEC Corporation, Tokyo, Japan.
2 *
3 * Permission to use, copy, modify, distribute and sell this software
4 * and its documentation for any purpose is hereby granted without
5 * fee, provided that the above copyright notice appear in all copies
6 * and that both that copyright notice and this permission notice
7 * appear in supporting documentation, and that the name of NEC
8 * Corporation not be used in advertising or publicity pertaining to
9 * distribution of the software without specific, written prior
10 * permission. NEC Corporation makes no representations about the
11 * suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
13 *
14 * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
16 * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
18 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
19 * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23 #if !defined(lint) && !defined(__CODECENTER__)
24 static char rcs_id[] = "$Id: wutil.c,v 1.7 2003/09/17 15:13:27 aida_s Exp $";
25 #endif
26
27 #include "sglobal.h"
28 #include "rkcw.h"
29
30 /*********************************************************************
31 * wchar_t replace begin *
32 *********************************************************************/
33 #ifdef wchar_t
34 # error "wchar_t is already defined"
35 #endif
36 #define wchar_t cannawc
37
38 int
ushort2eucsize(src,srclen)39 ushort2eucsize(src, srclen)
40 Ushort *src;
41 int srclen;
42 {
43 register int i, j;
44 register Ushort wc;
45
46 for (i = 0, j = 0 ; i < srclen ; i++) {
47 wc = src[i];
48 switch (wc & 0x8080) {
49 case 0:
50 /* ASCII */
51 j++;
52 break;
53 case 0x0080:
54 /* Ⱦ�ѥ��� */
55 j += 2;
56 break;
57 case 0x8000:
58 /* ���� */
59 j += 3;
60 break;
61 case 0x8080:
62 /* ���� */
63 j += 2;
64 break;
65 }
66 }
67 return j;
68 }
69
70 int
ushort2euc(src,srclen,dest,destlen)71 ushort2euc(src, srclen, dest, destlen)
72 Ushort *src;
73 char *dest;
74 int srclen, destlen;
75 {
76 register int i, j;
77 register Ushort wc;
78
79 for (i = 0, j = 0 ; i < srclen && j + 2 < destlen ; i++) {
80 wc = src[i];
81 switch (wc & 0x8080) {
82 case 0:
83 /* ASCII */
84 dest[j++] = (unsigned char)((unsigned)wc & 0x7f);
85 break;
86 case 0x0080:
87 /* Ⱦ�ѥ��� */
88 dest[j++] = (char)0x8e; /* SS2 */
89 dest[j++] = (unsigned char)(((unsigned)wc & 0x7f) | 0x80);
90 break;
91 case 0x8000:
92 /* ���� */
93 dest[j++] = (char)0x8f; /* SS3 */
94 dest[j++] = (unsigned char)((((unsigned)wc & 0x7f00) >> 8) | 0x80);
95 dest[j++] = (unsigned char)(((unsigned)wc & 0x7f) | 0x80);
96 break;
97 case 0x8080:
98 /* ���� */
99 dest[j++] = (unsigned char)((((unsigned)wc & 0x7f00) >> 8) | 0x80);
100 dest[j++] = (unsigned char)(((unsigned)wc & 0x7f) | 0x80);
101 break;
102 }
103 }
104 dest[j] = (unsigned char)0;
105 return j;
106 }
107
108 int
eucchars(src,srclen)109 eucchars(src, srclen)
110 unsigned char *src;
111 int srclen;
112 {
113 register int i, j;
114 register unsigned char ec;
115
116 for (i = 0, j = 0 ; i < srclen ; j++) {
117 ec = src[i++];
118 if (ec & 0x80) {
119 i++;
120 if (ec == 0x8f) i++; /* SS3 */
121 }
122 }
123 return j;
124 }
125
126 int
euc2ushort(src,srclen,dest,destlen)127 euc2ushort(src, srclen, dest, destlen)
128 char *src;
129 Ushort *dest;
130 int srclen, destlen;
131 {
132 register int i, j;
133 register unsigned ec;
134
135 for (i = 0, j = 0 ; i < srclen && j + 1 < destlen ; i++) {
136 ec = (unsigned)(unsigned char)src[i];
137 if (ec & 0x80) {
138 switch (ec) {
139 case 0x8e: /* SS2 */
140 dest[j++] = (Ushort)(0x80 | ((unsigned)src[++i] & 0x7f));
141 break;
142 case 0x8f: /* SS3 */
143 dest[j++] = (Ushort)(0x8000
144 | (((unsigned)src[i + 1] & 0x7f) << 8)
145 | ((unsigned)src[i + 2] & 0x7f));
146 i += 2;
147 break;
148 default:
149 dest[j++] = (Ushort)(0x8080 | (((unsigned)src[i] & 0x7f) << 8)
150 | ((unsigned)src[i + 1] & 0x7f));
151 i++;
152 break;
153 }
154 }
155 else {
156 dest[j++] = (Ushort)ec;
157 }
158 }
159 dest[j] = (wchar_t)0;
160 return j;
161 }
162
163 exp(int)
164 Wineuc2ushort(src, srclen, dest, destlen)
165 char *src;
166 Ushort *dest;
167 int srclen, destlen;
168 {
169 return euc2ushort(src, srclen, dest, destlen);
170 }
171
172 #ifndef CANNA_WCHAR16
173 static int
wchar2ushort32(src,srclen,dest,destlen)174 wchar2ushort32(src, srclen, dest, destlen)
175 register wchar_t *src;
176 register Ushort *dest;
177 int srclen, destlen;
178 {
179 register int i;
180
181 for (i = 0 ; i < srclen && i + 1 < destlen ; i++) {
182 switch (((unsigned long)*src & 0xf0000000) >> 28) {
183 case 0:
184 /* ASCII */
185 *dest = (Ushort)((unsigned)*src & 0x7f);
186 break;
187 case 1:
188 /* Ⱦ�ѥ��� */
189 *dest = (Ushort)(0x80 | ((unsigned)*src & 0x7f));
190 break;
191 case 2:
192 /* ���� */
193 *dest = (Ushort)(0x8000
194 | (((unsigned)*src & 0x3f80) << 1)
195 | ((unsigned)*src & 0x7f));
196 break;
197 case 3:
198 /* ���� */
199 *dest = (Ushort)(0x8080
200 | (((unsigned)*src & 0x3f80) << 1)
201 | ((unsigned)*src & 0x7f));
202 break;
203 }
204 src++;
205 dest++;
206 }
207 *dest = (Ushort)0;
208 return i;
209 }
210
211 static int
ushort2wchar32(src,srclen,dest,destlen)212 ushort2wchar32(src, srclen, dest, destlen)
213 register Ushort *src;
214 register wchar_t *dest;
215 int srclen, destlen;
216 {
217 register int i;
218
219 for (i = 0 ; i < srclen && i + 1 < destlen ; i++) {
220 switch (*src & 0x8080) {
221 case 0:
222 /* ASCII */
223 *dest = (wchar_t)(*src & 0x7f);
224 break;
225 case 0x0080:
226 /* Ⱦ�ѥ��� */
227 * dest = (wchar_t)((0x1 << 28) | (*src & 0x7f));
228 break;
229 case 0x8000:
230 /* ���� */
231 *dest = (wchar_t)((0x2 << 28)
232 | (((unsigned long)*src & 0x7f00) >> 1)
233 | ((unsigned long)*src & 0x7f));
234 break;
235 case 0x8080:
236 /* ���� */
237 *dest = (wchar_t)((0x3 << 28)
238 | (((unsigned long)*src & 0x7f00) >> 1)
239 | ((unsigned long)*src & 0x7f));
240 break;
241 }
242 src++;
243 dest++;
244 }
245 *dest = (wchar_t)0;
246 return i;
247 }
248
249 #else /* CANNA_WCHAR16 */
250
251 static int
wchar2ushort16(src,srclen,dest,destlen)252 wchar2ushort16(src, srclen, dest, destlen)
253 wchar_t *src;
254 Ushort *dest;
255 int srclen, destlen;
256 {
257 register int i;
258
259 for (i = 0 ; (i < srclen) && ((i + 1) < destlen) ; i++)
260 *dest++ = (Ushort)*src++;
261
262 *dest = (Ushort)0;
263 return i;
264 }
265
266 static int
ushort2wchar16(src,srclen,dest,destlen)267 ushort2wchar16(src, srclen, dest, destlen)
268 Ushort *src;
269 wchar_t *dest;
270 int srclen, destlen;
271 {
272 register int i;
273
274 for (i = 0 ; (i < srclen) && ((i + 1) < destlen) ; i++)
275 *dest++ = (wchar_t)*src++;
276
277 *dest = (wchar_t)0;
278 return i;
279 }
280 #endif /* CANNA_WCHAR16 */
281
282 /*
283 * �磻�ɥ���饯�����ڥ졼�����
284 *
285 */
286
287 int
wchar2ushort(src,slen,dst,dlen)288 wchar2ushort(src, slen, dst, dlen)
289 wchar_t *src;
290 Ushort *dst;
291 int slen, dlen;
292 {
293 #ifdef CANNA_WCHAR16
294 return( wchar2ushort16( src, slen, dst, dlen ) );
295 #else
296 return( wchar2ushort32( src, slen, dst, dlen ) );
297 #endif
298 }
299
300 int
ushort2wchar(src,slen,dst,dlen)301 ushort2wchar(src, slen, dst, dlen)
302 Ushort *src;
303 wchar_t *dst;
304 int slen, dlen;
305 {
306 #ifdef CANNA_WCHAR16
307 return( ushort2wchar16( src, slen, dst, dlen ) );
308 #else
309 return( ushort2wchar32( src, slen, dst, dlen ) );
310 #endif
311 }
312
313 exp(int)
314 Winushort2wchar(src, slen, dst, dlen)
315 Ushort *src;
316 wchar_t *dst;
317 int slen, dlen;
318 {
319 return ushort2wchar(src, slen, dst, dlen);
320 }
321
322 int
wcharstrlen(ws)323 wcharstrlen(ws)
324 wchar_t *ws;
325 {
326 register wchar_t *p = ws;
327 while (*p)
328 p++;
329 return p - ws;
330 }
331
332 int
ushortstrlen(ws)333 ushortstrlen(ws)
334 Ushort *ws;
335 {
336 register Ushort *p = ws;
337 while (*p)
338 p++;
339 return p - ws;
340 }
341
342 int
ushortstrcpy(wd,ws)343 ushortstrcpy(wd, ws)
344 Ushort *wd, *ws;
345 {
346 register int res = 0;
347 while ((*wd++ = *ws++) != (Ushort)0) {
348 res++;
349 }
350 return res;
351 }
352
353 int
ushortstrncpy(wd,ws,n)354 ushortstrncpy(wd, ws, n)
355 Ushort *wd, *ws;
356 int n;
357 {
358 register int res = 0;
359 while (n > res && (*wd = *ws) != (Ushort)0) {
360 wd++; ws++; res++;
361 }
362 *wd = 0;
363 return res;
364 }
365
366 #ifndef wchar_t
367 # error "wchar_t is already undefined"
368 #endif
369 #undef wchar_t
370 /*********************************************************************
371 * wchar_t replace end *
372 *********************************************************************/
373