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