lib: charset: upper/lower case conversion
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 4 Sep 2018 17:34:56 +0000 (19:34 +0200)
committerAlexander Graf <agraf@suse.de>
Sun, 23 Sep 2018 19:55:29 +0000 (21:55 +0200)
Provide functions for upper and lower case conversion.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
include/charset.h
lib/charset.c
lib/efi_loader/Kconfig

index 90870513efc09cacdaf591ade01c9baffd96f09b..686db5a1fe1665edf509018428932fcdc86f372c 100644 (file)
@@ -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
  *
index 39c83298303bf13b14e8d896cd7fa835a0959954..72c808ce641563761e8d0d3d182b67af3411201c 100644 (file)
@@ -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)
 {
index ce6a09f0b43bb08ee15b8ac45c8fce2fafeaf0ef..dbf7339fe011af4aa28cb3b625a40533810fbac9 100644 (file)
@@ -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