]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
lib/charset: Map Unicode code points to CP437 code points 1-31
authorJanne Grunau <j@jannau.net>
Sat, 16 Mar 2024 21:50:20 +0000 (22:50 +0100)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Thu, 21 Mar 2024 05:56:13 +0000 (06:56 +0100)
Code page 437 uses code points 1-31 for glyphs instead of control
characters. Map the appropriate Unicode code points to this code points.
Fixes rendering of grub2's menu as EFI application using the
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL on a console with bitmap fonts.

Signed-off-by: Janne Grunau <j@jannau.net>
include/charset.h
include/cp1250.h
include/cp437.h
lib/charset.c
lib/efi_loader/efi_unicode_collation.c

index f1050c903d6b5814e6d4013aa49e66560743c3c0..348bad5883adf5ca5e79acb373f05da197e83135 100644 (file)
@@ -16,7 +16,7 @@
 /*
  * codepage_437 - Unicode to codepage 437 translation table
  */
-extern const u16 codepage_437[128];
+extern const u16 codepage_437[160];
 
 /**
  * console_read_unicode() - read Unicode code point from console
index adacf8a95800c4b48f7ed2382f742e550f465153..b762c78d9f63516b229d8c585e9a92b583f3b4a9 100644 (file)
@@ -1,10 +1,18 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 
 /*
- * Constant CP1250 contains the Unicode code points for characters 0x80 - 0xff
- * of the code page 1250.
+ * Constant CP1250 contains the Unicode code points for characters 0x00 - 0x1f
+ * and 0x80 - 0xff of the code page 1250.
  */
 #define CP1250 { \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
+       0x0000, 0x0000, 0x0000, 0x0000, \
        0x20ac, 0x0000, 0x201a, 0x0000, \
        0x201e, 0x2026, 0x2020, 0x2021, \
        0x0000, 0x2030, 0x0160, 0x2039, \
index 0b2b97132e3266f376e6ed82ae71ca5a1ab5d94c..5093130f5ed37d8067c4e36f5671fd4f2b9fcfb4 100644 (file)
@@ -1,10 +1,18 @@
 /* SPDX-License-Identifier: GPL-2.0+ */
 
 /*
- * Constant CP437 contains the Unicode code points for characters 0x80 - 0xff
- * of the code page 437.
+ * Constant CP437 contains the Unicode code points for characters 0x00 - 0x1f
+ * and 0x80 - 0xff of the code page 437.
  */
 #define CP437 { \
+       0x0000, 0x263a, 0x263b, 0x2665, \
+       0x2666, 0x2663, 0x2660, 0x2022, \
+       0x25d8, 0x25cb, 0x25d9, 0x2642, \
+       0x2640, 0x266a, 0x266b, 0x263c, \
+       0x25ba, 0x25c4, 0x2195, 0x203c, \
+       0x00b6, 0x00a7, 0x25ac, 0x21a8, \
+       0x2191, 0x2193, 0x2192, 0x2190, \
+       0x221f, 0x2194, 0x25b2, 0x25bc, \
        0x00c7, 0x00fc, 0x00e9, 0x00e2, \
        0x00e4, 0x00e0, 0x00e5, 0x00e7, \
        0x00ea, 0x00eb, 0x00e8, 0x00ef, \
index 2b43175b1d982af5f8d5ffcf9042dc3464ab66a7..df4f0407485248456c7fcfe95025338efa88fc7d 100644 (file)
@@ -15,7 +15,7 @@
 /**
  * codepage_437 - Unicode to codepage 437 translation table
  */
-const u16 codepage_437[128] = CP437;
+const u16 codepage_437[160] = CP437;
 
 static struct capitalization_table capitalization_table[] =
 #ifdef CONFIG_EFI_UNICODE_CAPITALIZATION
@@ -516,9 +516,12 @@ int utf_to_cp(s32 *c, const u16 *codepage)
                int j;
 
                /* Look up codepage translation */
-               for (j = 0; j < 0x80; ++j) {
+               for (j = 0; j < 0xA0; ++j) {
                        if (*c == codepage[j]) {
-                               *c = j + 0x80;
+                               if (j < 0x20)
+                                       *c = j;
+                               else
+                                       *c = j + 0x60;
                                return 0;
                        }
                }
index 2b6912c5092115c27cbf7fff6e14ee9aa7a77953..627bb9123cf2162bd477dda2010d683dfd846fb8 100644 (file)
@@ -256,7 +256,7 @@ static void EFIAPI efi_fat_to_str(struct efi_unicode_collation_protocol *this,
        for (i = 0; i < fat_size; ++i) {
                c = (unsigned char)fat[i];
                if (c > 0x80)
-                       c = codepage[c - 0x80];
+                       c = codepage[c - 0x60];
                string[i] = c;
                if (!c)
                        break;