diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-06-11 10:03:21 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-06-11 10:03:21 +0000 |
commit | 1bc6f594d3de8dbfb5c165835eaec99bd49327c8 (patch) | |
tree | d535a84c63a5cf779aa1ae83f89ed64f22040471 /ext/kconv/kconv.c | |
parent | 3f5b1ec9cb657375a0c467ac70fdd6fbdc97f018 (diff) |
1.1b9_25
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@238 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/kconv/kconv.c')
-rw-r--r-- | ext/kconv/kconv.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/ext/kconv/kconv.c b/ext/kconv/kconv.c index 5762e3531f..fb229c6ef6 100644 --- a/ext/kconv/kconv.c +++ b/ext/kconv/kconv.c @@ -1893,8 +1893,22 @@ kconv_guess(obj, src) { unsigned char *p = RSTRING(src)->ptr; unsigned char *pend = p + RSTRING(src)->len; - -#define INCR {p++;if (p==pend) return INT2FIX(_UNKNOWN);} + int sequence_counter = 0; + +#define INCR do {\ + p++;\ + if (p==pend) return INT2FIX(_UNKNOWN);\ + sequence_counter++;\ + if (sequence_counter % 2 == 1 && *p != 0xa4)\ + sequence_counter = 0;\ + if (6 <= sequence_counter) {\ + sequence_counter = 0;\ + return INT2FIX(_EUC);\ + }\ +} while (0) + + if (*p == 0xa4) + sequence_counter = 1; while (p<pend) { if (*p == '\033') { @@ -1908,37 +1922,41 @@ kconv_guess(obj, src) if (0x81 <= *p && *p <= 0x8d) { return INT2FIX(_SJIS); } - if (*p == 0x8e) { + if (0x8f <= *p && *p <= 0x9f) { + return INT2FIX(_SJIS); + } + if (*p == 0x8e) { /* SS2 */ INCR; if ((0x40 <= *p && *p <= 0x7e) || (0x80 <= *p && *p <= 0xa0) || (0xe0 <= *p && *p <= 0xfc)) return INT2FIX(_SJIS); } - if (0xa1 <= *p && *p <= 0xdf) { + else if (0xa1 <= *p && *p <= 0xdf) { INCR; if (0xf0 <= *p && *p <= 0xfe) return INT2FIX(_EUC); if (0xe0 <= *p && *p <= 0xef) { - while (*p >= 0x40) { + while (p < pend && *p >= 0x40) { if (*p >= 0x81) { - if (0x8d <= *p || (0x8f <= *p && *p <= 0x9f)) { + if (*p <= 0x8d || (0x8f <= *p && *p <= 0x9f)) { return INT2FIX(_SJIS); } else if (0xfd <= *p && *p <= 0xfe) { return INT2FIX(_EUC); } } + INCR; } } - if (*p <= 0x9f) { + else if (*p <= 0x9f) { return INT2FIX(_SJIS); } } - if (0xf0 <= *p && *p <= 0xfe) { + else if (0xf0 <= *p && *p <= 0xfe) { return INT2FIX(_EUC); } - if (0xe0 <= *p && *p <= 0xef) { + else if (0xe0 <= *p && *p <= 0xef) { INCR; if ((0x40 <= *p && *p <= 0x7e) || (0x80 <= *p && *p <= 0xa0)) { @@ -1948,7 +1966,7 @@ kconv_guess(obj, src) return INT2FIX(_EUC); } } - p++; + INCR; } return INT2FIX(_UNKNOWN); } |