0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/kernel.h>
0012 #include <linux/string.h>
0013 #include <linux/nls.h>
0014 #include <linux/errno.h>
0015
0016 static const wchar_t charset2uni[256] = {
0017
0018 0x0000, 0x0001, 0x0002, 0x0003,
0019 0x0004, 0x0005, 0x0006, 0x0007,
0020 0x0008, 0x0009, 0x000a, 0x000b,
0021 0x000c, 0x000d, 0x000e, 0x000f,
0022
0023 0x0010, 0x0011, 0x0012, 0x0013,
0024 0x0014, 0x0015, 0x0016, 0x0017,
0025 0x0018, 0x0019, 0x001a, 0x001b,
0026 0x001c, 0x001d, 0x001e, 0x001f,
0027
0028 0x0020, 0x0021, 0x0022, 0x0023,
0029 0x0024, 0x0025, 0x0026, 0x0027,
0030 0x0028, 0x0029, 0x002a, 0x002b,
0031 0x002c, 0x002d, 0x002e, 0x002f,
0032
0033 0x0030, 0x0031, 0x0032, 0x0033,
0034 0x0034, 0x0035, 0x0036, 0x0037,
0035 0x0038, 0x0039, 0x003a, 0x003b,
0036 0x003c, 0x003d, 0x003e, 0x003f,
0037
0038 0x0040, 0x0041, 0x0042, 0x0043,
0039 0x0044, 0x0045, 0x0046, 0x0047,
0040 0x0048, 0x0049, 0x004a, 0x004b,
0041 0x004c, 0x004d, 0x004e, 0x004f,
0042
0043 0x0050, 0x0051, 0x0052, 0x0053,
0044 0x0054, 0x0055, 0x0056, 0x0057,
0045 0x0058, 0x0059, 0x005a, 0x005b,
0046 0x005c, 0x005d, 0x005e, 0x005f,
0047
0048 0x0060, 0x0061, 0x0062, 0x0063,
0049 0x0064, 0x0065, 0x0066, 0x0067,
0050 0x0068, 0x0069, 0x006a, 0x006b,
0051 0x006c, 0x006d, 0x006e, 0x006f,
0052
0053 0x0070, 0x0071, 0x0072, 0x0073,
0054 0x0074, 0x0075, 0x0076, 0x0077,
0055 0x0078, 0x0079, 0x007a, 0x007b,
0056 0x007c, 0x007d, 0x007e, 0x007f,
0057 };
0058
0059 static const unsigned char page00[256] = {
0060 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0061 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0062 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0063 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0064 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0065 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0066 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0067 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0068 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0069 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0070 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0071 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0072 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0073 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0074 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0075 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0076 };
0077
0078 static const unsigned char *const page_uni2charset[256] = {
0079 page00,
0080 };
0081
0082 static const unsigned char charset2lower[256] = {
0083 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0084 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0085 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0086 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0087 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0088 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0089 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0090 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0091 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0092 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0093 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0094 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0095 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0096 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0097 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0098 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0099 };
0100
0101 static const unsigned char charset2upper[256] = {
0102 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0103 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0104 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0105 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0106 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0107 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0108 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0109 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0110 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0111 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0112 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0113 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0114 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0115 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0116 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0117 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0118 };
0119
0120 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
0121 {
0122 const unsigned char *uni2charset;
0123 unsigned char cl = uni & 0x00ff;
0124 unsigned char ch = (uni & 0xff00) >> 8;
0125
0126 if (boundlen <= 0)
0127 return -ENAMETOOLONG;
0128
0129 uni2charset = page_uni2charset[ch];
0130 if (uni2charset && uni2charset[cl])
0131 out[0] = uni2charset[cl];
0132 else
0133 return -EINVAL;
0134 return 1;
0135 }
0136
0137 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
0138 {
0139 *uni = charset2uni[*rawstring];
0140 if (*uni == 0x0000)
0141 return -EINVAL;
0142 return 1;
0143 }
0144
0145 static struct nls_table table = {
0146 .charset = "ascii",
0147 .uni2char = uni2char,
0148 .char2uni = char2uni,
0149 .charset2lower = charset2lower,
0150 .charset2upper = charset2upper,
0151 };
0152
0153 static int __init init_nls_ascii(void)
0154 {
0155 return register_nls(&table);
0156 }
0157
0158 static void __exit exit_nls_ascii(void)
0159 {
0160 unregister_nls(&table);
0161 }
0162
0163 module_init(init_nls_ascii)
0164 module_exit(exit_nls_ascii)
0165
0166 MODULE_LICENSE("Dual BSD/GPL");