Skip to content

Commit

Permalink
hexdump: do a few calculations ahead
Browse files Browse the repository at this point in the history
Instead of doing calculations in each case of different groupsize let's do
them beforehand.  While there, change the switch to an if-else-if
construction.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
andy-shev authored and torvalds committed Feb 13, 2015
1 parent 6f6f3fc commit 5d909c8
Showing 1 changed file with 10 additions and 24 deletions.
34 changes: 10 additions & 24 deletions lib/hexdump.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ void hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
bool ascii)
{
const u8 *ptr = buf;
int ngroups;
u8 ch;
int j, lx = 0;
int ascii_column;
Expand All @@ -114,45 +115,33 @@ void hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
goto nil;
if (len > rowsize) /* limit to one line at a time */
len = rowsize;
if (!is_power_of_2(groupsize) || groupsize > 8)
groupsize = 1;
if ((len % groupsize) != 0) /* no mixed size output */
groupsize = 1;

switch (groupsize) {
case 8: {
ngroups = len / groupsize;
ascii_column = rowsize * 2 + rowsize / groupsize + 1;
if (groupsize == 8) {
const u64 *ptr8 = buf;
int ngroups = len / groupsize;

for (j = 0; j < ngroups; j++)
lx += scnprintf(linebuf + lx, linebuflen - lx,
"%s%16.16llx", j ? " " : "",
(unsigned long long)*(ptr8 + j));
ascii_column = rowsize * 2 + rowsize / 8 + 2;
break;
}

case 4: {
} else if (groupsize == 4) {
const u32 *ptr4 = buf;
int ngroups = len / groupsize;

for (j = 0; j < ngroups; j++)
lx += scnprintf(linebuf + lx, linebuflen - lx,
"%s%8.8x", j ? " " : "", *(ptr4 + j));
ascii_column = rowsize * 2 + rowsize / 4 + 2;
break;
}

case 2: {
} else if (groupsize == 2) {
const u16 *ptr2 = buf;
int ngroups = len / groupsize;

for (j = 0; j < ngroups; j++)
lx += scnprintf(linebuf + lx, linebuflen - lx,
"%s%4.4x", j ? " " : "", *(ptr2 + j));
ascii_column = rowsize * 2 + rowsize / 2 + 2;
break;
}

default:
} else {
for (j = 0; (j < len) && (lx + 3) <= linebuflen; j++) {
ch = ptr[j];
linebuf[lx++] = hex_asc_hi(ch);
Expand All @@ -161,14 +150,11 @@ void hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
}
if (j)
lx--;

ascii_column = 3 * rowsize + 2;
break;
}
if (!ascii)
goto nil;

while (lx < (linebuflen - 1) && lx < (ascii_column - 1))
while (lx < (linebuflen - 1) && lx < ascii_column)
linebuf[lx++] = ' ';
for (j = 0; (j < len) && (lx + 2) < linebuflen; j++) {
ch = ptr[j];
Expand Down

0 comments on commit 5d909c8

Please sign in to comment.