Improve hex_dump().
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 20 Sep 2004 18:03:32 +0000 (18:03 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 20 Sep 2004 18:03:32 +0000 (18:03 +0000)
src/filesys/fsutil.c
src/lib/kernel/bitmap.c
src/lib/stdio.c
src/lib/stdio.h

index 63363465388d658640260c6631cebbc3cab12116..cc0e33500eb2a6ffad699e4342cd84cc40d22bf8 100644 (file)
@@ -167,7 +167,7 @@ fsutil_print (const char *filename)
       if (n == 0)
         break;
 
-      hex_dump (buffer, n, true);
+      hex_dump (0, buffer, n, true);
     }
   palloc_free (buffer);
   file_close (file);
index 3690a3a37c71500efeaa031fdaa2aeff2971c5dc..f1fa1130bbe107a53e862b807bdec3f7e2fa5fdb 100644 (file)
@@ -323,5 +323,5 @@ bitmap_write (const struct bitmap *b, struct file *file)
 void
 bitmap_dump (const struct bitmap *b) 
 {
-  hex_dump (b->bits, byte_cnt (b), false);
+  hex_dump (0, b->bits, byte_cnt (b), false);
 }
index d223d1065a61ca2f6df986bc219aad0b48f0afdd..034374d7aa9011b836890529523e372a64afebdf 100644 (file)
@@ -1,5 +1,7 @@
-#include <ctype.h>
 #include <stdio.h>
+#include <ctype.h>
+#include <inttypes.h>
+#include <round.h>
 #include <stdint.h>
 #include <string.h>
 
@@ -553,39 +555,53 @@ __printf (const char *format,
   va_end (args);
 }
 \f
-/* Dumps the SIZE bytes in BUFFER to the console as hex bytes
-   arranged 16 per line.  If ASCII is true then the corresponding
+/* Dumps the SIZE bytes in BUF to the console as hex bytes
+   arranged 16 per line, plus offsets listed starting at OFS for
+   the first byte in BU.  If ASCII is true then the corresponding
    ASCII characters are also rendered alongside. */   
 void
-hex_dump (const void *buffer, size_t size, bool ascii)
+hex_dump (uintptr_t ofs, const void *buf_, size_t size, bool ascii)
 {
-  const size_t n_per_line = 16; /* Maximum bytes per line. */
-  size_t n;                     /* Number of bytes in this line. */
-  const uint8_t *p;             /* Start of current line in buffer. */
+  const uint8_t *buf = buf_;
+  const size_t per_line = 16; /* Maximum bytes per line. */
 
-  for (p = buffer; p < (uint8_t *) buffer + size; p += n) 
+  while (size > 0)
     {
+      size_t start, end, n;
       size_t i;
-
+      
       /* Number of bytes on this line. */
-      n = (uint8_t *) (buffer + size) - p;
-      if (n > n_per_line)
-        n = n_per_line;
+      start = ofs % per_line;
+      end = per_line;
+      if (end - start > size)
+        end = start + size;
+      n = end - start;
 
       /* Print line. */
-      for (i = 0; i < n; i++) 
-        printf ("%c%02x", i == n_per_line / 2 ? '-' : ' ', (unsigned) p[i]);
+      printf ("%08jx  ", (uintmax_t) ROUND_DOWN (ofs, per_line));
+      for (i = 0; i < start; i++)
+        printf ("   ");
+      for (; i < end; i++) 
+        printf ("%02hhx%c",
+                buf[i - start], i == per_line / 2 - 1? '-' : ' ');
       if (ascii) 
         {
-          for (; i < n_per_line; i++)
+          for (; i < per_line; i++)
             printf ("   ");
-          printf (" |");
-          for (i = 0; i < n; i++)
-            printf ("%c", isprint (p[i]) ? p[i] : '.');
-          for (; i < n_per_line; i++)
+          printf ("|");
+          for (i = 0; i < start; i++)
+            printf (" ");
+          for (; i < end; i++)
+            printf ("%c",
+                    isprint (buf[i - start]) ? buf[i - start] : '.');
+          for (; i < per_line; i++)
             printf (" ");
           printf ("|");
         }
       printf ("\n");
+
+      ofs += n;
+      buf += n;
+      size -= n;
     }
 }
index cf6c49e3ef7841360f6856b2ecb009c88d7bb1e0..31be6d8353df7df90e3bde34c6860d1c6c24ad1b 100644 (file)
@@ -2,9 +2,10 @@
 #define __LIB_STDIO_H
 
 #include <debug.h>
+#include <stdarg.h>
 #include <stdbool.h>
 #include <stddef.h>
-#include <stdarg.h>
+#include <stdint.h>
 
 /* Predefined file handles. */
 #define STDIN_FILENO 0
@@ -26,7 +27,7 @@ void putbuf (const char *, size_t);
 int hprintf (int, const char *, ...) PRINTF_FORMAT (2, 3);
 int vhprintf (int, const char *, va_list) PRINTF_FORMAT (2, 0);
 #endif
-void hex_dump (const void *, size_t size, bool ascii);
+void hex_dump (uintptr_t ofs, const void *, size_t size, bool ascii);
 
 /* Internal functions. */
 void __vprintf (const char *format, va_list args,