From 611ccd1ccb7947c35fec4ef9d097aa3dddcb28d4 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Thu, 14 Sep 2000 22:28:45 +0000 Subject: [PATCH] Rework ber dump to provide both hex and text output --- libraries/liblber/bprint.c | 77 ++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/libraries/liblber/bprint.c b/libraries/liblber/bprint.c index e7569dc377..69c8683b15 100644 --- a/libraries/liblber/bprint.c +++ b/libraries/liblber/bprint.c @@ -136,47 +136,52 @@ ber_bprint( LDAP_CONST char *data, ber_len_t len ) { - static const char hexdig[] = "0123456789abcdef"; -#define BPLEN 48 - char out[ BPLEN ]; - char buf[ BPLEN + sizeof("\t%s\n") ]; - int i = 0; + static const char hexdig[] = "0123456789abcdef"; +#define BP_OFFSET 8 +#define BP_GRAPH 60 +#define BP_LEN 80 + char line[ BP_LEN ]; + ber_len_t i; assert( data != NULL ); - memset( out, '\0', BPLEN ); - for ( ;; ) { - if ( len < 1 ) { - sprintf( buf, "\t%s\n", ( i == 0 ) ? "(end)" : out ); - (*ber_pvt_log_print)( buf ); - break; + /* in case len is zero */ + line[0] = '\n'; + line[1] = '\0'; + + for ( i = 0 ; i < len ; i++ ) { + int n = i % 16; + int off; + + if( !n ) { + if( i ) (*ber_pvt_log_print)( line ); + memset( line, ' ', sizeof(line)-2 ); + line[sizeof(line)-2] = '\n'; + line[sizeof(line)-1] = '\0'; + + off = i % 0x0ffffU; + + line[ 2 ] = hexdig[ ( off & 0xf000U ) >> 12 ]; + line[ 3 ] = hexdig[ ( off & 0x0f00U ) >> 8 ]; + line[ 4 ] = hexdig[ ( off & 0x00f0U ) >> 4 ]; + line[ 5 ] = hexdig[ ( off & 0x000fU ) ]; + line[ 6 ] = ':'; + } + + off = BP_OFFSET + n*3; + line[ off ] = hexdig[ ( data[i] & 0xf0U ) >> 4 ]; + line[ off+1 ] = hexdig[ data[i] & 0x0fU ]; + + off = BP_GRAPH + n; + + if ( isprint( data[i] )) { + line[ BP_GRAPH + n ] = data[i]; + } else { + line[ BP_GRAPH + n ] = '.'; + } } -#ifndef LDAP_HEX - if ( isgraph( (unsigned char)*data )) { - out[ i ] = ' '; - out[ i+1 ] = *data; - } else { -#endif - out[ i ] = hexdig[ ( *data & 0xf0U ) >> 4 ]; - out[ i+1 ] = hexdig[ *data & 0x0fU ]; -#ifndef LDAP_HEX - } -#endif - i += 2; - len--; - data++; - - if ( i > BPLEN - 2 ) { - char data[128 + BPLEN]; - sprintf( data, "\t%s\n", out ); - (*ber_pvt_log_print)(data); - memset( out, '\0', BPLEN ); - i = 0; - continue; - } - out[ i++ ] = ' '; - } + (*ber_pvt_log_print)( line ); } int -- 2.39.5