Metaflac hex dump UTF-8 and locale fix.
authorErik de Castro Lopo <erikd@mega-nerd.com>
Sun, 21 Apr 2013 08:05:21 +0000 (18:05 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Sun, 21 Apr 2013 08:05:25 +0000 (18:05 +1000)
Change metaflac hexdump function so utf-8 decoding is only used for
filename printing and changed hex output printing to not rely only
on isprint. That function seems to return true for tabulator
control character under Windows when application isn't using C-locale.

Patch (with one minor tweak) from Janne Hyvärinen <cse@sci.fi>.

src/metaflac/utils.c

index af17d5b..8b91011 100644 (file)
@@ -77,17 +77,23 @@ void local_strcat(char **dest, const char *source)
        safe_strncpy((*dest)+ndest, source, ndest + nsource + 1);
 }
 
+static inline int local_isprint(int c)
+{
+       if (c < 32) return 0;
+       return isprint(c);
+}
+
 void hexdump(const char *filename, const FLAC__byte *buf, unsigned bytes, const char *indent)
 {
        unsigned i, left = bytes;
        const FLAC__byte *b = buf;
 
        for(i = 0; i < bytes; i += 16) {
-               flac_printf("%s%s%s%08X: "
+               flac_printf("%s%s", filename? filename:"", filename? ":":"");
+               printf("%s%08X: "
                        "%02X %02X %02X %02X %02X %02X %02X %02X "
                        "%02X %02X %02X %02X %02X %02X %02X %02X "
                        "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
-                       filename? filename:"", filename? ":":"",
                        indent, i,
                        left >  0? (unsigned char)b[ 0] : 0,
                        left >  1? (unsigned char)b[ 1] : 0,
@@ -105,22 +111,22 @@ void hexdump(const char *filename, const FLAC__byte *buf, unsigned bytes, const
                        left > 13? (unsigned char)b[13] : 0,
                        left > 14? (unsigned char)b[14] : 0,
                        left > 15? (unsigned char)b[15] : 0,
-                       (left >  0) ? (isprint(b[ 0]) ? b[ 0] : '.') : ' ',
-                       (left >  1) ? (isprint(b[ 1]) ? b[ 1] : '.') : ' ',
-                       (left >  2) ? (isprint(b[ 2]) ? b[ 2] : '.') : ' ',
-                       (left >  3) ? (isprint(b[ 3]) ? b[ 3] : '.') : ' ',
-                       (left >  4) ? (isprint(b[ 4]) ? b[ 4] : '.') : ' ',
-                       (left >  5) ? (isprint(b[ 5]) ? b[ 5] : '.') : ' ',
-                       (left >  6) ? (isprint(b[ 6]) ? b[ 6] : '.') : ' ',
-                       (left >  7) ? (isprint(b[ 7]) ? b[ 7] : '.') : ' ',
-                       (left >  8) ? (isprint(b[ 8]) ? b[ 8] : '.') : ' ',
-                       (left >  9) ? (isprint(b[ 9]) ? b[ 9] : '.') : ' ',
-                       (left > 10) ? (isprint(b[10]) ? b[10] : '.') : ' ',
-                       (left > 11) ? (isprint(b[11]) ? b[11] : '.') : ' ',
-                       (left > 12) ? (isprint(b[12]) ? b[12] : '.') : ' ',
-                       (left > 13) ? (isprint(b[13]) ? b[13] : '.') : ' ',
-                       (left > 14) ? (isprint(b[14]) ? b[14] : '.') : ' ',
-                       (left > 15) ? (isprint(b[15]) ? b[15] : '.') : ' '
+                       (left >  0) ? (local_isprint(b[ 0]) ? b[ 0] : '.') : ' ',
+                       (left >  1) ? (local_isprint(b[ 1]) ? b[ 1] : '.') : ' ',
+                       (left >  2) ? (local_isprint(b[ 2]) ? b[ 2] : '.') : ' ',
+                       (left >  3) ? (local_isprint(b[ 3]) ? b[ 3] : '.') : ' ',
+                       (left >  4) ? (local_isprint(b[ 4]) ? b[ 4] : '.') : ' ',
+                       (left >  5) ? (local_isprint(b[ 5]) ? b[ 5] : '.') : ' ',
+                       (left >  6) ? (local_isprint(b[ 6]) ? b[ 6] : '.') : ' ',
+                       (left >  7) ? (local_isprint(b[ 7]) ? b[ 7] : '.') : ' ',
+                       (left >  8) ? (local_isprint(b[ 8]) ? b[ 8] : '.') : ' ',
+                       (left >  9) ? (local_isprint(b[ 9]) ? b[ 9] : '.') : ' ',
+                       (left > 10) ? (local_isprint(b[10]) ? b[10] : '.') : ' ',
+                       (left > 11) ? (local_isprint(b[11]) ? b[11] : '.') : ' ',
+                       (left > 12) ? (local_isprint(b[12]) ? b[12] : '.') : ' ',
+                       (left > 13) ? (local_isprint(b[13]) ? b[13] : '.') : ' ',
+                       (left > 14) ? (local_isprint(b[14]) ? b[14] : '.') : ' ',
+                       (left > 15) ? (local_isprint(b[15]) ? b[15] : '.') : ' '
                );
                left -= 16;
                b += 16;