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