5 typedef unsigned short smb_ucs2_t;
\r
7 #define CVAL(buf,pos) (((unsigned char *)(buf))[pos])
\r
8 #define DEBUG(x, s) printf s
\r
10 static size_t utf8_pull(char **inbuf, size_t *inbytesleft,
\r
11 char **outbuf, size_t *outbytesleft)
\r
13 while (*inbytesleft >= 1 && *outbytesleft >= 2) {
\r
14 unsigned char *c = (unsigned char *)*inbuf;
\r
15 unsigned char *uc = (unsigned char *)*outbuf;
\r
18 if ((c[0] & 0x80) == 0) {
\r
21 } else if ((c[0] & 0xf0) == 0xe0) {
\r
22 if (*inbytesleft < 3) {
\r
23 DEBUG(0,("short utf8 char\n"));
\r
26 uc[1] = ((c[0]&0xF)<<4) | ((c[1]>>2)&0xF);
\r
27 uc[0] = (c[1]<<6) | (c[2]&0x3f);
\r
29 } else if ((c[0] & 0xe0) == 0xc0) {
\r
30 if (*inbytesleft < 2) {
\r
31 DEBUG(0,("short utf8 char\n"));
\r
34 uc[1] = (c[0]>>2) & 0x7;
\r
35 uc[0] = (c[0]<<6) | (c[1]&0x3f);
\r
40 (*inbytesleft) -= len;
\r
41 (*outbytesleft) -= 2;
\r
45 if (*inbytesleft > 0) {
\r
57 static size_t utf8_push(char **inbuf, size_t *inbytesleft,
\r
58 char **outbuf, size_t *outbytesleft)
\r
60 while (*inbytesleft >= 2 && *outbytesleft >= 1) {
\r
61 unsigned char *c = (unsigned char *)*outbuf;
\r
62 unsigned char *uc = (unsigned char *)*inbuf;
\r
65 if ((uc[1] & 0xf8) == 0xd8) {
\r
66 if (*outbytesleft < 3) {
\r
67 DEBUG(0,("short utf8 write\n"));
\r
74 } else if (uc[1] & 0xf8) {
\r
75 if (*outbytesleft < 3) {
\r
76 DEBUG(0,("short utf8 write\n"));
\r
79 c[0] = 0xe0 | (uc[1]>>4);
\r
80 c[1] = 0x80 | ((uc[1]&0xF)<<2) | (uc[0]>>6);
\r
81 c[2] = 0x80 | (uc[0]&0x3f);
\r
83 } else if (uc[1] | (uc[0] & 0x80)) {
\r
84 if (*outbytesleft < 2) {
\r
85 DEBUG(0,("short utf8 write\n"));
\r
88 c[0] = 0xc0 | (uc[1]<<2) | (uc[0]>>6);
\r
89 c[1] = 0x80 | (uc[0]&0x3f);
\r
96 (*inbytesleft) -= 2;
\r
97 (*outbytesleft) -= len;
\r
102 if (*inbytesleft == 1) {
\r
107 if (*inbytesleft > 1) {
\r
123 smb_ucs2_t s[2] = {0xe4, 0};
\r
125 unsigned char buf[10];
\r
130 printf("Converting 0x%04x\n", s[0]);
\r
132 cd = iconv_open("UTF8", "UCS2");
\r
139 utf8_push(&inp, &inlen, &outp, &outlen);
\r
141 for (i=0;i<10-outlen;i++) {
\r
142 printf("%02x ", buf[i]);
\r
151 iconv(cd, &inp, &inlen, &outp, &outlen);
\r
153 for (i=0;i<10-outlen;i++) {
\r
154 printf("%02x ", buf[i]);
\r