1*089f7f59SDr. David Alan Gilbert // SPDX-License-Identifier: GPL-2.0-or-later 2*089f7f59SDr. David Alan Gilbert /* 3*089f7f59SDr. David Alan Gilbert * Some of the source code in this file came from fs/cifs/uniupr.h 4*089f7f59SDr. David Alan Gilbert * Copyright (c) International Business Machines Corp., 2000,2002 5*089f7f59SDr. David Alan Gilbert * 6*089f7f59SDr. David Alan Gilbert * Some of the source code in this file came from fs/cifs/cifs_unicode.c 7*089f7f59SDr. David Alan Gilbert * 8*089f7f59SDr. David Alan Gilbert * Copyright (c) International Business Machines Corp., 2000,2009 9*089f7f59SDr. David Alan Gilbert * Modified by Steve French (sfrench@us.ibm.com) 10*089f7f59SDr. David Alan Gilbert * Modified by Namjae Jeon (linkinjeon@kernel.org) 11*089f7f59SDr. David Alan Gilbert * 12*089f7f59SDr. David Alan Gilbert */ 13*089f7f59SDr. David Alan Gilbert #include <linux/fs.h> 14*089f7f59SDr. David Alan Gilbert #include <linux/module.h> 15*089f7f59SDr. David Alan Gilbert #include <linux/slab.h> 16*089f7f59SDr. David Alan Gilbert #include <asm/unaligned.h> 17*089f7f59SDr. David Alan Gilbert #include "nls_ucs2_utils.h" 18*089f7f59SDr. David Alan Gilbert 19*089f7f59SDr. David Alan Gilbert MODULE_LICENSE("GPL"); 20*089f7f59SDr. David Alan Gilbert 21*089f7f59SDr. David Alan Gilbert /* 22*089f7f59SDr. David Alan Gilbert * Latin upper case 23*089f7f59SDr. David Alan Gilbert */ 24*089f7f59SDr. David Alan Gilbert signed char NlsUniUpperTable[512] = { 25*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 000-00f */ 26*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 010-01f */ 27*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 020-02f */ 28*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 030-03f */ 29*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 040-04f */ 30*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 050-05f */ 31*089f7f59SDr. David Alan Gilbert 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 32*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, /* 060-06f */ 33*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 34*089f7f59SDr. David Alan Gilbert -32, 0, 0, 0, 0, 0, /* 070-07f */ 35*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 080-08f */ 36*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 090-09f */ 37*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0a0-0af */ 38*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0b0-0bf */ 39*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0c0-0cf */ 40*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0d0-0df */ 41*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 42*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, /* 0e0-0ef */ 43*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, 44*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, 121, /* 0f0-0ff */ 45*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 100-10f */ 46*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 110-11f */ 47*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 120-12f */ 48*089f7f59SDr. David Alan Gilbert 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 130-13f */ 49*089f7f59SDr. David Alan Gilbert -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, /* 140-14f */ 50*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 150-15f */ 51*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 160-16f */ 52*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 170-17f */ 53*089f7f59SDr. David Alan Gilbert 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, /* 180-18f */ 54*089f7f59SDr. David Alan Gilbert 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, /* 190-19f */ 55*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, /* 1a0-1af */ 56*089f7f59SDr. David Alan Gilbert -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, /* 1b0-1bf */ 57*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, /* 1c0-1cf */ 58*089f7f59SDr. David Alan Gilbert -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, /* 1d0-1df */ 59*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e0-1ef */ 60*089f7f59SDr. David Alan Gilbert 0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, /* 1f0-1ff */ 61*089f7f59SDr. David Alan Gilbert }; 62*089f7f59SDr. David Alan Gilbert EXPORT_SYMBOL_GPL(NlsUniUpperTable); 63*089f7f59SDr. David Alan Gilbert 64*089f7f59SDr. David Alan Gilbert /* Upper case range - Greek */ 65*089f7f59SDr. David Alan Gilbert static signed char UniCaseRangeU03a0[47] = { 66*089f7f59SDr. David Alan Gilbert 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -37, -37, -37, /* 3a0-3af */ 67*089f7f59SDr. David Alan Gilbert 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 68*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, /* 3b0-3bf */ 69*089f7f59SDr. David Alan Gilbert -32, -32, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -64, 70*089f7f59SDr. David Alan Gilbert -63, -63, 71*089f7f59SDr. David Alan Gilbert }; 72*089f7f59SDr. David Alan Gilbert 73*089f7f59SDr. David Alan Gilbert /* Upper case range - Cyrillic */ 74*089f7f59SDr. David Alan Gilbert static signed char UniCaseRangeU0430[48] = { 75*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 76*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, /* 430-43f */ 77*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 78*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, /* 440-44f */ 79*089f7f59SDr. David Alan Gilbert 0, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, 80*089f7f59SDr. David Alan Gilbert -80, -80, 0, -80, -80, /* 450-45f */ 81*089f7f59SDr. David Alan Gilbert }; 82*089f7f59SDr. David Alan Gilbert 83*089f7f59SDr. David Alan Gilbert /* Upper case range - Extended cyrillic */ 84*089f7f59SDr. David Alan Gilbert static signed char UniCaseRangeU0490[61] = { 85*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 490-49f */ 86*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4a0-4af */ 87*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4b0-4bf */ 88*089f7f59SDr. David Alan Gilbert 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1, 89*089f7f59SDr. David Alan Gilbert }; 90*089f7f59SDr. David Alan Gilbert 91*089f7f59SDr. David Alan Gilbert /* Upper case range - Extended latin and greek */ 92*089f7f59SDr. David Alan Gilbert static signed char UniCaseRangeU1e00[509] = { 93*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e00-1e0f */ 94*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e10-1e1f */ 95*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e20-1e2f */ 96*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e30-1e3f */ 97*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e40-1e4f */ 98*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e50-1e5f */ 99*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e60-1e6f */ 100*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e70-1e7f */ 101*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e80-1e8f */ 102*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, -59, 0, -1, 0, -1, /* 1e90-1e9f */ 103*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ea0-1eaf */ 104*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1eb0-1ebf */ 105*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ec0-1ecf */ 106*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ed0-1edf */ 107*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ee0-1eef */ 108*089f7f59SDr. David Alan Gilbert 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, /* 1ef0-1eff */ 109*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f00-1f0f */ 110*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f10-1f1f */ 111*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f20-1f2f */ 112*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f30-1f3f */ 113*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f40-1f4f */ 114*089f7f59SDr. David Alan Gilbert 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f50-1f5f */ 115*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f60-1f6f */ 116*089f7f59SDr. David Alan Gilbert 74, 74, 86, 86, 86, 86, 100, 100, 0, 0, 112, 112, 117*089f7f59SDr. David Alan Gilbert 126, 126, 0, 0, /* 1f70-1f7f */ 118*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f80-1f8f */ 119*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f90-1f9f */ 120*089f7f59SDr. David Alan Gilbert 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fa0-1faf */ 121*089f7f59SDr. David Alan Gilbert 8, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fb0-1fbf */ 122*089f7f59SDr. David Alan Gilbert 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fc0-1fcf */ 123*089f7f59SDr. David Alan Gilbert 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fd0-1fdf */ 124*089f7f59SDr. David Alan Gilbert 8, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fe0-1fef */ 125*089f7f59SDr. David Alan Gilbert 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126*089f7f59SDr. David Alan Gilbert }; 127*089f7f59SDr. David Alan Gilbert 128*089f7f59SDr. David Alan Gilbert /* Upper case range - Wide latin */ 129*089f7f59SDr. David Alan Gilbert static signed char UniCaseRangeUff40[27] = { 130*089f7f59SDr. David Alan Gilbert 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 131*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, /* ff40-ff4f */ 132*089f7f59SDr. David Alan Gilbert -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 133*089f7f59SDr. David Alan Gilbert }; 134*089f7f59SDr. David Alan Gilbert 135*089f7f59SDr. David Alan Gilbert /* 136*089f7f59SDr. David Alan Gilbert * Upper Case Range 137*089f7f59SDr. David Alan Gilbert */ 138*089f7f59SDr. David Alan Gilbert const struct UniCaseRange NlsUniUpperRange[] = { 139*089f7f59SDr. David Alan Gilbert {0x03a0, 0x03ce, UniCaseRangeU03a0}, 140*089f7f59SDr. David Alan Gilbert {0x0430, 0x045f, UniCaseRangeU0430}, 141*089f7f59SDr. David Alan Gilbert {0x0490, 0x04cc, UniCaseRangeU0490}, 142*089f7f59SDr. David Alan Gilbert {0x1e00, 0x1ffc, UniCaseRangeU1e00}, 143*089f7f59SDr. David Alan Gilbert {0xff40, 0xff5a, UniCaseRangeUff40}, 144*089f7f59SDr. David Alan Gilbert {0} 145*089f7f59SDr. David Alan Gilbert }; 146*089f7f59SDr. David Alan Gilbert EXPORT_SYMBOL_GPL(NlsUniUpperRange); 147