/*
* linux/fs/nls/nls_euc-jp.c
*
* Added `OSF/JVC Recommended Code Set Conversion Specification
* between Japanese EUC and Shift-JIS' support: <hirofumi@mail.parknet.co.jp>
* (http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html)
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/nls.h>
#include <linux/errno.h>
static struct nls_table *p_nls;
#define IS_SJIS_LOW_BYTE(l) ((
0 x40 <= (l)) && ((l) <=
0 xFC) && ((l) !=
0 x7F))
/* JIS X 0208 (include NEC spesial characters) */
#define IS_SJIS_JISX0208(h, l) ((((
0 x81 <= (h)) && ((h) <=
0 x9F)) \
|| ((
0 xE0 <= (h)) && ((h) <=
0 xEA))) \
&& IS_SJIS_LOW_BYTE(l))
#define IS_SJIS_JISX0201KANA(c) ((
0 xA1 <= (c)) && ((c) <=
0 xDF))
#define IS_SJIS_UDC_LOW(h, l) (((
0 xF0 <= (h)) && ((h) <=
0 xF4)) \
&& IS_SJIS_LOW_BYTE(l))
#define IS_SJIS_UDC_HI(h, l) (((
0 xF5 <= (h)) && ((h) <=
0 xF9)) \
&& IS_SJIS_LOW_BYTE(l))
#define IS_SJIS_IBM(h, l) (((
0 xFA <= (h)) && ((h) <=
0 xFC)) \
&& IS_SJIS_LOW_BYTE(l))
#define IS_SJIS_NECIBM(h, l) (((
0 xED <= (h)) && ((h) <=
0 xEE)) \
&& IS_SJIS_LOW_BYTE(l))
#define MAP_SJIS2EUC(sjis_hi, sjis_lo, sjis_p, euc_hi, euc_lo, euc_p) { \
if ((sjis_lo) >=
0 x9F) { \
(euc_hi) = (sjis_hi) *
2 - (((sjis_p) *
2 - (euc_p)) -
1 ); \
(euc_lo) = (sjis_lo) +
2 ; \
}
else { \
(euc_hi) = (sjis_hi) *
2 - ((sjis_p) *
2 - (euc_p)); \
(euc_lo) = (sjis_lo) + ((sjis_lo) >=
0 x7F ?
0 x60 :
0 x61); \
} \
}
while (
0 )
#define SS2 (
0 x8E)
/* Single Shift 2 */
#define SS3 (
0 x8F)
/* Single Shift 3 */
#define IS_EUC_BYTE(c) ((
0 xA1 <= (c)) && ((c) <=
0 xFE))
#define IS_EUC_JISX0208(h, l) (IS_EUC_BYTE(h) && IS_EUC_BYTE(l))
#define IS_EUC_JISX0201KANA(h, l) (((h) == SS2) && (
0 xA1 <= (l) && (l) <=
0 xDF))
#define IS_EUC_UDC_LOW(h, l) (((
0 xF5 <= (h)) && ((h) <=
0 xFE)) \
&& IS_EUC_BYTE(l))
#define IS_EUC_UDC_HI(h, l) IS_EUC_UDC_LOW(h, l)
/* G3 block */
#define MAP_EUC2SJIS(euc_hi, euc_lo, euc_p, sjis_hi, sjis_lo, sjis_p) { \
if ((euc_hi) &
1 ) { \
(sjis_hi) = (euc_hi) /
2 + ((sjis_p) - (euc_p) /
2 ); \
(sjis_lo) = (euc_lo) - ((euc_lo) >=
0 xE0 ?
0 x60 :
0 x61); \
}
else { \
(sjis_hi) = (euc_hi) /
2 + (((sjis_p) - (euc_p) /
2 ) -
1 ); \
(sjis_lo) = (euc_lo) -
2 ; \
} \
}
while (
0 )
/* SJIS IBM extended characters to EUC map */
static const unsigned char sjisibm2euc_map[][
2 ] = {
{
0 xF3,
0 xF3}, {
0 xF3,
0 xF4}, {
0 xF3,
0 xF5}, {
0 xF3,
0 xF6}, {
0 xF3,
0 xF7},
{
0 xF3,
0 xF8}, {
0 xF3,
0 xF9}, {
0 xF3,
0 xFA}, {
0 xF3,
0 xFB}, {
0 xF3,
0 xFC},
{
0 xF3,
0 xFD}, {
0 xF3,
0 xFE}, {
0 xF4,
0 xA1}, {
0 xF4,
0 xA2}, {
0 xF4,
0 xA3},
{
0 xF4,
0 xA4}, {
0 xF4,
0 xA5}, {
0 xF4,
0 xA6}, {
0 xF4,
0 xA7}, {
0 xF4,
0 xA8},
{
0 xA2,
0 xCC}, {
0 xA2,
0 xC3}, {
0 xF4,
0 xA9}, {
0 xF4,
0 xAA}, {
0 xF4,
0 xAB},
{
0 xF4,
0 xAC}, {
0 xF4,
0 xAD}, {
0 xA2,
0 xE8}, {
0 xD4,
0 xE3}, {
0 xDC,
0 xDF},
{
0 xE4,
0 xE9}, {
0 xE3,
0 xF8}, {
0 xD9,
0 xA1}, {
0 xB1,
0 xBB}, {
0 xF4,
0 xAE},
{
0 xC2,
0 xAD}, {
0 xC3,
0 xFC}, {
0 xE4,
0 xD0}, {
0 xC2,
0 xBF}, {
0 xBC,
0 xF4},
{
0 xB0,
0 xA9}, {
0 xB0,
0 xC8}, {
0 xF4,
0 xAF}, {
0 xB0,
0 xD2}, {
0 xB0,
0 xD4},
{
0 xB0,
0 xE3}, {
0 xB0,
0 xEE}, {
0 xB1,
0 xA7}, {
0 xB1,
0 xA3}, {
0 xB1,
0 xAC},
{
0 xB1,
0 xA9}, {
0 xB1,
0 xBE}, {
0 xB1,
0 xDF}, {
0 xB1,
0 xD8}, {
0 xB1,
0 xC8},
{
0 xB1,
0 xD7}, {
0 xB1,
0 xE3}, {
0 xB1,
0 xF4}, {
0 xB1,
0 xE1}, {
0 xB2,
0 xA3},
{
0 xF4,
0 xB0}, {
0 xB2,
0 xBB}, {
0 xB2,
0 xE6}, {
0 x00,
0 x00}, {
0 xB2,
0 xED},
{
0 xB2,
0 xF5}, {
0 xB2,
0 xFC}, {
0 xF4,
0 xB1}, {
0 xB3,
0 xB5}, {
0 xB3,
0 xD8},
{
0 xB3,
0 xDB}, {
0 xB3,
0 xE5}, {
0 xB3,
0 xEE}, {
0 xB3,
0 xFB}, {
0 xF4,
0 xB2},
{
0 xF4,
0 xB3}, {
0 xB4,
0 xC0}, {
0 xB4,
0 xC7}, {
0 xB4,
0 xD0}, {
0 xB4,
0 xDE},
{
0 xF4,
0 xB4}, {
0 xB5,
0 xAA}, {
0 xF4,
0 xB5}, {
0 xB5,
0 xAF}, {
0 xB5,
0 xC4},
{
0 xB5,
0 xE8}, {
0 xF4,
0 xB6}, {
0 xB7,
0 xC2}, {
0 xB7,
0 xE4}, {
0 xB7,
0 xE8},
{
0 xB7,
0 xE7}, {
0 xF4,
0 xB7}, {
0 xF4,
0 xB8}, {
0 xF4,
0 xB9}, {
0 xB8,
0 xCE},
{
0 xB8,
0 xE1}, {
0 xB8,
0 xF5}, {
0 xB8,
0 xF7}, {
0 xB8,
0 xF8}, {
0 xB8,
0 xFC},
{
0 xB9,
0 xAF}, {
0 xB9,
0 xB7}, {
0 xBA,
0 xBE}, {
0 xBA,
0 xDB}, {
0 xCD,
0 xAA},
{
0 xBA,
0 xE1}, {
0 xF4,
0 xBA}, {
0 xBA,
0 xEB}, {
0 xBB,
0 xB3}, {
0 xBB,
0 xB8},
{
0 xF4,
0 xBB}, {
0 xBB,
0 xCA}, {
0 xF4,
0 xBC}, {
0 xF4,
0 xBD}, {
0 xBB,
0 xD0},
{
0 xBB,
0 xDE}, {
0 xBB,
0 xF4}, {
0 xBB,
0 xF5}, {
0 xBB,
0 xF9}, {
0 xBC,
0 xE4},
{
0 xBC,
0 xED}, {
0 xBC,
0 xFE}, {
0 xF4,
0 xBE}, {
0 xBD,
0 xC2}, {
0 xBD,
0 xE7},
{
0 xF4,
0 xBF}, {
0 xBD,
0 xF0}, {
0 xBE,
0 xB0}, {
0 xBE,
0 xAC}, {
0 xF4,
0 xC0},
{
0 xBE,
0 xB3}, {
0 xBE,
0 xBD}, {
0 xBE,
0 xCD}, {
0 xBE,
0 xC9}, {
0 xBE,
0 xE4},
{
0 xBF,
0 xA8}, {
0 xBF,
0 xC9}, {
0 xC0,
0 xC4}, {
0 xC0,
0 xE4}, {
0 xC0,
0 xF4},
{
0 xC1,
0 xA6}, {
0 xF4,
0 xC1}, {
0 xC1,
0 xF5}, {
0 xC1,
0 xFC}, {
0 xF4,
0 xC2},
{
0 xC1,
0 xF8}, {
0 xC2,
0 xAB}, {
0 xC2,
0 xA1}, {
0 xC2,
0 xA5}, {
0 xF4,
0 xC3},
{
0 xC2,
0 xB8}, {
0 xC2,
0 xBA}, {
0 xF4,
0 xC4}, {
0 xC2,
0 xC4}, {
0 xC2,
0 xD2},
{
0 xC2,
0 xD7}, {
0 xC2,
0 xDB}, {
0 xC2,
0 xDE}, {
0 xC2,
0 xED}, {
0 xC2,
0 xF0},
{
0 xF4,
0 xC5}, {
0 xC3,
0 xA1}, {
0 xC3,
0 xB5}, {
0 xC3,
0 xC9}, {
0 xC3,
0 xB9},
{
0 xF4,
0 xC6}, {
0 xC3,
0 xD8}, {
0 xC3,
0 xFE}, {
0 xF4,
0 xC7}, {
0 xC4,
0 xCC},
{
0 xF4,
0 xC8}, {
0 xC4,
0 xD9}, {
0 xC4,
0 xEA}, {
0 xC4,
0 xFD}, {
0 xF4,
0 xC9},
{
0 xC5,
0 xA7}, {
0 xC5,
0 xB5}, {
0 xC5,
0 xB6}, {
0 xF4,
0 xCA}, {
0 xC5,
0 xD5},
{
0 xC6,
0 xB8}, {
0 xC6,
0 xD7}, {
0 xC6,
0 xE0}, {
0 xC6,
0 xEA}, {
0 xC6,
0 xE3},
{
0 xC7,
0 xA1}, {
0 xC7,
0 xAB}, {
0 xC7,
0 xC7}, {
0 xC7,
0 xC3}, {
0 xC7,
0 xCB},
{
0 xC7,
0 xCF}, {
0 xC7,
0 xD9}, {
0 xF4,
0 xCB}, {
0 xF4,
0 xCC}, {
0 xC7,
0 xE6},
{
0 xC7,
0 xEE}, {
0 xC7,
0 xFC}, {
0 xC7,
0 xEB}, {
0 xC7,
0 xF0}, {
0 xC8,
0 xB1},
{
0 xC8,
0 xE5}, {
0 xC8,
0 xF8}, {
0 xC9,
0 xA6}, {
0 xC9,
0 xAB}, {
0 xC9,
0 xAD},
{
0 xF4,
0 xCD}, {
0 xC9,
0 xCA}, {
0 xC9,
0 xD3}, {
0 xC9,
0 xE9}, {
0 xC9,
0 xE3},
{
0 xC9,
0 xFC}, {
0 xC9,
0 xF4}, {
0 xC9,
0 xF5}, {
0 xF4,
0 xCE}, {
0 xCA,
0 xB3},
{
0 xCA,
0 xBD}, {
0 xCA,
0 xEF}, {
0 xCA,
0 xF1}, {
0 xCB,
0 xAE}, {
0 xF4,
0 xCF},
{
0 xCB,
0 xCA}, {
0 xCB,
0 xE6}, {
0 xCB,
0 xEA}, {
0 xCB,
0 xF0}, {
0 xCB,
0 xF4},
{
0 xCB,
0 xEE}, {
0 xCC,
0 xA5}, {
0 xCB,
0 xF9}, {
0 xCC,
0 xAB}, {
0 xCC,
0 xAE},
{
0 xCC,
0 xAD}, {
0 xCC,
0 xB2}, {
0 xCC,
0 xC2}, {
0 xCC,
0 xD0}, {
0 xCC,
0 xD9},
{
0 xF4,
0 xD0}, {
0 xCD,
0 xBB}, {
0 xF4,
0 xD1}, {
0 xCE,
0 xBB}, {
0 xF4,
0 xD2},
{
0 xCE,
0 xBA}, {
0 xCE,
0 xC3}, {
0 xF4,
0 xD3}, {
0 xCE,
0 xF2}, {
0 xB3,
0 xDD},
{
0 xCF,
0 xD5}, {
0 xCF,
0 xE2}, {
0 xCF,
0 xE9}, {
0 xCF,
0 xED}, {
0 xF4,
0 xD4},
{
0 xF4,
0 xD5}, {
0 xF4,
0 xD6}, {
0 x00,
0 x00}, {
0 xF4,
0 xD7}, {
0 xD0,
0 xE5},
{
0 xF4,
0 xD8}, {
0 xD0,
0 xE9}, {
0 xD1,
0 xE8}, {
0 xF4,
0 xD9}, {
0 xF4,
0 xDA},
{
0 xD1,
0 xEC}, {
0 xD2,
0 xBB}, {
0 xF4,
0 xDB}, {
0 xD3,
0 xE1}, {
0 xD3,
0 xE8},
{
0 xD4,
0 xA7}, {
0 xF4,
0 xDC}, {
0 xF4,
0 xDD}, {
0 xD4,
0 xD4}, {
0 xD4,
0 xF2},
{
0 xD5,
0 xAE}, {
0 xF4,
0 xDE}, {
0 xD7,
0 xDE}, {
0 xF4,
0 xDF}, {
0 xD8,
0 xA2},
{
0 xD8,
0 xB7}, {
0 xD8,
0 xC1}, {
0 xD8,
0 xD1}, {
0 xD8,
0 xF4}, {
0 xD9,
0 xC6},
{
0 xD9,
0 xC8}, {
0 xD9,
0 xD1}, {
0 xF4,
0 xE0}, {
0 xF4,
0 xE1}, {
0 xF4,
0 xE2},
{
0 xF4,
0 xE3}, {
0 xF4,
0 xE4}, {
0 xDC,
0 xD3}, {
0 xDD,
0 xC8}, {
0 xDD,
0 xD4},
{
0 xDD,
0 xEA}, {
0 xDD,
0 xFA}, {
0 xDE,
0 xA4}, {
0 xDE,
0 xB0}, {
0 xF4,
0 xE5},
{
0 xDE,
0 xB5}, {
0 xDE,
0 xCB}, {
0 xF4,
0 xE6}, {
0 xDF,
0 xB9}, {
0 xF4,
0 xE7},
{
0 xDF,
0 xC3}, {
0 xF4,
0 xE8}, {
0 xF4,
0 xE9}, {
0 xE0,
0 xD9}, {
0 xF4,
0 xEA},
{
0 xF4,
0 xEB}, {
0 xE1,
0 xE2}, {
0 xF4,
0 xEC}, {
0 xF4,
0 xED}, {
0 xF4,
0 xEE},
{
0 xE2,
0 xC7}, {
0 xE3,
0 xA8}, {
0 xE3,
0 xA6}, {
0 xE3,
0 xA9}, {
0 xE3,
0 xAF},
{
0 xE3,
0 xB0}, {
0 xE3,
0 xAA}, {
0 xE3,
0 xAB}, {
0 xE3,
0 xBC}, {
0 xE3,
0 xC1},
{
0 xE3,
0 xBF}, {
0 xE3,
0 xD5}, {
0 xE3,
0 xD8}, {
0 xE3,
0 xD6}, {
0 xE3,
0 xDF},
{
0 xE3,
0 xE3}, {
0 xE3,
0 xE1}, {
0 xE3,
0 xD4}, {
0 xE3,
0 xE9}, {
0 xE4,
0 xA6},
{
0 xE3,
0 xF1}, {
0 xE3,
0 xF2}, {
0 xE4,
0 xCB}, {
0 xE4,
0 xC1}, {
0 xE4,
0 xC3},
{
0 xE4,
0 xBE}, {
0 xF4,
0 xEF}, {
0 xE4,
0 xC0}, {
0 xE4,
0 xC7}, {
0 xE4,
0 xBF},
{
0 xE4,
0 xE0}, {
0 xE4,
0 xDE}, {
0 xE4,
0 xD1}, {
0 xF4,
0 xF0}, {
0 xE4,
0 xDC},
{
0 xE4,
0 xD2}, {
0 xE4,
0 xDB}, {
0 xE4,
0 xD4}, {
0 xE4,
0 xFA}, {
0 xE4,
0 xEF},
{
0 xE5,
0 xB3}, {
0 xE5,
0 xBF}, {
0 xE5,
0 xC9}, {
0 xE5,
0 xD0}, {
0 xE5,
0 xE2},
{
0 xE5,
0 xEA}, {
0 xE5,
0 xEB}, {
0 xF4,
0 xF1}, {
0 xF4,
0 xF2}, {
0 xF4,
0 xF3},
{
0 xE6,
0 xE8}, {
0 xE6,
0 xEF}, {
0 xE7,
0 xAC}, {
0 xF4,
0 xF4}, {
0 xE7,
0 xAE},
{
0 xF4,
0 xF5}, {
0 xE7,
0 xB1}, {
0 xF4,
0 xF6}, {
0 xE7,
0 xB2}, {
0 xE8,
0 xB1},
{
0 xE8,
0 xB6}, {
0 xF4,
0 xF7}, {
0 xF4,
0 xF8}, {
0 xE8,
0 xDD}, {
0 xF4,
0 xF9},
{
0 xF4,
0 xFA}, {
0 xE9,
0 xD1}, {
0 xF4,
0 xFB}, {
0 xE9,
0 xED}, {
0 xEA,
0 xCD},
{
0 xF4,
0 xFC}, {
0 xEA,
0 xDB}, {
0 xEA,
0 xE6}, {
0 xEA,
0 xEA}, {
0 xEB,
0 xA5},
{
0 xEB,
0 xFB}, {
0 xEB,
0 xFA}, {
0 xF4,
0 xFD}, {
0 xEC,
0 xD6}, {
0 xF4,
0 xFE},
};
#define IS_EUC_IBM2JISX0208(h, l) \
(((h) ==
0 xA2 && (l) ==
0 xCC) || ((h) ==
0 xA2 && (l) ==
0 xE8))
/* EUC to SJIS IBM extended characters map (G3 JIS X 0212 block) */
static struct {
unsigned short euc;
unsigned char sjis[
2 ];
} euc2sjisibm_jisx0212_map[] = {
{
0 xA2C3, {
0 xFA,
0 x55}}, {
0 xB0A9, {
0 xFA,
0 x68}}, {
0 xB0C8, {
0 xFA,
0 x69}},
{
0 xB0D2, {
0 xFA,
0 x6B}}, {
0 xB0D4, {
0 xFA,
0 x6C}}, {
0 xB0E3, {
0 xFA,
0 x6D}},
{
0 xB0EE, {
0 xFA,
0 x6E}}, {
0 xB1A3, {
0 xFA,
0 x70}}, {
0 xB1A7, {
0 xFA,
0 x6F}},
{
0 xB1A9, {
0 xFA,
0 x72}}, {
0 xB1AC, {
0 xFA,
0 x71}}, {
0 xB1BB, {
0 xFA,
0 x61}},
{
0 xB1BE, {
0 xFA,
0 x73}}, {
0 xB1C8, {
0 xFA,
0 x76}}, {
0 xB1D7, {
0 xFA,
0 x77}},
{
0 xB1D8, {
0 xFA,
0 x75}}, {
0 xB1DF, {
0 xFA,
0 x74}}, {
0 xB1E1, {
0 xFA,
0 x7A}},
{
0 xB1E3, {
0 xFA,
0 x78}}, {
0 xB1F4, {
0 xFA,
0 x79}}, {
0 xB2A3, {
0 xFA,
0 x7B}},
{
0 xB2BB, {
0 xFA,
0 x7D}}, {
0 xB2E6, {
0 xFA,
0 x7E}}, {
0 xB2ED, {
0 xFA,
0 x80}},
{
0 xB2F5, {
0 xFA,
0 x81}}, {
0 xB2FC, {
0 xFA,
0 x82}}, {
0 xB3B5, {
0 xFA,
0 x84}},
{
0 xB3D8, {
0 xFA,
0 x85}}, {
0 xB3DB, {
0 xFA,
0 x86}}, {
0 xB3DD, {
0 xFB,
0 x77}},
{
0 xB3E5, {
0 xFA,
0 x87}}, {
0 xB3EE, {
0 xFA,
0 x88}}, {
0 xB3FB, {
0 xFA,
0 x89}},
{
0 xB4C0, {
0 xFA,
0 x8C}}, {
0 xB4C7, {
0 xFA,
0 x8D}}, {
0 xB4D0, {
0 xFA,
0 x8E}},
{
0 xB4DE, {
0 xFA,
0 x8F}}, {
0 xB5AA, {
0 xFA,
0 x91}}, {
0 xB5AF, {
0 xFA,
0 x93}},
{
0 xB5C4, {
0 xFA,
0 x94}}, {
0 xB5E8, {
0 xFA,
0 x95}}, {
0 xB7C2, {
0 xFA,
0 x97}},
{
0 xB7E4, {
0 xFA,
0 x98}}, {
0 xB7E7, {
0 xFA,
0 x9A}}, {
0 xB7E8, {
0 xFA,
0 x99}},
{
0 xB8CE, {
0 xFA,
0 x9E}}, {
0 xB8E1, {
0 xFA,
0 x9F}}, {
0 xB8F5, {
0 xFA,
0 xA0}},
{
0 xB8F7, {
0 xFA,
0 xA1}}, {
0 xB8F8, {
0 xFA,
0 xA2}}, {
0 xB8FC, {
0 xFA,
0 xA3}},
{
0 xB9AF, {
0 xFA,
0 xA4}}, {
0 xB9B7, {
0 xFA,
0 xA5}}, {
0 xBABE, {
0 xFA,
0 xA6}},
{
0 xBADB, {
0 xFA,
0 xA7}}, {
0 xBAE1, {
0 xFA,
0 xA9}}, {
0 xBAEB, {
0 xFA,
0 xAB}},
{
0 xBBB3, {
0 xFA,
0 xAC}}, {
0 xBBB8, {
0 xFA,
0 xAD}}, {
0 xBBCA, {
0 xFA,
0 xAF}},
{
0 xBBD0, {
0 xFA,
0 xB2}}, {
0 xBBDE, {
0 xFA,
0 xB3}}, {
0 xBBF4, {
0 xFA,
0 xB4}},
{
0 xBBF5, {
0 xFA,
0 xB5}}, {
0 xBBF9, {
0 xFA,
0 xB6}}, {
0 xBCE4, {
0 xFA,
0 xB7}},
{
0 xBCED, {
0 xFA,
0 xB8}}, {
0 xBCF4, {
0 xFA,
0 x67}}, {
0 xBCFE, {
0 xFA,
0 xB9}},
{
0 xBDC2, {
0 xFA,
0 xBB}}, {
0 xBDE7, {
0 xFA,
0 xBC}}, {
0 xBDF0, {
0 xFA,
0 xBE}},
{
0 xBEAC, {
0 xFA,
0 xC0}}, {
0 xBEB0, {
0 xFA,
0 xBF}}, {
0 xBEB3, {
0 xFA,
0 xC2}},
{
0 xBEBD, {
0 xFA,
0 xC3}}, {
0 xBEC9, {
0 xFA,
0 xC5}}, {
0 xBECD, {
0 xFA,
0 xC4}},
{
0 xBEE4, {
0 xFA,
0 xC6}}, {
0 xBFA8, {
0 xFA,
0 xC7}}, {
0 xBFC9, {
0 xFA,
0 xC8}},
{
0 xC0C4, {
0 xFA,
0 xC9}}, {
0 xC0E4, {
0 xFA,
0 xCA}}, {
0 xC0F4, {
0 xFA,
0 xCB}},
{
0 xC1A6, {
0 xFA,
0 xCC}}, {
0 xC1F5, {
0 xFA,
0 xCE}}, {
0 xC1F8, {
0 xFA,
0 xD1}},
{
0 xC1FC, {
0 xFA,
0 xCF}}, {
0 xC2A1, {
0 xFA,
0 xD3}}, {
0 xC2A5, {
0 xFA,
0 xD4}},
{
0 xC2AB, {
0 xFA,
0 xD2}}, {
0 xC2AD, {
0 xFA,
0 x63}}, {
0 xC2B8, {
0 xFA,
0 xD6}},
{
0 xC2BA, {
0 xFA,
0 xD7}}, {
0 xC2BF, {
0 xFA,
0 x66}}, {
0 xC2C4, {
0 xFA,
0 xD9}},
{
0 xC2D2, {
0 xFA,
0 xDA}}, {
0 xC2D7, {
0 xFA,
0 xDB}}, {
0 xC2DB, {
0 xFA,
0 xDC}},
{
0 xC2DE, {
0 xFA,
0 xDD}}, {
0 xC2ED, {
0 xFA,
0 xDE}}, {
0 xC2F0, {
0 xFA,
0 xDF}},
{
0 xC3A1, {
0 xFA,
0 xE1}}, {
0 xC3B5, {
0 xFA,
0 xE2}}, {
0 xC3B9, {
0 xFA,
0 xE4}},
{
0 xC3C9, {
0 xFA,
0 xE3}}, {
0 xC3D8, {
0 xFA,
0 xE6}}, {
0 xC3FC, {
0 xFA,
0 x64}},
{
0 xC3FE, {
0 xFA,
0 xE7}}, {
0 xC4CC, {
0 xFA,
0 xE9}}, {
0 xC4D9, {
0 xFA,
0 xEB}},
{
0 xC4EA, {
0 xFA,
0 xEC}}, {
0 xC4FD, {
0 xFA,
0 xED}}, {
0 xC5A7, {
0 xFA,
0 xEF}},
{
0 xC5B5, {
0 xFA,
0 xF0}}, {
0 xC5B6, {
0 xFA,
0 xF1}}, {
0 xC5D5, {
0 xFA,
0 xF3}},
{
0 xC6B8, {
0 xFA,
0 xF4}}, {
0 xC6D7, {
0 xFA,
0 xF5}}, {
0 xC6E0, {
0 xFA,
0 xF6}},
{
0 xC6E3, {
0 xFA,
0 xF8}}, {
0 xC6EA, {
0 xFA,
0 xF7}}, {
0 xC7A1, {
0 xFA,
0 xF9}},
{
0 xC7AB, {
0 xFA,
0 xFA}}, {
0 xC7C3, {
0 xFA,
0 xFC}}, {
0 xC7C7, {
0 xFA,
0 xFB}},
{
0 xC7CB, {
0 xFB,
0 x40}}, {
0 xC7CF, {
0 xFB,
0 x41}}, {
0 xC7D9, {
0 xFB,
0 x42}},
{
0 xC7E6, {
0 xFB,
0 x45}}, {
0 xC7EB, {
0 xFB,
0 x48}}, {
0 xC7EE, {
0 xFB,
0 x46}},
{
0 xC7F0, {
0 xFB,
0 x49}}, {
0 xC7FC, {
0 xFB,
0 x47}}, {
0 xC8B1, {
0 xFB,
0 x4A}},
{
0 xC8E5, {
0 xFB,
0 x4B}}, {
0 xC8F8, {
0 xFB,
0 x4C}}, {
0 xC9A6, {
0 xFB,
0 x4D}},
{
0 xC9AB, {
0 xFB,
0 x4E}}, {
0 xC9AD, {
0 xFB,
0 x4F}}, {
0 xC9CA, {
0 xFB,
0 x51}},
{
0 xC9D3, {
0 xFB,
0 x52}}, {
0 xC9E3, {
0 xFB,
0 x54}}, {
0 xC9E9, {
0 xFB,
0 x53}},
{
0 xC9F4, {
0 xFB,
0 x56}}, {
0 xC9F5, {
0 xFB,
0 x57}}, {
0 xC9FC, {
0 xFB,
0 x55}},
{
0 xCAB3, {
0 xFB,
0 x59}}, {
0 xCABD, {
0 xFB,
0 x5A}}, {
0 xCAEF, {
0 xFB,
0 x5B}},
{
0 xCAF1, {
0 xFB,
0 x5C}}, {
0 xCBAE, {
0 xFB,
0 x5D}}, {
0 xCBCA, {
0 xFB,
0 x5F}},
{
0 xCBE6, {
0 xFB,
0 x60}}, {
0 xCBEA, {
0 xFB,
0 x61}}, {
0 xCBEE, {
0 xFB,
0 x64}},
{
0 xCBF0, {
0 xFB,
0 x62}}, {
0 xCBF4, {
0 xFB,
0 x63}}, {
0 xCBF9, {
0 xFB,
0 x66}},
{
0 xCCA5, {
0 xFB,
0 x65}}, {
0 xCCAB, {
0 xFB,
0 x67}}, {
0 xCCAD, {
0 xFB,
0 x69}},
{
0 xCCAE, {
0 xFB,
0 x68}}, {
0 xCCB2, {
0 xFB,
0 x6A}}, {
0 xCCC2, {
0 xFB,
0 x6B}},
{
0 xCCD0, {
0 xFB,
0 x6C}}, {
0 xCCD9, {
0 xFB,
0 x6D}}, {
0 xCDAA, {
0 xFA,
0 xA8}},
{
0 xCDBB, {
0 xFB,
0 x6F}}, {
0 xCEBA, {
0 xFB,
0 x73}}, {
0 xCEBB, {
0 xFB,
0 x71}},
{
0 xCEC3, {
0 xFB,
0 x74}}, {
0 xCEF2, {
0 xFB,
0 x76}}, {
0 xCFD5, {
0 xFB,
0 x78}},
{
0 xCFE2, {
0 xFB,
0 x79}}, {
0 xCFE9, {
0 xFB,
0 x7A}}, {
0 xCFED, {
0 xFB,
0 x7B}},
{
0 xD0E5, {
0 xFB,
0 x81}}, {
0 xD0E9, {
0 xFB,
0 x83}}, {
0 xD1E8, {
0 xFB,
0 x84}},
{
0 xD1EC, {
0 xFB,
0 x87}}, {
0 xD2BB, {
0 xFB,
0 x88}}, {
0 xD3E1, {
0 xFB,
0 x8A}},
{
0 xD3E8, {
0 xFB,
0 x8B}}, {
0 xD4A7, {
0 xFB,
0 x8C}}, {
0 xD4D4, {
0 xFB,
0 x8F}},
{
0 xD4E3, {
0 xFA,
0 x5C}}, {
0 xD4F2, {
0 xFB,
0 x90}}, {
0 xD5AE, {
0 xFB,
0 x91}},
{
0 xD7DE, {
0 xFB,
0 x93}}, {
0 xD8A2, {
0 xFB,
0 x95}}, {
0 xD8B7, {
0 xFB,
0 x96}},
{
0 xD8C1, {
0 xFB,
0 x97}}, {
0 xD8D1, {
0 xFB,
0 x98}}, {
0 xD8F4, {
0 xFB,
0 x99}},
{
0 xD9A1, {
0 xFA,
0 x60}}, {
0 xD9C6, {
0 xFB,
0 x9A}}, {
0 xD9C8, {
0 xFB,
0 x9B}},
{
0 xD9D1, {
0 xFB,
0 x9C}}, {
0 xDCD3, {
0 xFB,
0 xA2}}, {
0 xDCDF, {
0 xFA,
0 x5D}},
{
0 xDDC8, {
0 xFB,
0 xA3}}, {
0 xDDD4, {
0 xFB,
0 xA4}}, {
0 xDDEA, {
0 xFB,
0 xA5}},
{
0 xDDFA, {
0 xFB,
0 xA6}}, {
0 xDEA4, {
0 xFB,
0 xA7}}, {
0 xDEB0, {
0 xFB,
0 xA8}},
{
0 xDEB5, {
0 xFB,
0 xAA}}, {
0 xDECB, {
0 xFB,
0 xAB}}, {
0 xDFB9, {
0 xFB,
0 xAD}},
{
0 xDFC3, {
0 xFB,
0 xAF}}, {
0 xE0D9, {
0 xFB,
0 xB2}}, {
0 xE1E2, {
0 xFB,
0 xB5}},
{
0 xE2C7, {
0 xFB,
0 xB9}}, {
0 xE3A6, {
0 xFB,
0 xBB}}, {
0 xE3A8, {
0 xFB,
0 xBA}},
{
0 xE3A9, {
0 xFB,
0 xBC}}, {
0 xE3AA, {
0 xFB,
0 xBF}}, {
0 xE3AB, {
0 xFB,
0 xC0}},
{
0 xE3AF, {
0 xFB,
0 xBD}}, {
0 xE3B0, {
0 xFB,
0 xBE}}, {
0 xE3BC, {
0 xFB,
0 xC1}},
{
0 xE3BF, {
0 xFB,
0 xC3}}, {
0 xE3C1, {
0 xFB,
0 xC2}}, {
0 xE3D4, {
0 xFB,
0 xCA}},
{
0 xE3D5, {
0 xFB,
0 xC4}}, {
0 xE3D6, {
0 xFB,
0 xC6}}, {
0 xE3D8, {
0 xFB,
0 xC5}},
{
0 xE3DF, {
0 xFB,
0 xC7}}, {
0 xE3E1, {
0 xFB,
0 xC9}}, {
0 xE3E3, {
0 xFB,
0 xC8}},
{
0 xE3E9, {
0 xFB,
0 xCB}}, {
0 xE3F1, {
0 xFB,
0 xCD}}, {
0 xE3F2, {
0 xFB,
0 xCE}},
{
0 xE3F8, {
0 xFA,
0 x5F}}, {
0 xE4A6, {
0 xFB,
0 xCC}}, {
0 xE4BE, {
0 xFB,
0 xD2}},
{
0 xE4BF, {
0 xFB,
0 xD6}}, {
0 xE4C0, {
0 xFB,
0 xD4}}, {
0 xE4C1, {
0 xFB,
0 xD0}},
{
0 xE4C3, {
0 xFB,
0 xD1}}, {
0 xE4C7, {
0 xFB,
0 xD5}}, {
0 xE4CB, {
0 xFB,
0 xCF}},
{
0 xE4D0, {
0 xFA,
0 x65}}, {
0 xE4D1, {
0 xFB,
0 xD9}}, {
0 xE4D2, {
0 xFB,
0 xDC}},
{
0 xE4D4, {
0 xFB,
0 xDE}}, {
0 xE4DB, {
0 xFB,
0 xDD}}, {
0 xE4DC, {
0 xFB,
0 xDB}},
{
0 xE4DE, {
0 xFB,
0 xD8}}, {
0 xE4E0, {
0 xFB,
0 xD7}}, {
0 xE4E9, {
0 xFA,
0 x5E}},
{
0 xE4EF, {
0 xFB,
0 xE0}}, {
0 xE4FA, {
0 xFB,
0 xDF}}, {
0 xE5B3, {
0 xFB,
0 xE1}},
{
0 xE5BF, {
0 xFB,
0 xE2}}, {
0 xE5C9, {
0 xFB,
0 xE3}}, {
0 xE5D0, {
0 xFB,
0 xE4}},
{
0 xE5E2, {
0 xFB,
0 xE5}}, {
0 xE5EA, {
0 xFB,
0 xE6}}, {
0 xE5EB, {
0 xFB,
0 xE7}},
{
0 xE6E8, {
0 xFB,
0 xEB}}, {
0 xE6EF, {
0 xFB,
0 xEC}}, {
0 xE7AC, {
0 xFB,
0 xED}},
{
0 xE7AE, {
0 xFB,
0 xEF}}, {
0 xE7B1, {
0 xFB,
0 xF1}}, {
0 xE7B2, {
0 xFB,
0 xF3}},
{
0 xE8B1, {
0 xFB,
0 xF4}}, {
0 xE8B6, {
0 xFB,
0 xF5}}, {
0 xE8DD, {
0 xFB,
0 xF8}},
{
0 xE9D1, {
0 xFB,
0 xFB}}, {
0 xE9ED, {
0 xFC,
0 x40}}, {
0 xEACD, {
0 xFC,
0 x41}},
{
0 xEADB, {
0 xFC,
0 x43}}, {
0 xEAE6, {
0 xFC,
0 x44}}, {
0 xEAEA, {
0 xFC,
0 x45}},
{
0 xEBA5, {
0 xFC,
0 x46}}, {
0 xEBFA, {
0 xFC,
0 x48}}, {
0 xEBFB, {
0 xFC,
0 x47}},
{
0 xECD6, {
0 xFC,
0 x4A}},
};
/* EUC to SJIS IBM extended characters map (G3 Upper block) */
static const unsigned char euc2sjisibm_g3upper_map[][
2 ] = {
{
0 xFA,
0 x40}, {
0 xFA,
0 x41}, {
0 xFA,
0 x42}, {
0 xFA,
0 x43}, {
0 xFA,
0 x44},
{
0 xFA,
0 x45}, {
0 xFA,
0 x46}, {
0 xFA,
0 x47}, {
0 xFA,
0 x48}, {
0 xFA,
0 x49},
{
0 xFA,
0 x4A}, {
0 xFA,
0 x4B}, {
0 xFA,
0 x4C}, {
0 xFA,
0 x4D}, {
0 xFA,
0 x4E},
{
0 xFA,
0 x4F}, {
0 xFA,
0 x50}, {
0 xFA,
0 x51}, {
0 xFA,
0 x52}, {
0 xFA,
0 x53},
{
0 xFA,
0 x56}, {
0 xFA,
0 x57}, {
0 xFA,
0 x58}, {
0 xFA,
0 x59}, {
0 xFA,
0 x5A},
{
0 xFA,
0 x62}, {
0 xFA,
0 x6A}, {
0 xFA,
0 x7C}, {
0 xFA,
0 x83}, {
0 xFA,
0 x8A},
{
0 xFA,
0 x8B}, {
0 xFA,
0 x90}, {
0 xFA,
0 x92}, {
0 xFA,
0 x96}, {
0 xFA,
0 x9B},
{
0 xFA,
0 x9C}, {
0 xFA,
0 x9D}, {
0 xFA,
0 xAA}, {
0 xFA,
0 xAE}, {
0 xFA,
0 xB0},
{
0 xFA,
0 xB1}, {
0 xFA,
0 xBA}, {
0 xFA,
0 xBD}, {
0 xFA,
0 xC1}, {
0 xFA,
0 xCD},
{
0 xFA,
0 xD0}, {
0 xFA,
0 xD5}, {
0 xFA,
0 xD8}, {
0 xFA,
0 xE0}, {
0 xFA,
0 xE5},
{
0 xFA,
0 xE8}, {
0 xFA,
0 xEA}, {
0 xFA,
0 xEE}, {
0 xFA,
0 xF2}, {
0 xFB,
0 x43},
{
0 xFB,
0 x44}, {
0 xFB,
0 x50}, {
0 xFB,
0 x58}, {
0 xFB,
0 x5E}, {
0 xFB,
0 x6E},
{
0 xFB,
0 x70}, {
0 xFB,
0 x72}, {
0 xFB,
0 x75}, {
0 xFB,
0 x7C}, {
0 xFB,
0 x7D},
{
0 xFB,
0 x7E}, {
0 xFB,
0 x80}, {
0 xFB,
0 x82}, {
0 xFB,
0 x85}, {
0 xFB,
0 x86},
{
0 xFB,
0 x89}, {
0 xFB,
0 x8D}, {
0 xFB,
0 x8E}, {
0 xFB,
0 x92}, {
0 xFB,
0 x94},
{
0 xFB,
0 x9D}, {
0 xFB,
0 x9E}, {
0 xFB,
0 x9F}, {
0 xFB,
0 xA0}, {
0 xFB,
0 xA1},
{
0 xFB,
0 xA9}, {
0 xFB,
0 xAC}, {
0 xFB,
0 xAE}, {
0 xFB,
0 xB0}, {
0 xFB,
0 xB1},
{
0 xFB,
0 xB3}, {
0 xFB,
0 xB4}, {
0 xFB,
0 xB6}, {
0 xFB,
0 xB7}, {
0 xFB,
0 xB8},
{
0 xFB,
0 xD3}, {
0 xFB,
0 xDA}, {
0 xFB,
0 xE8}, {
0 xFB,
0 xE9}, {
0 xFB,
0 xEA},
{
0 xFB,
0 xEE}, {
0 xFB,
0 xF0}, {
0 xFB,
0 xF2}, {
0 xFB,
0 xF6}, {
0 xFB,
0 xF7},
{
0 xFB,
0 xF9}, {
0 xFB,
0 xFA}, {
0 xFB,
0 xFC}, {
0 xFC,
0 x42}, {
0 xFC,
0 x49},
{
0 xFC,
0 x4B},
};
static inline int sjisibm2euc(
unsigned char *euc,
const unsigned char sjis_hi,
const unsigned char sjis_lo);
static inline int euc2sjisibm_jisx0212(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo);
static inline int euc2sjisibm_g3upper(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo);
static inline int euc2sjisibm(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo);
static inline int sjisnec2sjisibm(
unsigned char *sjisibm,
const unsigned char sjisnec_hi,
const unsigned char sjisnec_lo);
/* SJIS IBM extended characters to EUC */
static inline int sjisibm2euc(
unsigned char *euc,
const unsigned char sjis_hi,
const unsigned char sjis_lo)
{
int index;
index = ((sjis_hi -
0 xFA) * (
0 xFD -
0 x40)) + (sjis_lo -
0 x40);
if (IS_EUC_IBM2JISX0208(sjisibm2euc_map[index][
0 ],
sjisibm2euc_map[index][
1 ])) {
euc[
0 ] = sjisibm2euc_map[index][
0 ];
euc[
1 ] = sjisibm2euc_map[index][
1 ];
return 2 ;
}
else {
euc[
0 ] = SS3;
euc[
1 ] = sjisibm2euc_map[index][
0 ];
euc[
2 ] = sjisibm2euc_map[index][
1 ];
return 3 ;
}
}
/* EUC to SJIS IBM extended characters (G3 JIS X 0212 block) */
static inline int euc2sjisibm_jisx0212(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo)
{
int index, min_index, max_index;
unsigned short euc;
min_index =
0 ;
max_index = ARRAY_SIZE(euc2sjisibm_jisx0212_map) -
1 ;
euc = (euc_hi <<
8 ) | euc_lo;
while (min_index <= max_index) {
index = (min_index + max_index) /
2 ;
if (euc < euc2sjisibm_jisx0212_map[index].euc)
max_index = index -
1 ;
else
min_index = index +
1 ;
if (euc == euc2sjisibm_jisx0212_map[index].euc) {
sjis[
0 ] = euc2sjisibm_jisx0212_map[index].sjis[
0 ];
sjis[
1 ] = euc2sjisibm_jisx0212_map[index].sjis[
1 ];
return 3 ;
}
}
return 0 ;
}
/* EUC to SJIS IBM extended characters (G3 Upper block) */
static inline int euc2sjisibm_g3upper(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo)
{
int index;
if (euc_hi ==
0 xF3)
index = ((euc_hi <<
8 ) | euc_lo) -
0 xF3F3;
else
index = ((euc_hi <<
8 ) | euc_lo) -
0 xF4A1 +
12 ;
if ((index <
0 ) || (index >= ARRAY_SIZE(euc2sjisibm_g3upper_map)))
return 0 ;
sjis[
0 ] = euc2sjisibm_g3upper_map[index][
0 ];
sjis[
1 ] = euc2sjisibm_g3upper_map[index][
1 ];
return 3 ;
}
/* EUC to SJIS IBM extended characters (G3 block) */
static inline int euc2sjisibm(
unsigned char *sjis,
const unsigned char euc_hi,
const unsigned char euc_lo)
{
int n;
#if 0
if ((euc_hi ==
0 xA2) && (euc_lo ==
0 xCC)) {
sjis[
0 ] =
0 xFA;
sjis[
1 ] =
0 x54;
return 2 ;
}
else if ((euc_hi ==
0 xA2) && (euc_lo ==
0 xE8)) {
sjis[
0 ] =
0 xFA;
sjis[
1 ] =
0 x5B;
return 2 ;
}
#endif
if ((n = euc2sjisibm_g3upper(sjis, euc_hi, euc_lo))) {
return n;
}
else if ((n = euc2sjisibm_jisx0212(sjis, euc_hi, euc_lo))) {
return n;
}
return 0 ;
}
/* NEC/IBM extended characters to IBM extended characters */
static inline int sjisnec2sjisibm(
unsigned char *sjisibm,
const unsigned char sjisnec_hi,
const unsigned char sjisnec_lo)
{
int count;
if (! IS_SJIS_NECIBM(sjisnec_hi, sjisnec_lo))
return 0 ;
if ((sjisnec_hi ==
0 xEE) && (sjisnec_lo ==
0 xF9)) {
sjisibm[
0 ] =
0 x81;
sjisibm[
1 ] =
0 xCA;
return 2 ;
}
if ((sjisnec_hi ==
0 xEE) && (sjisnec_lo >=
0 xEF)) {
count = (sjisnec_hi <<
8 | sjisnec_lo)
- (sjisnec_lo <=
0 xF9 ?
0 xEEEF : (
0 xEEEF -
10 ));
}
else {
count = (sjisnec_hi -
0 xED) * (
0 xFC -
0 x40)
+ (sjisnec_lo -
0 x40) + (
0 x5C -
0 x40);
if (sjisnec_lo >=
0 x7F)
count--;
}
sjisibm[
0 ] =
0 xFA + (count / (
0 xFC -
0 x40));
sjisibm[
1 ] =
0 x40 + (count % (
0 xFC -
0 x40));
if (sjisibm[
1 ] >=
0 x7F)
sjisibm[
1 ]++;
return 2 ;
}
static int uni2char(
const wchar_t uni,
unsigned char *out,
int boundlen)
{
int n;
if (!p_nls)
return -EINVAL;
if ((n = p_nls->uni2char(uni, out, boundlen)) <
0 )
return n;
/* translate SJIS into EUC-JP */
if (n ==
1 ) {
if (IS_SJIS_JISX0201KANA(out[
0 ])) {
/* JIS X 0201 KANA */
if (boundlen <
2 )
return -ENAMETOOLONG;
out[
1 ] = out[
0 ];
out[
0 ] = SS2;
return 2 ;
}
}
else if (n ==
2 ) {
/* NEC/IBM extended characters to IBM extended characters */
sjisnec2sjisibm(out, out[
0 ], out[
1 ]);
if (IS_SJIS_UDC_LOW(out[
0 ], out[
1 ])) {
/* User defined characters half low */
MAP_SJIS2EUC(out[
0 ], out[
1 ],
0 xF0, out[
0 ], out[
1 ],
0 xF5);
}
else if (IS_SJIS_UDC_HI(out[
0 ], out[
1 ])) {
/* User defined characters half high */
unsigned char ch, cl;
if (boundlen <
3 )
return -ENAMETOOLONG;
n =
3 ; ch = out[
0 ]; cl = out[
1 ];
out[
0 ] = SS3;
MAP_SJIS2EUC(ch, cl,
0 xF5, out[
1 ], out[
2 ],
0 xF5);
}
else if (IS_SJIS_IBM(out[
0 ], out[
1 ])) {
/* IBM extended characters */
unsigned char euc[
3 ], i;
n = sjisibm2euc(euc, out[
0 ], out[
1 ]);
if (boundlen < n)
return -ENAMETOOLONG;
for (i =
0 ; i < n; i++)
out[i] = euc[i];
}
else if (IS_SJIS_JISX0208(out[
0 ], out[
1 ])) {
/* JIS X 0208 (include NEC special characters) */
out[
0 ] = (out[
0 ]^
0 xA0)*
2 +
0 x5F;
if (out[
1 ] >
0 x9E)
out[
0 ]++;
if (out[
1 ] <
0 x7F)
out[
1 ] = out[
1 ] +
0 x61;
else if (out[
1 ] <
0 x9F)
out[
1 ] = out[
1 ] +
0 x60;
else
out[
1 ] = out[
1 ] +
0 x02;
}
else {
/* Invalid characters */
return -EINVAL;
}
}
else
return -EINVAL;
return n;
}
static int char2uni(
const unsigned char *rawstring,
int boundlen,
wchar_t *uni)
{
unsigned char sjis_temp[
2 ];
int euc_offset, n;
if ( !p_nls )
return -EINVAL;
if (boundlen <=
0 )
return -ENAMETOOLONG;
/* translate EUC-JP into SJIS */
if (rawstring[
0 ] >
0 x7F) {
if (rawstring[
0 ] == SS3) {
if (boundlen <
3 )
return -EINVAL;
euc_offset =
3 ;
if (IS_EUC_UDC_HI(rawstring[
1 ], rawstring[
2 ])) {
/* User defined characters half high */
MAP_EUC2SJIS(rawstring[
1 ], rawstring[
2 ],
0 xF5,
sjis_temp[
0 ], sjis_temp[
1 ],
0 xF5);
}
else if (euc2sjisibm(sjis_temp,rawstring[
1 ],rawstring[
2 ])) {
/* IBM extended characters */
}
else {
/* JIS X 0212 and Invalid characters*/
return -EINVAL;
/* 'GETA' with SJIS coding */
/* sjis_temp[0] = 0x81; */
/* sjis_temp[1] = 0xAC; */
}
}
else {
if (boundlen <
2 )
return -EINVAL;
euc_offset =
2 ;
if (IS_EUC_JISX0201KANA(rawstring[
0 ], rawstring[
1 ])) {
/* JIS X 0201 KANA */
sjis_temp[
0 ] = rawstring[
1 ];
sjis_temp[
1 ] =
0 x00;
}
else if (IS_EUC_UDC_LOW(rawstring[
0 ], rawstring[
1 ])) {
/* User defined characters half low */
MAP_EUC2SJIS(rawstring[
0 ], rawstring[
1 ],
0 xF5,
sjis_temp[
0 ], sjis_temp[
1 ],
0 xF0);
}
else if (IS_EUC_JISX0208(rawstring[
0 ], rawstring[
1 ])) {
/* JIS X 0208 (include NEC spesial characters) */
sjis_temp[
0 ] = ((rawstring[
0 ]-
0 x5f)/
2 ) ^
0 xA0;
if (!(rawstring[
0 ] &
1 ))
sjis_temp[
1 ] = rawstring[
1 ] -
0 x02;
else if (rawstring[
1 ] <
0 xE0)
sjis_temp[
1 ] = rawstring[
1 ] -
0 x61;
else
sjis_temp[
1 ] = rawstring[
1 ] -
0 x60;
}
else {
/* Invalid characters */
return -EINVAL;
}
}
}
else {
euc_offset =
1 ;
/* JIS X 0201 ROMAJI */
sjis_temp[
0 ] = rawstring[
0 ];
sjis_temp[
1 ] =
0 x00;
}
if ( (n = p_nls->char2uni(sjis_temp,
sizeof (sjis_temp), uni)) <
0 )
return n;
return euc_offset;
}
static struct nls_table table = {
.charset =
"euc-jp" ,
.uni2char = uni2char,
.char2uni = char2uni,
};
static int __init init_nls_euc_jp(
void )
{
p_nls = load_nls(
"cp932" );
if (p_nls) {
table.charset2upper = p_nls->charset2upper;
table.charset2lower = p_nls->charset2lower;
return register_nls(&table);
}
return -EINVAL;
}
static void __
exit exit_nls_euc_jp(
void )
{
unregister_nls(&table);
unload_nls(p_nls);
}
module_init(init_nls_euc_jp)
module_exit(exit_nls_euc_jp)
MODULE_DESCRIPTION(
"NLS Japanese charset (EUC-JP)" );
MODULE_LICENSE(
"Dual BSD/GPL" );
Messung V0.5 in Prozent C=95 H=98 G=96
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland