@@ -12,6 +12,7 @@
#include <linux/string.h>
#include <linux/nls.h>
#include <linux/errno.h>
+#include <linux/slab.h>
static const wchar_t charset2uni[256] = {
/* 0x00*/
@@ -152,11 +153,43 @@ static unsigned char charset_toupper(const struct nls_table *table,
return charset2upper[c];
}
+/* Ascii casefold can be defined as either to lower or to upper. As long
+ * as it is stable. */
+static int ascii_casefold(const struct nls_table *charset,
+ const unsigned char *str, size_t len,
+ unsigned char *dest, size_t dlen)
+{
+ unsigned int i;
+
+ if (dlen < len)
+ return -EINVAL;
+
+ for (i = 0; i < len; i++)
+ dest[i] = charset_tolower(charset, str[i]);
+
+ return 0;
+}
+
+/* Ascii normalization is identity. */
+static int ascii_normalize(const struct nls_table *charset,
+ const unsigned char *str, size_t len,
+ unsigned char *dest, size_t dlen)
+{
+ if (dlen < len)
+ return -EINVAL;
+
+ memcpy(dest, str, len);
+
+ return 0;
+}
+
static const struct nls_ops charset_ops = {
.lowercase = charset_toupper,
.uppercase = charset_tolower,
.uni2char = uni2char,
.char2uni = char2uni,
+ .casefold = ascii_casefold,
+ .normalize = ascii_normalize,
};
static struct nls_charset nls_charset;
Normalization is identity, but casefold can be implemented with toupper or tolower, and we have no specification on that. We should be safe, as long as it is constant. Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk> --- fs/nls/nls_ascii.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)