6 struct timeval tp1,tp2;
8 static void start_timer()
10 gettimeofday(&tp1,NULL);
13 static double end_timer()
15 gettimeofday(&tp2,NULL);
16 return((tp2.tv_sec - tp1.tv_sec) +
17 (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
20 static size_t utf8_pull(char **inbuf, size_t *inbytesleft,
21 char **outbuf, size_t *outbytesleft)
23 while (*inbytesleft >= 1 && *outbytesleft >= 2) {
24 unsigned char *c = (unsigned char *)*inbuf;
25 unsigned char *uc = (unsigned char *)*outbuf;
28 if ((c[0] & 0x80) == 0) {
31 } else if ((c[0] & 0xf0) == 0xe0) {
32 if (*inbytesleft < 3) {
35 uc[1] = ((c[0]&0xF)<<4) | ((c[1]>>2)&0xF);
36 uc[0] = (c[1]<<6) | (c[2]&0x3f);
38 } else if ((c[0] & 0xe0) == 0xc0) {
39 if (*inbytesleft < 2) {
42 uc[1] = (c[0]>>2) & 0x7;
43 uc[0] = (c[0]<<6) | (c[1]&0x3f);
48 (*inbytesleft) -= len;
53 if (*inbytesleft > 0) {
65 static size_t utf8_push(char **inbuf, size_t *inbytesleft,
66 char **outbuf, size_t *outbytesleft)
68 while (*inbytesleft >= 2 && *outbytesleft >= 1) {
69 unsigned char *c = (unsigned char *)*outbuf;
70 unsigned char *uc = (unsigned char *)*inbuf;
73 if ((uc[1] & 0xf8) == 0xd8) {
74 if (*outbytesleft < 3) {
81 } else if (uc[1] & 0xf8) {
82 if (*outbytesleft < 3) {
85 c[0] = 0xe0 | (uc[1]>>4);
86 c[1] = 0x80 | ((uc[1]&0xF)<<2) | (uc[0]>>6);
87 c[2] = 0x80 | (uc[0]&0x3f);
89 } else if (uc[1] | (uc[0] & 0x80)) {
90 if (*outbytesleft < 2) {
93 c[0] = 0xc0 | (uc[1]<<2) | (uc[0]>>6);
94 c[1] = 0x80 | (uc[0]&0x3f);
101 (*outbuf)[0] = (*inbuf)[0];
103 (*outbytesleft) -= len;
108 if (*inbytesleft == 1) {
113 if (*inbytesleft > 1) {
128 int main(int argc, char *argv[])
131 char *test_string, *buf1, *buf2;
132 int buflen, string_len;
136 cd = iconv_open("UCS2", argv[1]);
137 test_string = argv[2];
139 string_len = strlen(test_string);
140 buflen = strlen(test_string)*5;
141 buf1 = malloc(buflen);
142 buf2 = malloc(buflen);
146 for (i=0; end_timer() < 1; i++) {
147 char *p = test_string;
149 size_t inbytes = string_len;
150 size_t outbytes = buflen;
152 iconv(cd, &p, &inbytes, &q, &outbytes);
153 len1 = buflen - outbytes;
157 printf("iconv: %g ops/sec\n", i/end_timer());
161 for (i=0; end_timer() < 1; i++) {
162 char *p = test_string;
164 size_t inbytes = string_len;
165 size_t outbytes = buflen;
167 utf8_pull(&p, &inbytes, &q, &outbytes);
168 len2 = buflen - outbytes;
171 printf("internal: %g ops/sec\n", i/end_timer());
172 printf("string_len=%d len1=%d len2=%d\n", string_len, len1, len2);
174 if (len1 != len2 || memcmp(buf1, buf2, len1) != 0) {
175 printf("results DIFFER! (%10.10s) (%10.10s)\n",