[PATCH 2/2] Simplify generation of UTF-8 output strings, making the code more readable.

Andrew C Aitchison werdna@aitchison.me.uk
Tue Sep 9 11:04:36 GMT 2025


---
 binutils/nm.c      | 13 +++++++------
 binutils/objdump.c | 13 +++++++------
 binutils/readelf.c | 13 +++++++------
 3 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/binutils/nm.c b/binutils/nm.c
index 831f348127b..3c6fad017ee 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -552,15 +552,16 @@ display_utf8 (const unsigned char * in, char * out, unsigned int * consumed)
       switch (nchars)
 	{
 	case 2:
-	  out += sprintf (out, "\\u%02x%02x",
-		  ((in[0] & 0x1c) >> 2),
-		  ((in[0] & 0x03) << 6) | (in[1] & 0x3f));
+	  out += sprintf (out, "\\u%04x",
+		  ((in[0] & 0x1f) << 6) |
+		  ((in[1] & 0x3f)) );
 	  break;
 
 	case 3:
-	  out += sprintf (out, "\\u%02x%02x",
-		  ((in[0] & 0x0f) << 4) | ((in[1] & 0x3c) >> 2),
-		  ((in[1] & 0x03) << 6) | ((in[2] & 0x3f)));
+	  out += sprintf (out, "\\u%04x",
+		  ((in[0] & 0x0f) << 12) |
+		  ((in[1] & 0x3f) << 6) |
+		  ((in[2] & 0x3f)) );
 	  break;
 
 	case 4:
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 7fc7b6fb86d..0650277c690 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -646,15 +646,16 @@ display_utf8 (const unsigned char * in, char * out, unsigned int * consumed)
       switch (nchars)
 	{
 	case 2:
-	  out += sprintf (out, "\\u%02x%02x",
-		  ((in[0] & 0x1c) >> 2),
-		  ((in[0] & 0x03) << 6) | (in[1] & 0x3f));
+	  out += sprintf (out, "\\u%04x",
+		 ((in[0] & 0x1f) << 6) |
+		 ((in[1] & 0x3f)) );
 	  break;
 
 	case 3:
-	  out += sprintf (out, "\\u%02x%02x",
-		  ((in[0] & 0x0f) << 4) | ((in[1] & 0x3c) >> 2),
-		  ((in[1] & 0x03) << 6) | ((in[2] & 0x3f)));
+	  out += sprintf (out, "\\u%04x",
+		  ((in[0] & 0x0f) << 12) |
+		  ((in[1] & 0x3f) << 6) |
+		  ((in[2] & 0x3f)) );
 	  break;
 
 	case 4:
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 2ed40f073fb..4f774d8df01 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -833,16 +833,17 @@ print_symbol_name (signed int width, const char * symbol)
 		case 2:
 		  if (width_remaining < 6)
 		    break;
-		  printf ("\\u%02x%02x",
-			  (bytes[0] & 0x1c) >> 2,
-			  ((bytes[0] & 0x03) << 6) | (bytes[1] & 0x3f));
+		  printf ("\\u%04x",
+			  ((bytes[0] & 0x1f) << 6) |
+			  ((bytes[1] & 0x3f)) );
 		  break;
 		case 3:
 		  if (width_remaining < 6)
 		    break;
-		  printf ("\\u%02x%02x",
-			  ((bytes[0] & 0x0f) << 4) | ((bytes[1] & 0x3c) >> 2),
-			  ((bytes[1] & 0x03) << 6) | (bytes[2] & 0x3f));
+		  printf ("\\u%04x",
+			  ((bytes[0] & 0x0f) << 12) |
+			  ((bytes[1] & 0x3f) << 6) |
+			  ((bytes[2] & 0x3f)) );
 		  break;
 		case 4:
 		  if (width_remaining < 8)
-- 
2.48.1



More information about the Binutils mailing list