]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_scrub: dump unicode points
authorDarrick J. Wong <djwong@kernel.org>
Mon, 29 Jul 2024 23:23:11 +0000 (16:23 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:09 +0000 (17:01 -0700)
Add some debug functions to make it easier to query unicode character
properties.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
scrub/unicrash.c

index 8a896f33c11875f4cf2dfe64af496d77a6433986..143060b569f27c0dcbe040b2db15c64bccad5f20 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include "xfs.h"
 #include "xfs_arch.h"
+#include "list.h"
 #include <stdint.h>
 #include <stdlib.h>
 #include <dirent.h>
@@ -1003,14 +1004,68 @@ unicrash_check_fs_label(
                        label, 0);
 }
 
+/* Dump a unicode code point and its properties. */
+static inline void dump_uchar32(UChar32 c)
+{
+       UChar           uchrstr[UCHAR_PER_UCHAR32];
+       const char      *descr;
+       char            buf[16];
+       int32_t         uchrstrlen, buflen;
+       UProperty       p;
+       UErrorCode      uerr = U_ZERO_ERROR;
+
+       printf("Unicode point 0x%x:", c);
+
+       /* Convert UChar32 to UTF8 representation. */
+       uchrstrlen = uchar32_to_uchar(c, uchrstr);
+       if (!uchrstrlen)
+               return;
+
+       u_strToUTF8(buf, sizeof(buf), &buflen, uchrstr, uchrstrlen, &uerr);
+       if (!U_FAILURE(uerr) && buflen > 0) {
+               int32_t i;
+
+               printf(" \"");
+               for (i = 0; i < buflen; i++)
+                       printf("\\x%02x", buf[i]);
+               printf("\"");
+       }
+       printf("\n");
+
+       for (p = 0; p < UCHAR_BINARY_LIMIT; p++) {
+               int     has;
+
+               descr = u_getPropertyName(p, U_LONG_PROPERTY_NAME);
+               if (!descr)
+                       descr = u_getPropertyName(p, U_SHORT_PROPERTY_NAME);
+
+               has = u_hasBinaryProperty(c, p) ? 1 : 0;
+               if (descr) {
+                       printf("  %s(%u) = %d\n", descr, p, has);
+               } else {
+                       printf("  ?(%u) = %d\n", p, has);
+               }
+       }
+}
+
 /* Load libicu and initialize it. */
 bool
 unicrash_load(void)
 {
-       UErrorCode              uerr = U_ZERO_ERROR;
+       char            *dbgstr;
+       UChar32         uchr;
+       UErrorCode      uerr = U_ZERO_ERROR;
 
        u_init(&uerr);
-       return U_FAILURE(uerr);
+       if (U_FAILURE(uerr))
+               return true;
+
+       dbgstr = getenv("XFS_SCRUB_DUMP_CHAR");
+       if (dbgstr) {
+               uchr = strtol(dbgstr, NULL, 0);
+               dump_uchar32(uchr);
+       }
+       return false;
 }
 
 /* Unload libicu once we're done with it. */