mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
089f7f5913
Swing most of the inline functions and unicode tables into nls from the copy in smb/server. This is UCS-2 rather than most of the rest of the code in NLS, but it currently seems like the best place for it. The actual unicode.c implementations vary much more between server and client so they're unmoved. Signed-off-by: Dr. David Alan Gilbert <linux@treblig.org> Reviewed-by: Dave Kleikamp <dave.kleikamp@oracle.com> Signed-off-by: Steve French <stfrench@microsoft.com>
147 lines
6.7 KiB
C
147 lines
6.7 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Some of the source code in this file came from fs/cifs/uniupr.h
|
|
* Copyright (c) International Business Machines Corp., 2000,2002
|
|
*
|
|
* Some of the source code in this file came from fs/cifs/cifs_unicode.c
|
|
*
|
|
* Copyright (c) International Business Machines Corp., 2000,2009
|
|
* Modified by Steve French (sfrench@us.ibm.com)
|
|
* Modified by Namjae Jeon (linkinjeon@kernel.org)
|
|
*
|
|
*/
|
|
#include <linux/fs.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <asm/unaligned.h>
|
|
#include "nls_ucs2_utils.h"
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
/*
|
|
* Latin upper case
|
|
*/
|
|
signed char NlsUniUpperTable[512] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 000-00f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 010-01f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 020-02f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 030-03f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 040-04f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 050-05f */
|
|
0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, -32, /* 060-06f */
|
|
-32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, 0, 0, 0, 0, 0, /* 070-07f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 080-08f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 090-09f */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0a0-0af */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0b0-0bf */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0c0-0cf */
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0d0-0df */
|
|
-32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, -32, -32, /* 0e0-0ef */
|
|
-32, -32, -32, -32, -32, -32, -32, 0, -32, -32,
|
|
-32, -32, -32, -32, -32, 121, /* 0f0-0ff */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 100-10f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 110-11f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 120-12f */
|
|
0, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 130-13f */
|
|
-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, /* 140-14f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 150-15f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 160-16f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 170-17f */
|
|
0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, /* 180-18f */
|
|
0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, /* 190-19f */
|
|
0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, /* 1a0-1af */
|
|
-1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, /* 1b0-1bf */
|
|
0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, /* 1c0-1cf */
|
|
-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, /* 1d0-1df */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e0-1ef */
|
|
0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, /* 1f0-1ff */
|
|
};
|
|
EXPORT_SYMBOL_GPL(NlsUniUpperTable);
|
|
|
|
/* Upper case range - Greek */
|
|
static signed char UniCaseRangeU03a0[47] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -37, -37, -37, /* 3a0-3af */
|
|
0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, /* 3b0-3bf */
|
|
-32, -32, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -64,
|
|
-63, -63,
|
|
};
|
|
|
|
/* Upper case range - Cyrillic */
|
|
static signed char UniCaseRangeU0430[48] = {
|
|
-32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, /* 430-43f */
|
|
-32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, /* 440-44f */
|
|
0, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
|
|
-80, -80, 0, -80, -80, /* 450-45f */
|
|
};
|
|
|
|
/* Upper case range - Extended cyrillic */
|
|
static signed char UniCaseRangeU0490[61] = {
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 490-49f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4a0-4af */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4b0-4bf */
|
|
0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1,
|
|
};
|
|
|
|
/* Upper case range - Extended latin and greek */
|
|
static signed char UniCaseRangeU1e00[509] = {
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e00-1e0f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e10-1e1f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e20-1e2f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e30-1e3f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e40-1e4f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e50-1e5f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e60-1e6f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e70-1e7f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e80-1e8f */
|
|
0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, -59, 0, -1, 0, -1, /* 1e90-1e9f */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ea0-1eaf */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1eb0-1ebf */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ec0-1ecf */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ed0-1edf */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ee0-1eef */
|
|
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, /* 1ef0-1eff */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f00-1f0f */
|
|
8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f10-1f1f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f20-1f2f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f30-1f3f */
|
|
8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f40-1f4f */
|
|
0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f50-1f5f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f60-1f6f */
|
|
74, 74, 86, 86, 86, 86, 100, 100, 0, 0, 112, 112,
|
|
126, 126, 0, 0, /* 1f70-1f7f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f80-1f8f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f90-1f9f */
|
|
8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fa0-1faf */
|
|
8, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fb0-1fbf */
|
|
0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fc0-1fcf */
|
|
8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fd0-1fdf */
|
|
8, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fe0-1fef */
|
|
0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
};
|
|
|
|
/* Upper case range - Wide latin */
|
|
static signed char UniCaseRangeUff40[27] = {
|
|
0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
-32, -32, -32, -32, -32, /* ff40-ff4f */
|
|
-32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
|
|
};
|
|
|
|
/*
|
|
* Upper Case Range
|
|
*/
|
|
const struct UniCaseRange NlsUniUpperRange[] = {
|
|
{0x03a0, 0x03ce, UniCaseRangeU03a0},
|
|
{0x0430, 0x045f, UniCaseRangeU0430},
|
|
{0x0490, 0x04cc, UniCaseRangeU0490},
|
|
{0x1e00, 0x1ffc, UniCaseRangeU1e00},
|
|
{0xff40, 0xff5a, UniCaseRangeUff40},
|
|
{0}
|
|
};
|
|
EXPORT_SYMBOL_GPL(NlsUniUpperRange);
|