]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib/display_options.c
"env grep" - add support for regular expression matches
[karo-tx-uboot.git] / lib / display_options.c
index 694d2f22e89ec574f9db84d75de143c52fbf9507..e6d684bd60bdc3e18ef077775d8f532eaeb8d352 100644 (file)
@@ -98,7 +98,8 @@ void print_size(unsigned long long size, const char *s)
  */
 #define MAX_LINE_LENGTH_BYTES (64)
 #define DEFAULT_LINE_LENGTH_BYTES (16)
-int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
+int print_buffer(ulong addr, const void *data, uint width, uint count,
+                uint linelen)
 {
        /* linebuf as a union causes proper alignment */
        union linebuf {
@@ -114,14 +115,15 @@ int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
                linelen = DEFAULT_LINE_LENGTH_BYTES / width;
 
        while (count) {
+               uint thislinelen = linelen;
                printf("%08lx:", addr);
 
                /* check for overflow condition */
-               if (count < linelen)
-                       linelen = count;
+               if (count < thislinelen)
+                       thislinelen = count;
 
                /* Copy from memory into linebuf and print hex values */
-               for (i = 0; i < linelen; i++) {
+               for (i = 0; i < thislinelen; i++) {
                        uint32_t x;
                        if (width == 4)
                                x = lb.ui[i] = *(volatile uint32_t *)data;
@@ -133,8 +135,15 @@ int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
                        data += width;
                }
 
+               while (thislinelen < linelen) {
+                       /* fill line with whitespace for nice ASCII print */
+                       for (i=0; i<width*2+1; i++)
+                               puts(" ");
+                       linelen--;
+               }
+
                /* Print data in ASCII characters */
-               for (i = 0; i < linelen * width; i++) {
+               for (i = 0; i < thislinelen * width; i++) {
                        if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
                                lb.uc[i] = '.';
                }
@@ -142,8 +151,8 @@ int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
                printf("    %s\n", lb.uc);
 
                /* update references */
-               addr += linelen * width;
-               count -= linelen;
+               addr += thislinelen * width;
+               count -= thislinelen;
 
                if (ctrlc())
                        return -1;