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