source: svn/newcon3bcm2_21bu/dst/dmw/src/System/DMW_CodeConv.c @ 76

Last change on this file since 76 was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 16.1 KB
Line 
1/*
2        DMW_CodeConv.c
3       
4        Unicode --> KS code conversion API especially for shell debugging..
5       
6        Copyright 2003~2009 Digital STREAM Technology, Inc.
7        All Rights Reserved
8
9*/
10
11
12#include "DMW_Platform.h"
13
14#include "DMW_CodeConv.h"
15
16//#include <string.h>
17//#include <string.h>
18//---------------------------------------------------------
19// Configurations..
20
21#if CODE_CONV_USE_MW_TABLE
22        #include "DMW_KsH2Uc.h" 
23                // define our own table..
24                // this is for the case when Application does not have conversion table
25#else
26        extern UINT16 DST_cktouk[];
27                // if application have conversion table,
28                // just use that symbol..
29#endif
30
31//---------------------------------------------------------
32
33#define max(a,b) (((a) > (b)) ? (a) : (b))
34#define min(a,b) (((a) < (b)) ? (a) : (b))
35
36
37int DmwCodeConvPrint(char *fmt, ...)
38{
39    va_list v;
40    int n;
41
42        va_start(v, fmt);
43        n = DHL_OS_Printf(fmt, v);
44        va_end(v);
45       
46        return n;
47}
48
49#define dprint DmwCodeConvPrint
50//#define dprint DHL_OS_Printf
51
52//---------------------------------------------------------
53
54
55//UINT16 *dmw_ksh2uc;
56#define dmw_ksh2uc (DST_cktouk)
57        // ks ÇÑ±Û ÄÚµå(0xb0a1 ~ 0xc8fe)¸¦ unicode·Î º¯È¯ÇÏ´Â Å×ÀÌºí Æ÷ÀÎÅÍ
58        // tableÀÇ Å©±â
59        //     
60        //     94 character per line * 25 line * 2 bytes per character = 4700 bytes
61        //
62        // Çѱ۸¸ º¯È¯°¡´ÉÇÔ.
63        //
64UINT16 *dmw_uch2ks;
65        // unicode ÇѱÛÄÚµå(0xac00 ~ 0xd7af)¸¦ ks ÄÚµå·Î º¯È¯ÇÏ´Â Å×À̺í..
66        // table Å©±â
67        //     (0xd7af - 0xac00 + 1) * 2 = 11184 * 2 = 22368
68        //
69        // Unicode¿¡¼­ ´Ù·ç´Â ±ÛÀÚ°¡ ksº¸´Ù ¸¹À¸¹Ç·Î ÄÚµå¸Ê »ó¿¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â 0ÀÌ µé¾îÀÖ´Ù.
70        // staticÀ¸·Î Á¸ÀçÇÏ´Â tableÀÌ ¾Æ´Ï°í, ÄÚµå inverse ·çƾÀ¸·Î µ¿ÀûÀ¸·Î ¸¸µé¾îÁø´Ù.
71        //
72
73
74#define IsHangulUc(c)  ( ((c)>=0xac00) && ((c)<=0xd7af) )
75
76
77UINT16 *DMW_GetKs2UcTable(void)
78{
79        return dmw_ksh2uc;
80}
81
82
83/* for Hangul font (end) */
84
85// ¿Ï¼ºÇü ÇÑ±Û Äڵ带 unicode·Î º¯È¯ÇÏ´Â Å×À̺í
86//
87
88// ÇÑ±Û '°¡'¿¡ ÇØ´çÇÏ´Â ¿Ï¼ºÇü ÄÚµå´Â 0xB0A1 ÀÌ´Ù.
89//
90UINT16 ksh_to_unicode(UINT16 ks)
91{
92        // KS ÇÑ±Û Äڵ带 Unicode Çѱ۷Πº¯È¯ÇÏ´Â ÇÔ¼ö..
93        // KS ÄÚµåÀ̳ª ÇѱÛÀÌ ¾Æ´Ï¸é ÇöÀç 0À» ¸®ÅÏÇÑ´Ù.
94        //
95        // Unicode »ó¿¡¼­ 0x0000Àº NULLÀ» ÀǹÌÇÔ.
96        //
97        UINT8 c1, c2;
98        int block;
99       
100        // big endianÀ» °¡Á¤ÇÑ °æ¿ì ÀÓ.. platform independant ±¸ÇöÀ» ¿øÇϸé UINT8 * pointer·Î ÀÔ·ÂÀ» ¹ÞÀ¸¸é µÈ´Ù.
101        c1 = (ks >> 8);
102        c2 = (ks & 0xff);
103
104        // ks code map ¿µ¿ª¿¡ ¼ÓÇÑ ±ÛÀÚÀÎÁö üũ..
105        if (c1 < 0xA1 || c1 > 0xFE) {
106                //dprint("c1 is not ks code!!\n");
107                return 0;
108        }
109        if (c2 < 0xA1 || c2 > 0xFE) {
110                //dprint("c2 is not ks code!!\n");
111                return 0;
112        }
113       
114        // ÇѱÛÀÎÁö °Ë»ç..
115        if (c1 < 0xB0 || c1 > 0xC8) {
116                //dprint("c1 is not hangul!!\n");
117                //return 0;
118                return 0x003F;   // cafrii 041126 fix
119                        // ÇѱÛÀº ¾Æ´ÏÁö¸¸ KS ÄÚµå´Â ¸ÂÀ¸¹Ç·Î '?' ±ÛÀÚ¸¦ ÁÖÀÚ.
120        }
121                 
122        // block number (0, 1, 2, ..) °áÁ¤..
123        block = c1 - 0xB0;
124        //dprint("block number %d\n", block);
125       
126        return dmw_ksh2uc[block*94 + (c2-0xA1)];
127}
128
129
130
131int DMW_InitCodeConvLib(void)
132{
133        int k;
134
135        if (dmw_uch2ks) 
136        {
137                //dprint("check code: %x %x\n", dmw_uch2ks[0], dmw_uch2ks[11184-19]);
138               
139                if (dmw_uch2ks[0] == 0xb0a1 && dmw_uch2ks[11184-19] == 0xc8fe) {
140                        // check whether first and last code are correct..
141                        //dprint("already inited..\n");
142                        return statusOK; // it seems already initialized..
143                }
144                // if not, free and realloc..
145                DHL_OS_Free((void**)&dmw_uch2ks);
146        }
147
148        dmw_uch2ks = DHL_OS_Malloc(2 * (0xD7AF - 0xAC00 + 1));
149        if (dmw_uch2ks == NULL)
150                return statusOutOfMemory;
151        memset(dmw_uch2ks, 0, 2 * (0xD7AF - 0xAC00 + 1));
152
153#if 1
154        // °¡³ª´Ù ¼ø¼­·Î Á¤·ÄµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ Æ¯¼ºÀ» Àß ÀÌ¿ëÇÏ¸é »¡¸® ÃʱâÈ­°¡ °¡´ÉÇÏ´Ù..
155        //
156        // memset(dmw_uch2ks, 0, sizeof(xx));  // ÀÌ¹Ì ÃʱâÈ­ µÈ »óÅÂÀÌ´Ù..
157        for (k=0; k<25*94; k++) {
158                //if (dmw_ksh2uc[k] - 0xac00 >= 11184) dprint("!! range over!!\n");
159                dmw_uch2ks[dmw_ksh2uc[k] - 0xac00] = ((0xB0 + k/94) << 8) + (0xA1 + k%94);
160        }
161
162#else
163        // brute search algorithm..
164        for (uc = 0xAC00; uc <= 0xD7AF; uc++) // total 11184 character..
165        {
166                for (k=0; k<25*94; k++) {  // search 2350 character table..
167                        if (dmw_ksh2uc[k] == uc) { // found!!!
168                                break;
169                        }
170                }
171                ks = (k>=25*94) ? 0 : ((0xB0 + k/94) << 8) + (0xA1 + k%94);
172
173                dmw_uch2ks[uc-0xac00] = ks;
174        }
175#endif
176       
177        return statusOK;
178}
179
180
181//---------------------------------
182//  DMW_ConvKs2Uc
183// 
184//  KS ¹®ÀÚ¿­À» Unicode·Î º¯È¯. NULL (0x0000) À¸·Î Á¾·áµÇ¹Ç·Î
185//  º°µµÀÇ length Á¤º¸´Â ¸®ÅÏÇÏÁö ¾Ê´Â´Ù.
186//  ÇÊ¿äÇÑ ¸Þ¸ð¸®´Â ³»ºÎ¿¡¼­ ÇÒ´çÇØ¼­ »ç¿ëÇÑ´Ù.
187//  »ç¿ë ÈÄ¿¡ DMW_FreeUcString À¸·Î ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØ Áà¾ß ÇÑ´Ù.
188//
189//  'len'Àº ks_charÀÇ ¹®ÀÚ¿­ ±æÀÌ (null Á¦¿Ü)À̸ç
190//   À½ÀÇ °ªÀ» ÁöÁ¤ÇÒ °æ¿ì strlen ÇÔ¼ö·Î ÀÚµ¿ °áÁ¤µÈ´Ù.
191// 
192// cafrii 041126 add
193UINT16 *DMW_ConvKs2Uc(char *ks_char, int len)
194{
195        // ÁÖÀÇ! »ç¿ë ÈÄ¿¡ ¸®ÅϵǴ uc ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ¿©¾ß ÇÔ.
196        //
197       
198        UINT16 *ucs;
199        UINT16 uc;
200        int i, k, uc_len;
201        UINT8 *ks = (UINT8 *) ks_char;
202       
203        if (len < 0) 
204                len = strlen((const char *)ks);
205       
206        //dprint("ConvKs2Uc: ascii %d bytes (except \\0)\n", len);
207               
208        uc_len = 0;
209       
210        for (i=0; i<len; i++) {
211       
212                if (i+1 < len) {  // ´ÙÀ½ ±ÛÀÚ°¡ ÇÑ ÀÚ ´õ ÀÖÀ½..
213               
214                        uc = ksh_to_unicode((ks[i] << 8) | ks[i+1]);
215                       
216                        if (uc == 0) {
217                                // º¯È¯ ºÒ°¡.. ks ¿µ¿ªÀÌ ¾Æ´Ñ°Í °°´Ù.
218                                uc_len += 2;
219                        }
220                        else {
221                                // ks[i], ks[i+1] ÀÌ ÇϳªÀÇ unicode ÀÌ´Ù.
222                                uc_len += 2;
223                                i++;
224                        }
225                }
226                else {  // ¸¶Áö¸· ±ÛÀÚÀÓ..
227                        uc_len += 2;
228                }               
229        }
230       
231        //dprint("   unicode size will be %d bytes\n", uc_len);
232       
233        ucs = (UINT16 *) DHL_OS_Malloc(uc_len + 2); // ¸¶Áö¸· NULL ¹®ÀÚ Æ÷ÇÔ
234        if (ucs == NULL) {
235                DHL_OS_Printf("!! ConvKs2Uc: out of memory for %d bytes\n", uc_len+2);
236                return NULL;
237        }
238        memset(ucs, 0, uc_len+2);
239               
240        //dprint("   ucs buffer 0x%x\n", ucs);
241       
242        k = 0;
243        for (i=0; i<len; i++) {
244
245                if (i+1 < len) {  // ´ÙÀ½ ±ÛÀÚ°¡ ÇÑ ÀÚ ´õ ÀÖÀ½..
246
247                        //dprint("  ks[%d]: 0x%x", i, ks[i]);
248               
249                        uc = ksh_to_unicode((ks[i] << 8) | ks[i+1]);
250                        if (uc == 0) {
251                               
252                                //dprint(" %02x is not KS code", ks[i]);
253                                // º¯È¯ ºÒ°¡.. ks ¿µ¿ªÀÌ ¾Æ´Ñ°Í °°´Ù.
254                                ucs[k++] = (UINT16) ks[i];
255                        }
256                        else {
257                               
258                                //dprint(" %02x %0x2 --> unicode %04x", ks[i], ks[i+1], uc);
259                                // ks[i], ks[i+1] ÀÌ ÇϳªÀÇ unicode ÀÌ´Ù.
260                                ucs[k++] = uc;
261                                i++;
262                        }
263                }
264                else {  // ¸¶Áö¸· ±ÛÀÚÀÓ..
265                        ucs[k++] = (UINT16) ks[i];
266                }               
267                //dprint("\n");
268        }
269               
270        // null termination..
271        ucs[k] = 0;
272       
273        return ucs;
274}
275
276
277//---------------------------------
278//  DMW_ConvUc2Ks
279// 
280// 
281UINT8 *DMW_ConvUc2Ks(UINT16 *uc_16, int len)
282{
283        // unicode stringÀ» Ks ÄÚµå·Î º¯È¯ÇÏ¿© ¸®ÅÏÇÑ´Ù.
284        // º¯È¯¿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®´Â ³»ºÎÀûÀ¸·Î µ¿Àû ÇÒ´çÇÑ´Ù.
285        // »ç¿ë ÈÄ ²À DMW_FreeKsStringÀ» ÀÌ¿ëÇÏ¿© ÇØÁ¦ÇØ¾ß ÇÑ´Ù.
286        //
287        // len Àº UINT16 ÇüÅÂÀÇ unicode ¹®ÀÚ °¹¼öÀÌ´Ù. (byte size°¡ ¾Æ´Ô¿¡ À¯ÀÇ!)
288        // len ÀÌ negative°ªÀ» °¡Áö¸é Null terminated stringÀ¸·Î °£ÁÖÇÑ´Ù.
289        //
290        // ¸®ÅϵǴ ¹®ÀÚ¿­Àº null-terminate µÈ »óÅÂÀÌ´Ù.
291       
292        #define DMW_CONV_MAX_STRING_LEN 4096
293                // Áö¿øÇÏ´Â stringÀÇ ±æÀÌ¿¡ Á¦ÇÑÀ» µÎÀÚ.. ¹ÙÀÌÆ® ¼ö°¡ ¾Æ´Ï¶ó ±ÛÀÚ ¼öÀÌ´Ù.
294                // Psip table º¯È¯¿¡ ÁÖ·Î »ç¿ëÇÒ °ÍÀ̹ǷΠ4K¸é ÃæºÐÇÏ´Ù.
295
296        // uc pointer°¡ 16 bit alignÀÌ Àß ¾ÈµÇ¾î ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î, byte´ÜÀ§·Î Àо »ç¿ëÇÏÀÚ.
297        //
298        // cafrii 081006, endian ¿¡ µû¶ó ´Ù¸£°Ô µ¿ÀÛÇÏÁö ¾Êµµ·Ï ±×³É 16 bit·Î ó¸®.
299        //
300        //#define UC(n) ((uc[2*(n)]<<8)|uc[2*(n)+1])
301        #define UC(n) (uc_16[n])
302       
303        //UINT8 *uc = (UINT8 *)uc_16;
304       
305        int i, err;
306       
307        UINT16 ks;
308       
309        int offset;  // byte offset of KS string buf
310        UINT8 *buf;  // ks string buf
311        int bufsize;
312       
313        int dbg = 0;
314       
315       
316        if (len < 0) {
317                // length¸¦ °è»êÇÑ´Ù.
318                for (i=0; i<DMW_CONV_MAX_STRING_LEN; i++) {
319                        if (UC(i) == 0x0000) break;
320                }
321                if (i < DMW_CONV_MAX_STRING_LEN)
322                        len = i;
323                else {
324                        //dprint("!! string is too long!!\n");
325                        //return statusInvalidArgument;
326                        // string is too long.. but continue with truncation.
327                        len = DMW_CONV_MAX_STRING_LEN;
328                }
329        }
330       
331        if (dbg) dprint(" Unicode string length: %d\n", len);
332       
333        if (dmw_uch2ks == NULL) 
334        {
335                if (dbg) dprint("** CodeConvLib initializing..\n");
336                err = DMW_InitCodeConvLib();
337                if (err) {
338                        dprint("!! CodeConvLib err %d\n", err);
339                        return NULL;
340                }
341        }
342       
343        // ÇÊ¿äÇÑ ¹öÆÛ¸¦ ÇÒ´çÇÑ´Ù. Çö ½ÃÁ¡¿¡¼­ Á¤È®ÇÑ ¹öÆÛÀÇ Å©±â´Â ¾Ë ¼ö ¾øÀ¸³ª,
344        // ÀÏ´Ü Unicode stringÀÇ Å©±âº¸´Ù ÀÛÀ» È®·üÀÌ ³ô´Ù..
345       
346       
347        bufsize = len * 2 + 2;
348        buf = DHL_OS_Malloc(bufsize);
349        if (buf == NULL) {
350                dprint("!! out of memory for conversion!\n");
351                return NULL;
352        }
353        memset(buf, 0, bufsize);
354       
355        offset = 0;
356        for (i=0; i<len; i++) 
357        {
358                if (IsHangulUc(UC(i))) {
359                        ks = dmw_uch2ks[UC(i) - 0xac00];
360                        if (offset+2 > bufsize-1)  break;
361                        buf[offset++] = (ks >> 8) & 0xff;
362                        buf[offset++] = (ks & 0xff);
363                       
364                        if (dbg) dprint("\t UC[%d] : %04x --> H: %04x (%c%c)\n", i, UC(i), ks, buf[offset-2], buf[offset-1]);
365                }
366                else {
367                        if (((UC(i) >> 8) & 0xff) == 0) {
368                                // seems to be english..
369                                if (offset+1 > bufsize-1)  break;
370                                buf[offset++] = (UC(i) & 0xff);
371                               
372                                if (dbg) dprint("\t UC[%d] : %04x --> E: %02x (%c)\n", i, UC(i), buf[offset-1], buf[offset-1]);
373                        }
374                        else {
375                                if (offset+5 > bufsize-1)  break;
376
377                                sprintf((char *)&buf[offset], "#%04x", UC(i));
378                                offset += 5;
379                               
380                                if (dbg) dprint("\t UC[%d] : %04x --> ?\n", i, UC(i));
381                        }
382                }
383        }
384        buf[offset++] = 0; // null termination..
385       
386        if (dbg) dprint("  total %d bytes..\n", offset);
387       
388        return buf;
389       
390#undef UC
391
392}
393
394void DMW_FreeKsString(UINT8 *ks)
395{
396        //dprint("free buffer %08x..\n", ks);
397        DHL_OS_Free((void**)&ks);
398}
399
400void DMW_FreeUcString(UINT16 *uc)
401{
402        DHL_OS_Free((void**)&uc);
403}
404
405/*
406        note!
407        PSIP multiple stringÀÇ unicode´Â ¸ðµÎ big endian À¸·Î encoding µÇ¾î ÀÖÀ¸¹Ç·Î
408        Little endian system¿¡¼­ PSIP ¹®ÀÚ¿­À» Ãâ·ÂÇÒ ¶§¿¡´Â 
409        (UINT8 *) --> (UINT16 *) ¿Í °°ÀÌ ¹Ù·Î casing ¿¬»êÀ» ÇÏ¸é ¾ÈµÈ´Ù.
410*/
411int DMW_UniPrint(UINT16 *ucs, int len)
412{
413        UINT8 *s;
414        //dprint("DMW_UniPrint (%x, %d)\n", ucs, len);
415        s = DMW_ConvUc2Ks(ucs, len);
416        if (s) { 
417                //dprint("buffer: %08x\n", s);
418
419                dprint((char *)s); 
420                //dprint("free buffer %08x..\n", s);
421                DMW_FreeKsString(s); 
422        }
423        return 0;
424}
425
426
427
428
429
430//-----------------------
431//  DMW_Unicode2Ks
432//
433//  Unicode stringÀ» ascii stringÀ¸·Î º¯È¯ÇÏ¿© 'buf' ¿¡ ÀúÀåÇÑ´Ù.
434//
435//  len Àº Unicode ¹®ÀÚ °¹¼öÀÌ´Ù. (byte char °¹¼ö°¡ ¾Æ´Ô!!)
436//  len ÀÌ 0À̸é NULL terminated string À̶ó´Â ¶æÀÓ
437//
438char *DMW_Unicode2Ks(UINT16 *ucs, int len, char *buf)
439{
440       
441#if 1
442        // cafrii 041103 add, for korean 'short name' display
443
444        static char buf_0[256];  // ¹öÆÛ¸¦ ÁöÁ¤ÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â ÃÖ´ë 255 ¹ÙÀÌÆ® ±îÁö¸¸ Áö¿øÇϵµ·Ï ÇÏÀÚ.
445        char *s;
446        int bytelen;
447
448        if (buf == NULL) buf = buf_0;
449       
450        s = (char *)DMW_ConvUc2Ks((UINT16 *)ucs, len>0 ? len : -1);
451       
452        bytelen = strlen(s);  // KS º¯È¯µÈ ¹®ÀÚ¿­ÀÇ ¹ÙÀÌÆ® ±æÀÌ (¹®ÀÚ °¹¼ö¶û ÀÏÄ¡ÇÏÁö ¾ÊÀ½)
453       
454        memcpy(buf, s, min(256, bytelen+1)); // null terminator ±îÁö º¹»ç..
455
456        DMW_FreeKsString((UINT8 *)s);
457
458        return buf;
459
460#else
461        // ±×³É ¿µ¹® ascii ¸¸ Ç¥½ÃÇÏ´Â °£´ÜÇÑ ±¸Çö..
462       
463        static char buf_0[256];
464        int i;
465
466        if (buf == NULL) buf = buf_0;
467       
468        if (len < 0) {
469                for (i=0; i<255; i++) {  // ÃÖ´ë ±æÀÌ´Â 256À¸·Î Á¦ÇÑ.
470                        if (ucs[i] == 0) break;
471                }
472                len = i;
473        }
474        for (i=0; i<len; i++) {
475                if ((ucs[i] >> 8) == 0)       // it seems ascii
476                        buf[i] = ucs[i] & 0xff;
477                else
478                        buf[i] = '?';
479        }
480        return buf;
481       
482#endif
483       
484}
485
486
487
488
489//---------------------------
490//  DMW_MakeRandomKsString
491//
492//  Å×½ºÆ®¸¦ À§Çؼ­ ·£´ýÇÑ ¹®ÀÚ¿­À» ¸¸µå´Â ÇÔ¼ö.
493//  ÁöÁ¤ÇÑ ¹öÆÛ¿¡ ÀÓÀÇ ±æÀÇÀÇ ÀÓÀÇ ¹®ÀÚ¿­À» ¸¸µç´Ù.
494//
495//  mode = 0 : ¿µ¹® ¹®ÀÚ¿­
496//  mode = 1 : ÇÑ±Û ¹®ÀÚ¿­
497//  mode = 2~ : ¿µ¹®/ÇÑ±Û È¥¿ë..
498// 
499char *DMW_MakeRandomKsString(char *buf, int size, int mode)
500{
501        int k, bHangle = 0;
502        char c1, c2;
503       
504        size--;
505       
506        for (k=0; k<size; k++) {
507               
508                if (mode == 0) {
509                        bHangle = 0;
510                }
511                else if (mode == 1) {
512                        bHangle = 1;
513                }
514                else {
515                        if (k+1 >= size)  // ¸¶Áö¸· ±ÛÀÚ´Â ¿µ¹®À¸·Î Á¾·áÇØ¾ß ÇÔ..
516                                bHangle = 0;  // ¿µ¹®..
517                        else if (rand() % 3 == 0) 
518                                bHangle = !bHangle;
519                }
520               
521                if (bHangle == 0) {
522                        buf[k] = rand() % (0x7A - 0x2A + 1) + 0x2A;
523                        if (buf[k] == '%' || buf[k] == '\\' || buf[k] == '#')
524                                buf[k] = 'A';
525                }
526                else {
527                        if (k+1 >= size) {
528                                buf[k] = '.';
529                                break;
530                        }
531                        // ·£´ý ÇѱÛ..
532                        c1 = rand() % (0xC8 - 0xB0 + 1) + 0xB0;
533                        c2 = rand() % (0xFE - 0xA1 + 1) + 0xA1;
534                       
535                        buf[k] = c1;
536                        k++;
537                        buf[k] = c2;
538                }
539        }
540        buf[k] = 0;
541       
542        return buf;
543}
544
545
546//---------------------------
547//  DMW_MakeRandomKsString
548//
549//  strlen ÀÇ unicode ¹öÀüÀÌ´Ù.
550//
551// cafrii 041126 add
552int DMW_UcStringLen(UINT16 *ucs)
553{
554        int len = 0;
555       
556        if (ucs == NULL) return 0;
557       
558        while (ucs[len])
559                len++;
560               
561        return len;
562}
563
564
565
566
567//---------------------------
568// Unicode string library..
569
570
571// UniStrLen
572// unicode version of strcpy
573int UniStrLen(UINT16 *str)
574{
575        register UINT16 *p = str;
576        while (*p) p++;
577        return (int)(p - str);
578}
579
580
581// UniStrCopy
582// unicode version of strcpy
583UINT16 *UniStrCopy(UINT16 *dst, UINT16 *src) 
584{
585        register UINT16 *d = dst, *s = src;
586        while (*s)
587                *d++ = *s++;
588        *d = 0;
589        return dst;
590}
591
592
593// UniStrNCopy
594// unicode version of strncpy
595UINT16 *UniStrNCopy(UINT16 *dst, UINT16 *src, int len)
596{
597        register int n = 0;
598        register UINT16 *d = dst, *s = src;
599        while (*s && n < len) {
600                *d++ = *s++;
601                n++;
602        }
603        if (n < len)
604                *d = 0;
605        return dst;
606}
607
608
609// UniStrCat
610// unicode version of strcat
611UINT16 *UniStrCat(UINT16 *dst, UINT16 *src)
612{
613        register UINT16 *s = src, *d = dst;
614       
615        // search last position
616        while (*d) d++;
617
618        // strcpy
619        while (*s) *d++ = *s++;
620
621        *d = 0; // null terminate
622
623        return dst;     
624}
625
626
627// UniStrCompare
628// unicode version of strcmp
629int UniStrCompare(UINT16 *string1, UINT16 *string2)
630{
631        register UINT16 *str1 = string1, *str2 = string2;
632        for (; *str1 != 0 || *str2 != 0; str1++, str2++) {
633                if (*str1 != *str2)
634                        return (*str1 - *str2);
635        }
636        return 0;
637}
638
639
640// UniStrTrim
641// cut out trailing unnecessary space.
642// return string pointer
643UINT16 *UniStrTrim(UINT16 *uStr)
644{
645        register UINT16 *s = uStr;
646
647        // search tail
648        while (*s && *s != ' ') s++;
649
650        // now, *s is 0 or space.
651        *s = 0;
652
653        return uStr;
654}
655
656
657// UniStrFromAscii
658// just convert char string to Unicode string.
659// only applicable in ascii code.
660void UniStrFromAscii(UINT16 *ustr, char *str)
661{
662        while (*str)
663                *ustr++ = (UINT16)(*str++);
664        *ustr = 0;
665}
666
667
668
669
670// convert one Hex character to digit
671#define HEX_CH_2_DIGIT(c) ( \
672        ((c)>='0' && (c)<='9') ? (c)-'0' : \
673        ((c)>='a' && (c)<='f') ? (c)-'a'+10 : \
674        ((c)>='A' && (c)<='F') ? (c)-'A'+10 : 0)
675
676// convert two character hax to digit
677static UINT16 ConvHexToInt(char ch1, char ch2)
678{
679        return ((HEX_CH_2_DIGIT(ch1)<<4U) | HEX_CH_2_DIGIT(ch2));
680}
681       
682
683// UniStrCreate
684// convert string to unicode string
685// non-Latin ASCII can be converted using "&" escaper.
686// uStr can be null. in that case, internal static buffer is used (max 79 chars)
687// return converted unicode string pointer
688UINT16 *UniStrCreate(char *cStr, UINT16 *uStr)
689{
690        static UINT16 sUStrBuf[80]; // provide temporary buffer
691
692        register UINT16 *u;
693        register char *p;
694
695        p = cStr;
696        u = uStr ? uStr : sUStrBuf;
697               
698        for (; *p; p++, u++) {
699                if (*p != '&')
700                        *u = (UINT16)(*p);
701                else {
702                        if (*(++p) == '&')
703                                *u = (UINT16)'&';
704                        else {
705                                *u = ConvHexToInt(p[0], p[1]);
706                                p++;
707                        }
708                }
709        }
710        *u = 0; // null terminate
711       
712        return uStr ? uStr : sUStrBuf;
713
714}
715
716
717#if 0
718_____TEST_______()
719#endif
720
721
722// cafrii 041126 add
723void TestConvKs2Uc(int number)
724{
725        int i;
726        char buf[100];
727        UINT16 *ucs;
728       
729        srand(DHL_OS_GetMsCount());
730
731        if (number == 0) number = 20;
732       
733        for (i=0; i<number; i++) {
734
735                DMW_MakeRandomKsString(buf, rand()%40+10, 2);
736
737                DHL_OS_Printf("(%d) original string: '%s', strlen %d\n", i, buf, strlen(buf));
738               
739                ucs = DMW_ConvKs2Uc(buf, -1);
740
741                DHL_OS_Printf("    unicode string: '");
742                DMW_UniPrint(ucs, -1);
743                DHL_OS_Printf("'\n");
744               
745                DMW_FreeUcString(ucs);
746        }       
747}
748       
749
750
751
752/********************************************************************
753   $Log: DMW_CodeConv.c,v $
754
755        1.22 2004/11/26 DMW_ConvKs2Uc °ü·Ã Ãß°¡, MakeRandomString Ãß°¡
756        1.21 2004/11/4  DMW_Unicode2Ks Ãß°¡, DebugUtil.h Ãß°¡
757        1.2  2004/9/20  DMW_Config µµÀÔ, config »çÇ× À̵¿       
758        1.1  2004/7/16  add debug print
759        1.0  2004/04/16 first design
760
761*********************************************************************/
Note: See TracBrowser for help on using the repository browser.