@ -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 ] ;