1 31bffaba 2011-02-04 rsc #include <stdlib.h>
4 31bffaba 2011-02-04 rsc * Use the FSS-UTF transformation proposed by posix.
5 31bffaba 2011-02-04 rsc * We define 7 byte types:
6 31bffaba 2011-02-04 rsc * T0 0xxxxxxx 7 free bits
7 31bffaba 2011-02-04 rsc * Tx 10xxxxxx 6 free bits
8 31bffaba 2011-02-04 rsc * T1 110xxxxx 5 free bits
9 31bffaba 2011-02-04 rsc * T2 1110xxxx 4 free bits
11 31bffaba 2011-02-04 rsc * Encoding is as follows.
12 31bffaba 2011-02-04 rsc * From hex Thru hex Sequence Bits
13 31bffaba 2011-02-04 rsc * 00000000 0000007F T0 7
14 31bffaba 2011-02-04 rsc * 00000080 000007FF T1 Tx 11
15 31bffaba 2011-02-04 rsc * 00000800 0000FFFF T2 Tx Tx 16
19 31bffaba 2011-02-04 rsc mblen(const char *s, size_t n)
22 31bffaba 2011-02-04 rsc return mbtowc(0, s, n);
26 31bffaba 2011-02-04 rsc mbtowc(wchar_t *pwc, const char *s, size_t n)
28 31bffaba 2011-02-04 rsc int c, c1, c2;
36 31bffaba 2011-02-04 rsc c = s[0] & 0xff;
37 31bffaba 2011-02-04 rsc if((c & 0x80) == 0x00) {
47 31bffaba 2011-02-04 rsc c1 = (s[1] ^ 0x80) & 0xff;
48 31bffaba 2011-02-04 rsc if((c1 & 0xC0) != 0x00)
50 31bffaba 2011-02-04 rsc if((c & 0xE0) == 0xC0) {
51 31bffaba 2011-02-04 rsc l = ((c << 6) | c1) & 0x7FF;
52 31bffaba 2011-02-04 rsc if(l < 0x080)
61 31bffaba 2011-02-04 rsc c2 = (s[2] ^ 0x80) & 0xff;
62 31bffaba 2011-02-04 rsc if((c2 & 0xC0) != 0x00)
64 31bffaba 2011-02-04 rsc if((c & 0xF0) == 0xE0) {
65 31bffaba 2011-02-04 rsc l = ((((c << 6) | c1) << 6) | c2) & 0xFFFF;
66 31bffaba 2011-02-04 rsc if(l < 0x0800)
74 31bffaba 2011-02-04 rsc * bad decoding
82 31bffaba 2011-02-04 rsc wctomb(char *s, wchar_t wchar)
89 31bffaba 2011-02-04 rsc c = wchar & 0xFFFF;
90 31bffaba 2011-02-04 rsc if(c < 0x80) {
95 31bffaba 2011-02-04 rsc if(c < 0x800) {
96 31bffaba 2011-02-04 rsc s[0] = 0xC0 | (c >> 6);
97 31bffaba 2011-02-04 rsc s[1] = 0x80 | (c & 0x3F);
101 31bffaba 2011-02-04 rsc s[0] = 0xE0 | (c >> 12);
102 31bffaba 2011-02-04 rsc s[1] = 0x80 | ((c >> 6) & 0x3F);
103 31bffaba 2011-02-04 rsc s[2] = 0x80 | (c & 0x3F);
108 31bffaba 2011-02-04 rsc mbstowcs(wchar_t *pwcs, const char *s, size_t n)
110 31bffaba 2011-02-04 rsc int i, d, c;
112 31bffaba 2011-02-04 rsc for(i=0; i < n; i++) {
113 31bffaba 2011-02-04 rsc c = *s & 0xff;
114 31bffaba 2011-02-04 rsc if(c < 0x80) {
120 31bffaba 2011-02-04 rsc d = mbtowc(pwcs, s, 3);
122 31bffaba 2011-02-04 rsc return (size_t)((d<0) ? -1 : i);
131 31bffaba 2011-02-04 rsc wcstombs(char *s, const wchar_t *pwcs, size_t n)
135 31bffaba 2011-02-04 rsc char *p, *pe;
136 31bffaba 2011-02-04 rsc char buf[3];
140 31bffaba 2011-02-04 rsc while(p < pe) {
141 31bffaba 2011-02-04 rsc c = *pwcs++;
142 31bffaba 2011-02-04 rsc if(c < 0x80)
145 31bffaba 2011-02-04 rsc p += wctomb(p, c);
149 31bffaba 2011-02-04 rsc while(p < pe+3) {
150 31bffaba 2011-02-04 rsc c = *pwcs++;
151 31bffaba 2011-02-04 rsc d = wctomb(buf, c);
152 31bffaba 2011-02-04 rsc if(p+d <= pe+3) {
153 31bffaba 2011-02-04 rsc *p++ = buf[0];
155 31bffaba 2011-02-04 rsc *p++ = buf[1];
157 31bffaba 2011-02-04 rsc *p++ = buf[2];