#include <stdio.h>
#include <stdarg.h>
#include <string.h>
+#include <assert.h>
+#include <ctype.h>
#include "log.h"
LogPrintf("\n");
}
-void LogHexString(const char *data, unsigned long len)
+void LogHexString(int level, const char *data, unsigned long len)
{
+ static const char hexdig[] = "0123456789abcdef";
+#define BP_OFFSET 9
+#define BP_GRAPH 60
+#define BP_LEN 80
+ char line[BP_LEN];
unsigned long i;
- if ( debuglevel==LOGCRIT )
+
+ if ( !data || level > debuglevel )
return;
- for(i=0; i<len; i++) {
- LogPrintf("%02X ", (unsigned char)data[i]);
- }
- LogPrintf("\n");
- for(i=0; i<len; i++) {
- LogPrintf("%c", (unsigned char)data[i]);
+ /* in case len is zero */
+ line[0] = '\n';
+ line[1] = '\0';
+
+ for ( i = 0 ; i < len ; i++ ) {
+ int n = i % 16;
+ unsigned off;
+
+ if( !n ) {
+ if( i ) LogPrintf( "%s", line );
+ memset( line, ' ', sizeof(line)-2 );
+ line[sizeof(line)-2] = '\n';
+ line[sizeof(line)-1] = '\0';
+
+ off = i % 0x0ffffU;
+
+ line[2] = hexdig[0x0f & (off >> 12)];
+ line[3] = hexdig[0x0f & (off >> 8)];
+ line[4] = hexdig[0x0f & (off >> 4)];
+ line[5] = hexdig[0x0f & off];
+ line[6] = ':';
+ }
+
+ off = BP_OFFSET + n*3 + ((n >= 8)?1:0);
+ line[off] = hexdig[0x0f & ( data[i] >> 4 )];
+ line[off+1] = hexdig[0x0f & data[i]];
+
+ off = BP_GRAPH + n + ((n >= 8)?1:0);
+
+ if ( isprint( (unsigned char) data[i] )) {
+ line[BP_GRAPH + n] = data[i];
+ } else {
+ line[BP_GRAPH + n] = '.';
+ }
}
- LogPrintf("\n");
+
+ LogPrintf( "%s", line );
}
#define LOGERROR 1
#define LOGWARNING 2
#define LOGINFO 3
-#define LOGDEBUG 4
-#define LOGALL 5
+#define LOGDEBUG 4
+#define LOGDEBUG2 5
+#define LOGALL 6
#define Log AMF_Log
#define LogHex AMF_LogHex
void LogStatus(const char *format, ...);
void Log(int level, const char *format, ...);
void LogHex(int level, const char *data, unsigned long len);
-void LogHexString(const char *data, unsigned long len);
+void LogHexString(int level, const char *data, unsigned long len);
#ifdef __cplusplus
}