xref: /openbmc/linux/fs/nls/nls_ucs2_utils.c (revision 089f7f59)
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