1 #include "gcin.h"
2
3 #if !GCIN_IME && !TSF && !GCIN_EXIT
utf8_big5_n(char * s,int len,char out[])4 void utf8_big5_n(char *s, int len, char out[])
5 {
6 out[0]=0;
7
8 GError *err = NULL;
9 gsize rn, wn;
10 char *big5 = g_locale_from_utf8 (s, len, &rn, &wn, &err);
11
12 if (err || !big5) {
13 dbg("utf8_big5 convert error\n");
14 // abort();
15 return;
16 }
17
18 strcpy(out, big5);
19 g_free(big5);
20 }
21
22
utf8_big5(char * s,char out[])23 void utf8_big5(char *s, char out[])
24 {
25 utf8_big5_n(s, strlen(s), out);
26 }
27 #endif
28
29
utf8_sz(char * s)30 int utf8_sz(char *s)
31 {
32 if (!(*s & 0x80))
33 return 1;
34
35 if ((*s & 0xe0) == 0xc0)
36 return 2;
37
38 if ((*s & 0xf0) == 0xe0)
39 return 3;
40
41 if ((*s & 0xf8) == 0xf0)
42 return 4;
43
44 p_err("bad utf8 char %x %c%c%c", *s, *s, *(s+1), *(s+2));
45 return -1;
46 }
47
48
utf8cpy(char * t,char * s)49 int utf8cpy(char *t, char *s)
50 {
51 int utf8sz = utf8_sz(s);
52
53 memcpy(t, s, utf8sz);
54 t[utf8sz] = 0;
55 return utf8sz;
56 }
57
58 // copy N utf-8 chars
utf8cpyN(char * t,char * s,int N)59 void utf8cpyN(char *t, char *s, int N)
60 {
61 int len = utf8_tlen(s, N);
62
63 memcpy(t, s, len);
64
65 t[len] = 0;
66 }
67
68
u8cpy(char * t,char * s)69 int u8cpy(char *t, char *s)
70 {
71 int utf8sz = utf8_sz(s);
72
73 memcpy(t, s, utf8sz);
74 return utf8sz;
75 }
76
77
utf8_tlen(char * s,int N)78 int utf8_tlen(char *s, int N)
79 {
80 int i;
81 char *p = s;
82
83 for(i=0; i < N; i++) {
84 int len = utf8_sz(p);
85 p+=len;
86 }
87
88 return p - s;
89 }
90
91 int utf8_to_big5(char *in, char *out, int outN);
utf8_putchar_fp(FILE * fp,char * s)92 void utf8_putchar_fp(FILE *fp, char *s)
93 {
94 int i;
95 int len = utf8_sz(s);
96 for(i=0;i<len;i++)
97 fputc(s[i], fp);
98 }
99
utf8_dbg(char * s)100 void utf8_dbg(char *s)
101 {
102 int i;
103 int len = utf8_sz(s);
104 char tt[5];
105 utf8cpy(tt, s);
106 dbg("%s", tt);
107 }
108
109
utf8_putchar(char * s)110 void utf8_putchar(char *s)
111 {
112 #if WIN32
113 char tt[CH_SZ+1], vv[CH_SZ+1];
114 utf8cpy(tt, s);
115 int len = utf8_to_big5(tt, vv, sizeof(vv));
116 for(int i=0;i<len;i++)
117 fputc(vv[i], stdout);
118 #else
119 utf8_putchar_fp(stdout, s);
120 #endif
121 }
122
utf8_putcharn(char * s,int n)123 void utf8_putcharn(char *s, int n)
124 {
125 int i, ofs;
126
127 for(ofs=i=0; i < n; i++) {
128 utf8_putchar(&s[ofs]);
129 ofs+= utf8_sz(&s[ofs]);
130 }
131 }
132
utf8_eq(char * a,char * b)133 gboolean utf8_eq(char *a, char *b)
134 {
135 int ta = utf8_sz(a);
136 int tb = utf8_sz(b);
137
138 if (ta != tb)
139 return FALSE;
140
141 return !memcmp(a,b, ta);
142 }
143
utf8_str_eq(char * a,char * b,int len)144 gboolean utf8_str_eq(char *a, char *b, int len)
145 {
146 int ta = utf8_tlen(a, len);
147 int tb = utf8_tlen(b, len);
148
149 if (ta != tb)
150 return FALSE;
151
152 return !memcmp(a, b, ta);
153 }
154
utf8_str_N(char * str)155 int utf8_str_N(char *str)
156 {
157 int N=0;
158
159 while (*str) {
160 str+= utf8_sz(str);
161 N++;
162 }
163
164 return N;
165 }
166
167 // copy at most n utf-8 chars
utf8cpyn(char * t,char * s,int n)168 void utf8cpyn(char *t, char *s, int n)
169 {
170 int tn=0;
171 int i;
172
173 for (i=0; i < n && *s; i++) {
174 int sz = utf8_sz(s);
175
176 memcpy(t+tn, s, sz);
177 tn+=sz;
178 s+=sz;
179 }
180
181 t[tn]=0;
182 }
183
184
185 // copy at most utf-8 bytes
utf8cpy_bytes(char * t,char * s,int n)186 void utf8cpy_bytes(char *t, char *s, int n)
187 {
188 int tn=0;
189 int i;
190
191 for (i=0; tn < n && *s; i++) {
192 int sz = utf8_sz(s);
193
194 memcpy(t+tn, s, sz);
195 tn+=sz;
196 s+=sz;
197 }
198
199 t[tn]=0;
200 }
201
202 #if WIN32
utf8_to_16(char * text,wchar_t * wtext,int wlen)203 int utf8_to_16(char *text, wchar_t *wtext, int wlen)
204 {
205 return MultiByteToWideChar( CP_UTF8, 0, text, -1, wtext, wlen/sizeof(wchar_t)) -1;
206 }
207
utf16_to_8(wchar_t * in,char * out,int outN)208 int utf16_to_8(wchar_t *in, char *out, int outN)
209 {
210 return WideCharToMultiByte( CP_UTF8, 0, in, -1, out, outN, NULL, NULL) - 1;
211 }
212
utf8_to_big5(char * in,char * out,int outN)213 int utf8_to_big5(char *in, char *out, int outN)
214 {
215 wchar_t tt[512];
216 utf8_to_16(in, tt, sizeof(tt));
217 return WideCharToMultiByte( 950, 0, tt, -1, out, outN, NULL, NULL) - 1;
218 }
219
220
__utf16_8(wchar_t * s)221 char *__utf16_8(wchar_t *s)
222 {
223 static char tt[512];
224 utf16_to_8(s, tt, sizeof(tt));
225 return tt;
226 }
227
228 #endif
229
230
231 char utf8_sigature[]="\xef\xbb\xbf";
232
skip_utf8_sigature(FILE * fp)233 void skip_utf8_sigature(FILE *fp)
234 {
235 char tt[3];
236
237 tt[0]=0;
238 fread(tt, 1, 3, fp);
239 if (memcmp(tt, utf8_sigature, 3)) {
240 rewind(fp);
241 }
242 }
243