mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
unicode: pass a UNICODE_AGE() tripple to utf8_load
Don't bother with pointless string parsing when the caller can just pass the version in the format that the core expects. Also remove the fallback to the latest version that none of the callers actually uses. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
This commit is contained in:
parent
f3a9c82396
commit
49bd03cc7e
7 changed files with 65 additions and 86 deletions
|
@ -167,59 +167,19 @@ int utf8_normalize(const struct unicode_map *um, const struct qstr *str,
|
|||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(utf8_normalize);
|
||||
|
||||
static int utf8_parse_version(const char *version, unsigned int *maj,
|
||||
unsigned int *min, unsigned int *rev)
|
||||
struct unicode_map *utf8_load(unsigned int version)
|
||||
{
|
||||
substring_t args[3];
|
||||
char version_string[12];
|
||||
static const struct match_token token[] = {
|
||||
{1, "%d.%d.%d"},
|
||||
{0, NULL}
|
||||
};
|
||||
struct unicode_map *um;
|
||||
|
||||
strncpy(version_string, version, sizeof(version_string));
|
||||
|
||||
if (match_token(version_string, token, args) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (match_int(&args[0], maj) || match_int(&args[1], min) ||
|
||||
match_int(&args[2], rev))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct unicode_map *utf8_load(const char *version)
|
||||
{
|
||||
struct unicode_map *um = NULL;
|
||||
int unicode_version;
|
||||
|
||||
if (version) {
|
||||
unsigned int maj, min, rev;
|
||||
|
||||
if (utf8_parse_version(version, &maj, &min, &rev) < 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (!utf8version_is_supported(maj, min, rev))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
unicode_version = UNICODE_AGE(maj, min, rev);
|
||||
} else {
|
||||
unicode_version = utf8version_latest();
|
||||
printk(KERN_WARNING"UTF-8 version not specified. "
|
||||
"Assuming latest supported version (%d.%d.%d).",
|
||||
(unicode_version >> 16) & 0xff,
|
||||
(unicode_version >> 8) & 0xff,
|
||||
(unicode_version & 0xff));
|
||||
}
|
||||
if (!utf8version_is_supported(version))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
um = kzalloc(sizeof(struct unicode_map), GFP_KERNEL);
|
||||
if (!um)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
um->version = unicode_version;
|
||||
um->version = version;
|
||||
return um;
|
||||
}
|
||||
EXPORT_SYMBOL(utf8_load);
|
||||
|
|
|
@ -15,13 +15,12 @@ struct utf8data {
|
|||
#include "utf8data.h"
|
||||
#undef __INCLUDED_FROM_UTF8NORM_C__
|
||||
|
||||
int utf8version_is_supported(u8 maj, u8 min, u8 rev)
|
||||
int utf8version_is_supported(unsigned int version)
|
||||
{
|
||||
int i = ARRAY_SIZE(utf8agetab) - 1;
|
||||
unsigned int sb_utf8version = UNICODE_AGE(maj, min, rev);
|
||||
|
||||
while (i >= 0 && utf8agetab[i] != 0) {
|
||||
if (sb_utf8version == utf8agetab[i])
|
||||
if (version == utf8agetab[i])
|
||||
return 1;
|
||||
i--;
|
||||
}
|
||||
|
@ -29,12 +28,6 @@ int utf8version_is_supported(u8 maj, u8 min, u8 rev)
|
|||
}
|
||||
EXPORT_SYMBOL(utf8version_is_supported);
|
||||
|
||||
int utf8version_latest(void)
|
||||
{
|
||||
return utf8vers;
|
||||
}
|
||||
EXPORT_SYMBOL(utf8version_latest);
|
||||
|
||||
/*
|
||||
* UTF-8 valid ranges.
|
||||
*
|
||||
|
|
|
@ -235,7 +235,7 @@ static void check_utf8_nfdicf(void)
|
|||
static void check_utf8_comparisons(void)
|
||||
{
|
||||
int i;
|
||||
struct unicode_map *table = utf8_load("12.1.0");
|
||||
struct unicode_map *table = utf8_load(UNICODE_AGE(12, 1, 0));
|
||||
|
||||
if (IS_ERR(table)) {
|
||||
pr_err("%s: Unable to load utf8 %d.%d.%d. Skipping.\n",
|
||||
|
@ -269,18 +269,19 @@ static void check_utf8_comparisons(void)
|
|||
static void check_supported_versions(void)
|
||||
{
|
||||
/* Unicode 7.0.0 should be supported. */
|
||||
test(utf8version_is_supported(7, 0, 0));
|
||||
test(utf8version_is_supported(UNICODE_AGE(7, 0, 0)));
|
||||
|
||||
/* Unicode 9.0.0 should be supported. */
|
||||
test(utf8version_is_supported(9, 0, 0));
|
||||
test(utf8version_is_supported(UNICODE_AGE(9, 0, 0)));
|
||||
|
||||
/* Unicode 1x.0.0 (the latest version) should be supported. */
|
||||
test(utf8version_is_supported(latest_maj, latest_min, latest_rev));
|
||||
test(utf8version_is_supported(
|
||||
UNICODE_AGE(latest_maj, latest_min, latest_rev)));
|
||||
|
||||
/* Next versions don't exist. */
|
||||
test(!utf8version_is_supported(13, 0, 0));
|
||||
test(!utf8version_is_supported(0, 0, 0));
|
||||
test(!utf8version_is_supported(-1, -1, -1));
|
||||
test(!utf8version_is_supported(UNICODE_AGE(13, 0, 0)));
|
||||
test(!utf8version_is_supported(UNICODE_AGE(0, 0, 0)));
|
||||
test(!utf8version_is_supported(UNICODE_AGE(-1, -1, -1)));
|
||||
}
|
||||
|
||||
static int __init init_test_ucd(void)
|
||||
|
|
|
@ -11,19 +11,9 @@
|
|||
#include <linux/export.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/unicode.h>
|
||||
|
||||
/* Encoding a unicode version number as a single unsigned int. */
|
||||
#define UNICODE_MAJ_SHIFT (16)
|
||||
#define UNICODE_MIN_SHIFT (8)
|
||||
|
||||
#define UNICODE_AGE(MAJ, MIN, REV) \
|
||||
(((unsigned int)(MAJ) << UNICODE_MAJ_SHIFT) | \
|
||||
((unsigned int)(MIN) << UNICODE_MIN_SHIFT) | \
|
||||
((unsigned int)(REV)))
|
||||
|
||||
/* Highest unicode version supported by the data tables. */
|
||||
extern int utf8version_is_supported(u8 maj, u8 min, u8 rev);
|
||||
extern int utf8version_latest(void);
|
||||
int utf8version_is_supported(unsigned int version);
|
||||
|
||||
/*
|
||||
* Look for the correct const struct utf8data for a unicode version.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue