lkml.org 
[lkml]   [2014]   [Dec]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 3/4] hexdump: do few calculations ahead
    Date
    Instead of doing calculations in each case of different groupsize let's do them
    beforehand. While here, change the switch by if-else-if construction.

    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    ---
    lib/hexdump.c | 34 ++++++++++------------------------
    1 file changed, 10 insertions(+), 24 deletions(-)

    diff --git a/lib/hexdump.c b/lib/hexdump.c
    index a61cb6b..4af53f7 100644
    --- a/lib/hexdump.c
    +++ b/lib/hexdump.c
    @@ -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;
    @@ -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);
    @@ -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];
    --
    2.1.3


    \
     
     \ /
      Last update: 2014-12-29 13:01    [W:4.398 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site