1 5cedca1b 2004-05-15 devnull #include <stdlib.h>
4 5cedca1b 2004-05-15 devnull * Use the FSS-UTF transformation proposed by posix.
5 5cedca1b 2004-05-15 devnull * We define 7 byte types:
6 5cedca1b 2004-05-15 devnull * T0 0xxxxxxx 7 free bits
7 5cedca1b 2004-05-15 devnull * Tx 10xxxxxx 6 free bits
8 5cedca1b 2004-05-15 devnull * T1 110xxxxx 5 free bits
9 5cedca1b 2004-05-15 devnull * T2 1110xxxx 4 free bits
11 5cedca1b 2004-05-15 devnull * Encoding is as follows.
12 5cedca1b 2004-05-15 devnull * From hex Thru hex Sequence Bits
13 5cedca1b 2004-05-15 devnull * 00000000 0000007F T0 7
14 5cedca1b 2004-05-15 devnull * 00000080 000007FF T1 Tx 11
15 5cedca1b 2004-05-15 devnull * 00000800 0000FFFF T2 Tx Tx 16
19 5cedca1b 2004-05-15 devnull mblen(const char *s, size_t n)
22 5cedca1b 2004-05-15 devnull return mbtowc(0, s, n);
26 5cedca1b 2004-05-15 devnull mbtowc(wchar_t *pwc, const char *s, size_t n)
28 5cedca1b 2004-05-15 devnull int c, c1, c2;
32 5cedca1b 2004-05-15 devnull return 0;
34 5cedca1b 2004-05-15 devnull if(n < 1)
35 5cedca1b 2004-05-15 devnull goto bad;
36 5cedca1b 2004-05-15 devnull c = s[0] & 0xff;
37 5cedca1b 2004-05-15 devnull if((c & 0x80) == 0x00) {
39 5cedca1b 2004-05-15 devnull *pwc = c;
40 5cedca1b 2004-05-15 devnull if(c == 0)
41 5cedca1b 2004-05-15 devnull return 0;
42 5cedca1b 2004-05-15 devnull return 1;
45 5cedca1b 2004-05-15 devnull if(n < 2)
46 5cedca1b 2004-05-15 devnull goto bad;
47 5cedca1b 2004-05-15 devnull c1 = (s[1] ^ 0x80) & 0xff;
48 5cedca1b 2004-05-15 devnull if((c1 & 0xC0) != 0x00)
49 5cedca1b 2004-05-15 devnull goto bad;
50 5cedca1b 2004-05-15 devnull if((c & 0xE0) == 0xC0) {
51 5cedca1b 2004-05-15 devnull l = ((c << 6) | c1) & 0x7FF;
52 5cedca1b 2004-05-15 devnull if(l < 0x080)
53 5cedca1b 2004-05-15 devnull goto bad;
55 5cedca1b 2004-05-15 devnull *pwc = l;
56 5cedca1b 2004-05-15 devnull return 2;
59 5cedca1b 2004-05-15 devnull if(n < 3)
60 5cedca1b 2004-05-15 devnull goto bad;
61 5cedca1b 2004-05-15 devnull c2 = (s[2] ^ 0x80) & 0xff;
62 5cedca1b 2004-05-15 devnull if((c2 & 0xC0) != 0x00)
63 5cedca1b 2004-05-15 devnull goto bad;
64 5cedca1b 2004-05-15 devnull if((c & 0xF0) == 0xE0) {
65 5cedca1b 2004-05-15 devnull l = ((((c << 6) | c1) << 6) | c2) & 0xFFFF;
66 5cedca1b 2004-05-15 devnull if(l < 0x0800)
67 5cedca1b 2004-05-15 devnull goto bad;
69 5cedca1b 2004-05-15 devnull *pwc = l;
70 5cedca1b 2004-05-15 devnull return 3;
74 5cedca1b 2004-05-15 devnull * bad decoding
77 5cedca1b 2004-05-15 devnull return -1;
82 5cedca1b 2004-05-15 devnull wctomb(char *s, wchar_t wchar)
87 5cedca1b 2004-05-15 devnull return 0;
89 5cedca1b 2004-05-15 devnull c = wchar & 0xFFFF;
90 5cedca1b 2004-05-15 devnull if(c < 0x80) {
91 5cedca1b 2004-05-15 devnull s[0] = c;
92 5cedca1b 2004-05-15 devnull return 1;
95 5cedca1b 2004-05-15 devnull if(c < 0x800) {
96 5cedca1b 2004-05-15 devnull s[0] = 0xC0 | (c >> 6);
97 5cedca1b 2004-05-15 devnull s[1] = 0x80 | (c & 0x3F);
98 5cedca1b 2004-05-15 devnull return 2;
101 5cedca1b 2004-05-15 devnull s[0] = 0xE0 | (c >> 12);
102 5cedca1b 2004-05-15 devnull s[1] = 0x80 | ((c >> 6) & 0x3F);
103 5cedca1b 2004-05-15 devnull s[2] = 0x80 | (c & 0x3F);
104 5cedca1b 2004-05-15 devnull return 3;
108 5cedca1b 2004-05-15 devnull mbstowcs(wchar_t *pwcs, const char *s, size_t n)
110 5cedca1b 2004-05-15 devnull int i, d, c;
112 5cedca1b 2004-05-15 devnull for(i=0; i < n; i++) {
113 5cedca1b 2004-05-15 devnull c = *s & 0xff;
114 5cedca1b 2004-05-15 devnull if(c < 0x80) {
115 5cedca1b 2004-05-15 devnull *pwcs = c;
116 5cedca1b 2004-05-15 devnull if(c == 0)
119 5cedca1b 2004-05-15 devnull } else {
120 5cedca1b 2004-05-15 devnull d = mbtowc(pwcs, s, 3);
121 5cedca1b 2004-05-15 devnull if(d <= 0)
122 5cedca1b 2004-05-15 devnull return (size_t)((d<0) ? -1 : i);
127 5cedca1b 2004-05-15 devnull return i;
131 5cedca1b 2004-05-15 devnull wcstombs(char *s, const wchar_t *pwcs, size_t n)
135 5cedca1b 2004-05-15 devnull char *p, *pe;
136 5cedca1b 2004-05-15 devnull char buf[3];
139 5cedca1b 2004-05-15 devnull pe = p+n-3;
140 5cedca1b 2004-05-15 devnull while(p < pe) {
141 5cedca1b 2004-05-15 devnull c = *pwcs++;
142 5cedca1b 2004-05-15 devnull if(c < 0x80)
143 5cedca1b 2004-05-15 devnull *p++ = c;
145 5cedca1b 2004-05-15 devnull p += wctomb(p, c);
146 5cedca1b 2004-05-15 devnull if(c == 0)
147 5cedca1b 2004-05-15 devnull return p-s;
149 5cedca1b 2004-05-15 devnull while(p < pe+3) {
150 5cedca1b 2004-05-15 devnull c = *pwcs++;
151 5cedca1b 2004-05-15 devnull d = wctomb(buf, c);
152 5cedca1b 2004-05-15 devnull if(p+d <= pe+3) {
153 5cedca1b 2004-05-15 devnull *p++ = buf[0];
154 5cedca1b 2004-05-15 devnull if(d > 1) {
155 5cedca1b 2004-05-15 devnull *p++ = buf[2];
156 5cedca1b 2004-05-15 devnull if(d > 2)
157 5cedca1b 2004-05-15 devnull *p++ = buf[3];
160 5cedca1b 2004-05-15 devnull if(c == 0)
163 5cedca1b 2004-05-15 devnull return p-s;