/*
* 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