]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - fatfs/src/option/cc949.c
Import fatfs R0.12b
[z180-stamp.git] / fatfs / src / option / cc949.c
index 0abda85e83e450375f3a2fefcd9e1313633353bf..3bc617cc1eb87b8a33914c7171bfc5eae84d0b9d 100644 (file)
@@ -1,6 +1,5 @@
 /*------------------------------------------------------------------------*/\r
-/* Unicode - OEM code bidirectional converter  (C)ChaN, 2009              */\r
-/*                                                                        */\r
+/* Unicode - OEM code bidirectional converter  (C)ChaN, 2015              */\r
 /* CP949 (Korean EUC-KR)                                                  */\r
 /*------------------------------------------------------------------------*/\r
 \r
@@ -8552,7 +8551,7 @@ const WCHAR oem2uni[] = {
 \r
 WCHAR ff_convert (     /* Converted code, 0 means conversion error */\r
        WCHAR   chr,    /* Character code to be converted */\r
-       UINT    dir             /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */\r
+       UINT    dir             /* 0: Unicode to OEM code, 1: OEM code to Unicode */\r
 )\r
 {\r
        const WCHAR *p;\r
@@ -8563,10 +8562,10 @@ WCHAR ff_convert (      /* Converted code, 0 means conversion error */
        if (chr < 0x80) {       /* ASCII */\r
                c = chr;\r
        } else {\r
-               if (dir) {              /* OEMCP to unicode */\r
+               if (dir) {              /* OEM code to unicode */\r
                        p = oem2uni;\r
                        hi = sizeof oem2uni / 4 - 1;\r
-               } else {                /* Unicode to OEMCP */\r
+               } else {                /* Unicode to OEM code */\r
                        p = uni2oem;\r
                        hi = sizeof uni2oem / 4 - 1;\r
                }\r
@@ -8587,17 +8586,89 @@ WCHAR ff_convert (      /* Converted code, 0 means conversion error */
 \r
 \r
 \r
-\r
-WCHAR ff_wtoupper (    /* Upper converted character */\r
-       WCHAR chr               /* Input character */\r
+WCHAR ff_wtoupper (    /* Returns upper converted character */\r
+       WCHAR chr               /* Unicode character to be upper converted (BMP only) */\r
 )\r
 {\r
-       static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 };\r
-       static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 };\r
-       int i;\r
+       /* Compressed upper conversion table */\r
+       static const WCHAR cvt1[] = {   /* U+0000 - U+0FFF */\r
+               /* Basic Latin */\r
+               0x0061,0x031A,\r
+               /* Latin-1 Supplement */\r
+               0x00E0,0x0317,  0x00F8,0x0307,  0x00FF,0x0001,0x0178,\r
+               /* Latin Extended-A */\r
+               0x0100,0x0130,  0x0132,0x0106,  0x0139,0x0110,  0x014A,0x012E,  0x0179,0x0106,\r
+               /* Latin Extended-B */\r
+               0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA,\r
+               0x01CD,0x0110,  0x01DD,0x0001,0x018E,  0x01DE,0x0112,  0x01F3,0x0003,0x01F1,0x01F4,0x01F4,  0x01F8,0x0128,\r
+               0x0222,0x0112,  0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241,  0x0246,0x010A,\r
+               /* IPA Extensions */\r
+               0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7,\r
+               /* Greek, Coptic */\r
+               0x037B,0x0003,0x03FD,0x03FE,0x03FF,  0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A,  0x03B1,0x0311,\r
+               0x03C2,0x0002,0x03A3,0x03A3,  0x03C4,0x0308,  0x03CC,0x0003,0x038C,0x038E,0x038F,  0x03D8,0x0118,\r
+               0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA,\r
+               /* Cyrillic */\r
+               0x0430,0x0320,  0x0450,0x0710,  0x0460,0x0122,  0x048A,0x0136,  0x04C1,0x010E,  0x04CF,0x0001,0x04C0,  0x04D0,0x0144,\r
+               /* Armenian */\r
+               0x0561,0x0426,\r
+\r
+               0x0000\r
+       };\r
+       static const WCHAR cvt2[] = {   /* U+1000 - U+FFFF */\r
+               /* Phonetic Extensions */\r
+               0x1D7D,0x0001,0x2C63,\r
+               /* Latin Extended Additional */\r
+               0x1E00,0x0196,  0x1EA0,0x015A,\r
+               /* Greek Extended */\r
+               0x1F00,0x0608,  0x1F10,0x0606,  0x1F20,0x0608,  0x1F30,0x0608,  0x1F40,0x0606,\r
+               0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F,  0x1F60,0x0608,\r
+               0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB,\r
+               0x1F80,0x0608,  0x1F90,0x0608,  0x1FA0,0x0608,  0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC,\r
+               0x1FCC,0x0001,0x1FC3,  0x1FD0,0x0602,  0x1FE0,0x0602,  0x1FE5,0x0001,0x1FEC,  0x1FF2,0x0001,0x1FFC,\r
+               /* Letterlike Symbols */\r
+               0x214E,0x0001,0x2132,\r
+               /* Number forms */\r
+               0x2170,0x0210,  0x2184,0x0001,0x2183,\r
+               /* Enclosed Alphanumerics */\r
+               0x24D0,0x051A,  0x2C30,0x042F,\r
+               /* Latin Extended-C */\r
+               0x2C60,0x0102,  0x2C67,0x0106, 0x2C75,0x0102,\r
+               /* Coptic */\r
+               0x2C80,0x0164,\r
+               /* Georgian Supplement */\r
+               0x2D00,0x0826,\r
+               /* Full-width */\r
+               0xFF41,0x031A,\r
 \r
+               0x0000\r
+       };\r
+       const WCHAR *p;\r
+       WCHAR bc, nc, cmd;\r
 \r
-       for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ;\r
 \r
-       return tbl_lower[i] ? tbl_upper[i] : chr;\r
+       p = chr < 0x1000 ? cvt1 : cvt2;\r
+       for (;;) {\r
+               bc = *p++;                                                              /* Get block base */\r
+               if (!bc || chr < bc) break;\r
+               nc = *p++; cmd = nc >> 8; nc &= 0xFF;   /* Get processing command and block size */\r
+               if (chr < bc + nc) {    /* In the block? */\r
+                       switch (cmd) {\r
+                       case 0: chr = p[chr - bc]; break;               /* Table conversion */\r
+                       case 1: chr -= (chr - bc) & 1; break;   /* Case pairs */\r
+                       case 2: chr -= 16; break;                               /* Shift -16 */\r
+                       case 3: chr -= 32; break;                               /* Shift -32 */\r
+                       case 4: chr -= 48; break;                               /* Shift -48 */\r
+                       case 5: chr -= 26; break;                               /* Shift -26 */\r
+                       case 6: chr += 8; break;                                /* Shift +8 */\r
+                       case 7: chr -= 80; break;                               /* Shift -80 */\r
+                       case 8: chr -= 0x1C60; break;                   /* Shift -0x1C60 */\r
+                       }\r
+                       break;\r
+               }\r
+               if (!cmd) p += nc;\r
+       }\r
+\r
+       return chr;\r
 }\r
+\r