Rev 7085 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9307 | turbocat | 1 | typedef unsigned int size_t; |
2 | #define NULL ((void*)0) |
||
3479 | leency | 3 | |
4 | typedef int conv_t; |
||
5 | typedef unsigned int ucs4_t; |
||
6 | typedef int iconv_t; |
||
7 | |||
8 | /* Return code if invalid input after a shift sequence of n bytes was read. |
||
9 | (xxx_mbtowc) */ |
||
10 | #define RET_SHIFT_ILSEQ(n) (-1-2*(n)) |
||
11 | /* Return code if invalid. (xxx_mbtowc) */ |
||
12 | #define RET_ILSEQ RET_SHIFT_ILSEQ(0) |
||
13 | /* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */ |
||
14 | #define RET_TOOFEW(n) (-2-2*(n)) |
||
15 | |||
16 | /* Return code if invalid. (xxx_wctomb) */ |
||
17 | #define RET_ILUNI -1 |
||
18 | /* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */ |
||
19 | #define RET_TOOSMALL -2 |
||
20 | |||
21 | #define CP866 0 |
||
22 | #define CP1251 1 |
||
23 | #define CP1252 2 |
||
24 | #define KOI8_RU 3 |
||
25 | #define ISO8859_5 4 |
||
26 | #define UTF_8 5 |
||
27 | |||
9307 | turbocat | 28 | int strcmp (const char* a, const char* b) { |
29 | return (*a && *b && (*a == *b)) ? ((*(a+1) || *(b+1)) ? (strcmp(a+1, b+1)) : (0)) : ((*a > *b) ? (1) : (-1)); |
||
30 | } |
||
31 | |||
3479 | leency | 32 | #include "cp866.h" |
33 | #include "cp1251.h" |
||
34 | #include "cp1252.h" |
||
35 | #include "koi8_ru.h" |
||
36 | #include "iso8859_5.h" |
||
37 | #include "utf8.h" |
||
38 | |||
9307 | turbocat | 39 | int encoding(const char *what) { |
40 | if (!strcmp(what,"CP866")) return CP866; |
||
41 | if (!strcmp(what,"CP1251")) return CP1251; |
||
42 | if (!strcmp(what,"CP1252")) return CP1252; |
||
43 | if (!strcmp(what,"KOI8-RU")) return KOI8_RU; |
||
44 | if (!strcmp(what,"ISO8859-5")) return ISO8859_5; |
||
45 | if (!strcmp(what,"UTF-8")) return UTF_8; |
||
46 | return -1; |
||
3479 | leency | 47 | } |
48 | |||
49 | iconv_t iconv_open(const char *tocode, const char *fromcode) { |
||
9307 | turbocat | 50 | int to, from; |
51 | if ((to=encoding(tocode))==-1) return -1; |
||
52 | if ((from=encoding(fromcode))==-1) return -1; |
||
53 | to=to<<16&0xFFFF0000; |
||
54 | from=from&0xFFFF; |
||
55 | return to+from; |
||
3479 | leency | 56 | } |
57 | |||
9307 | turbocat | 58 | size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { |
59 | int n, to, from, count1,count2; |
||
60 | int pwc, converted,written; |
||
61 | int (*mbtowc)(conv_t, ucs4_t*, const unsigned char*, int); |
||
62 | int (*wctomb)(conv_t, unsigned char*, ucs4_t, int); |
||
6882 | ashmew2 | 63 | |
9307 | turbocat | 64 | char *str; |
65 | str=*outbuf; |
||
7057 | ashmew2 | 66 | |
9307 | turbocat | 67 | from=cd>>16; |
68 | to=cd&0xFFFF; |
||
7057 | ashmew2 | 69 | |
9307 | turbocat | 70 | switch (from) |
71 | { |
||
72 | case CP866: mbtowc=cp866_mbtowc; break; |
||
73 | case CP1251: mbtowc=cp1251_mbtowc; break; |
||
74 | case CP1252: mbtowc=cp1252_mbtowc; break; |
||
75 | case ISO8859_5: mbtowc=iso8859_5_mbtowc; break; |
||
76 | case KOI8_RU: mbtowc=koi8_ru_mbtowc; break; |
||
77 | case UTF_8: mbtowc=utf8_mbtowc; break; |
||
78 | default: return -2; |
||
79 | } |
||
7057 | ashmew2 | 80 | |
9307 | turbocat | 81 | switch (to) |
82 | { |
||
83 | case CP866: wctomb=cp866_wctomb; break; |
||
84 | case CP1251: wctomb=cp1251_wctomb; break; |
||
85 | case CP1252: wctomb=cp1252_wctomb; break; |
||
86 | case ISO8859_5: wctomb=iso8859_5_wctomb; break; |
||
87 | case KOI8_RU: wctomb=koi8_ru_wctomb; break; |
||
88 | case UTF_8: wctomb=utf8_wctomb; break; |
||
89 | default: return -3; |
||
90 | } |
||
6894 | ashmew2 | 91 | |
9307 | turbocat | 92 | count1=0; |
93 | count2=0; |
||
6894 | ashmew2 | 94 | |
9307 | turbocat | 95 | while ( *inbytesleft>0 && *outbytesleft>1) |
96 | { |
||
97 | n=1; |
||
7057 | ashmew2 | 98 | |
9307 | turbocat | 99 | do { |
100 | //converted= (utf8_mbtowc)(0,&pwc,((*inbuf)+count1),n); |
||
101 | // printf("%d\n",n); |
||
102 | converted = (mbtowc)(0,&pwc,((*inbuf)+count1),n); |
||
7057 | ashmew2 | 103 | |
9307 | turbocat | 104 | n++; |
105 | } while (converted==RET_TOOFEW(0)); |
||
7057 | ashmew2 | 106 | |
9307 | turbocat | 107 | if (converted<0) return -10; |
108 | //written= (cp866_wctomb)(0,str+count2,pwc,1); |
||
109 | written = (wctomb)(0,str+count2,pwc,1); |
||
110 | if (written<0) written=0;//return -11; |
||
7057 | ashmew2 | 111 | |
9307 | turbocat | 112 | //printf("Conv:%d Wri:%d In:%d Out:%d UTF:%x UCS:%x 866:%s\n",converted, written, *inbytesleft,*outbytesleft,*((*inbuf)+count1),pwc, str); |
6894 | ashmew2 | 113 | |
9307 | turbocat | 114 | (*inbytesleft)-=converted; |
115 | (*outbytesleft)-=written; |
||
116 | count1+=converted; |
||
117 | count2+=written; |
||
6894 | ashmew2 | 118 | } |
9307 | turbocat | 119 | *(str+count2)='\0'; |
7057 | ashmew2 | 120 | |
9307 | turbocat | 121 | if (*inbytesleft>0 && *outbytesleft==0) return -12; |
122 | return 0; |
||
3479 | leency | 123 | } |
124 | |||
9307 | turbocat | 125 | typedef struct { |
126 | char *name; |
||
127 | void *func; |
||
128 | } export_t; |
||
3479 | leency | 129 | |
9307 | turbocat | 130 | export_t EXPORTS[] = { |
131 | {"START", (void*)0x0}, |
||
132 | {"version", (void*)0x00010001}, |
||
133 | {"iconv_open", iconv_open}, |
||
134 | {"iconv", iconv}, |
||
135 | NULL |
||
136 | };0)>0)>16&0xFFFF0000; |