123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #include "cp932ext.h"
- static int
- cp932_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
- {
- unsigned char c = *s;
- if (c < 0x80)
- return ascii_mbtowc(conv,pwc,s,n);
- else if (c >= 0xa1 && c <= 0xdf)
- return jisx0201_mbtowc(conv,pwc,s,n);
- else {
- unsigned char s1, s2;
- s1 = c;
- if ((s1 >= 0x81 && s1 <= 0x9f && s1 != 0x87) || (s1 >= 0xe0 && s1 <= 0xea)) {
- if (n < 2)
- return RET_TOOFEW(0);
- s2 = s[1];
- if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) {
- unsigned char t1 = (s1 < 0xe0 ? s1-0x81 : s1-0xc1);
- unsigned char t2 = (s2 < 0x80 ? s2-0x40 : s2-0x41);
- unsigned char buf[2];
- buf[0] = 2*t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
- buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21;
- return jisx0208_mbtowc(conv,pwc,buf,2);
- }
- } else if ((s1 == 0x87) || (s1 >= 0xed && s1 <= 0xee) || (s1 >= 0xfa)) {
- if (n < 2)
- return RET_TOOFEW(0);
- return cp932ext_mbtowc(conv,pwc,s,2);
- } else if (s1 >= 0xf0 && s1 <= 0xf9) {
-
- if (n < 2)
- return RET_TOOFEW(0);
- s2 = s[1];
- if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) {
- *pwc = 0xe000 + 188*(s1 - 0xf0) + (s2 < 0x80 ? s2-0x40 : s2-0x41);
- return 2;
- }
- }
- return RET_ILSEQ;
- }
- }
- static int
- cp932_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
- {
- unsigned char buf[2];
- int ret;
-
- ret = ascii_wctomb(conv,buf,wc,1);
- if (ret != RET_ILUNI) {
- unsigned char c;
- if (ret != 1) abort();
- c = buf[0];
- if (c < 0x80) {
- r[0] = c;
- return 1;
- }
- }
-
- ret = jisx0201_wctomb(conv,buf,wc,1);
- if (ret != RET_ILUNI) {
- unsigned char c;
- if (ret != 1) abort();
- c = buf[0];
- if (c >= 0xa1 && c <= 0xdf) {
- r[0] = c;
- return 1;
- }
- }
-
- ret = jisx0208_wctomb(conv,buf,wc,2);
- if (ret != RET_ILUNI) {
- unsigned char c1, c2;
- if (ret != 2) abort();
- if (n < 2)
- return RET_TOOSMALL;
- c1 = buf[0];
- c2 = buf[1];
- if ((c1 >= 0x21 && c1 <= 0x74) && (c2 >= 0x21 && c2 <= 0x7e)) {
- unsigned char t1 = (c1 - 0x21) >> 1;
- unsigned char t2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
- r[0] = (t1 < 0x1f ? t1+0x81 : t1+0xc1);
- r[1] = (t2 < 0x3f ? t2+0x40 : t2+0x41);
- return 2;
- }
- }
-
- ret = cp932ext_wctomb(conv,buf,wc,2);
- if (ret != RET_ILUNI) {
- if (ret != 2) abort();
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = buf[0];
- r[1] = buf[1];
- return 2;
- }
-
- if (wc >= 0xe000 && wc < 0xe758) {
- unsigned char c1, c2;
- if (n < 2)
- return RET_TOOSMALL;
- c1 = (unsigned int) (wc - 0xe000) / 188;
- c2 = (unsigned int) (wc - 0xe000) % 188;
- r[0] = c1+0xf0;
- r[1] = (c2 < 0x3f ? c2+0x40 : c2+0x41);
- return 2;
- }
-
- if (wc == 0xff5e) {
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = 0x81;
- r[1] = 0x60;
- return 2;
- }
- if (wc == 0x2225) {
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = 0x81;
- r[1] = 0x61;
- return 2;
- }
- if (wc == 0xff0d) {
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = 0x81;
- r[1] = 0x7c;
- return 2;
- }
- if (wc == 0xffe0) {
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = 0x81;
- r[1] = 0x91;
- return 2;
- }
- if (wc == 0xffe1) {
- if (n < 2)
- return RET_TOOSMALL;
- r[0] = 0x81;
- r[1] = 0x92;
- return 2;
- }
- return RET_ILUNI;
- }
|