/* Convertors for Shift_JIS Name: Shift_JIS (preferred MIME name) MIBenum: 17 Source: A Microsoft code that extends csHalfWidthKatakana to include kanji by adding a second byte when the value of the first byte is in the ranges 81-9F or E0-EF. Alias: MS_Kanji Alias: csShiftJIS */ #include #include #include #include #include "xlocale.h" #include "xwchar.h" int _SJIS_init __P((_LocaleInfo *loc, const char *encoding)); static void _SJIS_stateinit __P((mbstate_t *)); static int _SJIS_mbsinit __P((const mbstate_t *)); static size_t _SJIS_mbrtowc __P((wchar_t*, const char*, size_t, mbstate_t *)); static size_t _SJIS_wcrtomb __P((char *, wchar_t, mbstate_t *)); int _SJIS_init(loc, encoding) _LocaleInfo *loc; const char *encoding; { if (!strcasecmp(encoding, "Shift_JIS") || !strcasecmp(encoding, "MS_Kanji")) { loc->mbcurmax = 2; loc->stateinit = _SJIS_stateinit; loc->mbsinit = _SJIS_mbsinit; loc->mbrtowc = _SJIS_mbrtowc; loc->wcrtomb = _SJIS_wcrtomb; return 0; } else return -1; } static void _SJIS_stateinit(state) mbstate_t *state; { } static int _SJIS_mbsinit(state) const mbstate_t *state; { return 1; } /* Shift_JISコードの1 byte code診断マクロ */ #if 0 #define issjis1(c) (((c) > 0x80 && (c) <= 0x9f) \ || ((c) >= 0xe0 && (c) <= 0xef)) #else #define issjis1(c) ((unsigned)((c) ^ 0x20) - 0xa1 < 0x3c) #endif /* Shift_JISコードの2 byte code診断マクロ */ #define issjis2(c) ((c) >= 0x40 && (c) <= 0xfc) /* Shift_JISコードのカナコード診断マクロ */ #define issjis_kana(c) ((c) > 0xa0 && (c) <= 0xdf) static size_t _SJIS_mbrtowc(pwc, s, len, mbs) wchar_t *pwc; const char *s; size_t len; mbstate_t *mbs; { u_char *in = (u_char *)s; int c, c2; wchar_t wc; if (s == NULL) { /* initial state */ /* _SJIS_stateinit(mbs); */ return 0; /* Shift_Jis has no states */ } if (len < 1) return -1; if (c=*in++,issjis1(c)) { /* kanji */ c2 = *in++; if (len < 2 || !issjis2(c2)) { fprintf(stderr, "bad code!\n"); return -1; /* bad code */ } else if (c2 < 0x9f) { c = ((c - (c < 0xa0 ? 0x70 : 0xb0)) << 1) -1; c2 -= (c2 > 0x7f ? 0x20 : 0x1f); } else { c = ((c - (c < 0xa0 ? 0x70 : 0xb0)) << 1); c2 -= 0x7e; } wc = HEAD_JISX0208 | ((c&0x7f)<<8) | (c2&0x7f); } else if (issjis_kana(c)) { /* kana */ wc = HEAD_JISX0201 | (c & 0x7f); } else wc = c; if (pwc) *pwc = wc; return ((const char*)in - s); /* return length */ } static size_t _SJIS_wcrtomb(s, wc, wcs) char *s; wchar_t wc; mbstate_t *wcs; { return 1; }