Provide functions for upper and lower case conversion.

Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de>
---
v2:
        add configuration switch EFI_UNICODE_CAPITALIZATION
---
 include/charset.h      | 16 ++++++++++++++
 lib/charset.c          | 47 ++++++++++++++++++++++++++++++++++++++++++
 lib/efi_loader/Kconfig | 10 +++++++++
 3 files changed, 73 insertions(+)

diff --git a/include/charset.h b/include/charset.h
index 90870513ef..686db5a1fe 100644
--- a/include/charset.h
+++ b/include/charset.h
@@ -142,6 +142,22 @@ int utf16_utf8_strncpy(char **dst, const u16 *src, size_t 
count);
  */
 #define utf16_utf8_strcpy(d, s) utf16_utf8_strncpy((d), (s), SIZE_MAX)
 
+/**
+ * utf_to_lower() - convert a Unicode letter to lower case
+ *
+ * @code:              letter to convert
+ * Return:             lower case letter or unchanged letter
+ */
+s32 utf_to_lower(const s32 code);
+
+/**
+ * utf_to_upper() - convert a Unicode letter to upper case
+ *
+ * @code:              letter to convert
+ * Return:             upper case letter or unchanged letter
+ */
+s32 utf_to_upper(const s32 code);
+
 /**
  * u16_strlen - count non-zero words
  *
diff --git a/lib/charset.c b/lib/charset.c
index 39c8329830..72c808ce64 100644
--- a/lib/charset.c
+++ b/lib/charset.c
@@ -6,8 +6,18 @@
  */
 
 #include <charset.h>
+#include <capitalization.h>
 #include <malloc.h>
 
+static struct capitalization_table capitalization_table[] =
+#ifdef CONFIG_EFI_UNICODE_CAPITALIZATION
+       UNICODE_CAPITALIZATION_TABLE;
+#elif CONFIG_FAT_DEFAULT_CODEPAGE == 1250
+       CP1250_CAPITALIZATION_TABLE;
+#else
+       CP437_CAPITALIZATION_TABLE;
+#endif
+
 s32 utf8_get(const char **src)
 {
        s32 code = 0;
@@ -241,6 +251,43 @@ int utf16_utf8_strncpy(char **dst, const u16 *src, size_t 
count)
        return 0;
 }
 
+s32 utf_to_lower(const s32 code)
+{
+       struct capitalization_table *pos = capitalization_table;
+       s32 ret = code;
+
+       if (code <= 0x7f) {
+               if (code >= 'A' && code <= 'Z')
+                       ret += 0x20;
+               return ret;
+       }
+       for (; pos->upper; ++pos) {
+               if (pos->upper == code) {
+                       ret = pos->lower;
+                       break;
+               }
+       }
+       return ret;
+}
+
+s32 utf_to_upper(const s32 code)
+{
+       struct capitalization_table *pos = capitalization_table;
+       s32 ret = code;
+
+       if (code <= 0x7f) {
+               if (code >= 'a' && code <= 'z')
+                       ret -= 0x20;
+               return ret;
+       }
+       for (; pos->lower; ++pos) {
+               if (pos->lower == code) {
+                       ret = pos->upper;
+                       break;
+               }
+       }
+       return ret;
+}
 
 size_t u16_strlen(const u16 *in)
 {
diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
index ce6a09f0b4..dbf7339fe0 100644
--- a/lib/efi_loader/Kconfig
+++ b/lib/efi_loader/Kconfig
@@ -15,6 +15,16 @@ config EFI_LOADER
          interfaces to a loaded EFI application, enabling it to reuse U-Boot's
          device drivers.
 
+config EFI_UNICODE_CAPITALIZATION
+       bool "Support Unicode capitalization"
+       depends on EFI_LOADER
+       default y
+       help
+         Select this option to enable correct handling of the capitalization of
+         Unicode codepoints in the range 0x0000-0xffff. If this option is not
+         set, only the the correct handling of the letters of the codepage
+         used by the FAT file system is ensured.
+
 config EFI_LOADER_BOUNCE_BUFFER
        bool "EFI Applications use bounce buffers for DMA operations"
        depends on EFI_LOADER && ARM64
-- 
2.18.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to