OSDN Git Service

first commit
[winexe-harib/winexe-harib.git] / golibc / charset.cpp
1 #include <stdlib.h>
2 #include <string.h>
3 #include <ctype.h>
4 #include "CP932.h2"
5
6 //--------------------stdlib.h------------------
7
8 int cp932towcs(const char *p1, int n, wchar_t *unicode){
9         int left = 0;
10         int right = sizeof(cp932_unicode) / sizeof(cp932_unicode[0]);
11         int cp932 = 0;
12         int ret = 0;
13         unsigned char *p = (unsigned char *)p1;
14         unsigned char c = *p;
15         //fprintf(stderr, "c:%02X\n", *p);
16         if(c < 0x7f){
17                 *unicode = c;
18                 return 1;
19         }else if (c >= 0xa1 && c <= 0xdf){
20                 cp932 = c;
21                 ret = 1;
22         }else{
23                 if(n < 2){
24                         return 0;
25                 }
26                 cp932 = p[1] | (p[0] << 8);
27                 //fprintf(stderr, "p:%p\n", cp932);
28                 ret = 2;
29         }
30         *unicode = 0;
31         while(1){
32                 if(right <= left){
33                         break;
34                 }
35                 int mid = (right + left) / 2;
36                 //printf("r:%04X(%04X) l:%04X(%04X) m:%04X(%04X)\n", right, cp932_unicode[right].cp932, left, cp932_unicode[left].cp932, mid, cp932_unicode[mid].cp932);
37                 if(cp932_unicode[mid].cp932 < cp932){
38                         left = mid + 1;
39                 }else if(cp932_unicode[mid].cp932 > cp932){
40                         right = mid;
41                 }else{
42                         *unicode = cp932_unicode[mid].unicode;
43                         break;
44                 }
45         }
46         if(*unicode == 0){
47                 return 0;
48         }
49         return ret;
50 }
51
52 size_t mbstowcs(wchar_t *dest, const char *src, size_t n){
53         if(dest != NULL){
54                 size_t p = 0;
55                 for(;;){
56                         int r = cp932towcs(src, 10, dest + p);
57                         if(r == 0){
58                                 return (size_t)-1;
59                         }
60                         if(dest[p] == 0){
61                                 return p;
62                         }
63                         if(p >= n - 1){
64                                 return n;
65                         }
66                         p++;
67
68                         src += r;
69                 }
70         }else{
71                 size_t p = 0;
72                 for(;;){
73                         wchar_t u;
74                         int r = cp932towcs(src, 10, &u);
75                         if(r == 0){
76                                 return (size_t)-1;
77                         }
78                         if(u == 0){
79                                 return p;
80                         }
81                         p++;
82
83                         src += r;
84                 }
85         }
86 }
87
88 //----------------------string.h--------------------------
89
90
91 int wcslen(const wchar_t *p){
92         int len = 0;
93         while(p[len++]);
94         return len - 1;
95 }
96
97 wchar_t *wcsncpy(wchar_t *dest, const wchar_t *src, int n){
98         for(int i = 0; i < n; i++){
99                 if(!(dest[i] = src[i])){
100                         break;
101                 }
102         }
103         return dest;
104 }
105
106 int wcsicmp(const wchar_t *s1, const wchar_t *s2){
107         int i;
108         for(i = 0; towlower(s1[i]) == towlower(s2[i]); i++){
109                 if(s1[i] == L'\0' || s2[i] == L'\0'){
110                         return (int)s1[i] - (int)s2[i];
111                 }
112         }
113         return (int)towlower(s1[i]) - (int)towlower(s2[i]);
114 }