DiskTool - Autodetection of filesystems and better debugging
[tpg/acess2.git] / Tools / DiskTool / src / logging.c
index 8f627f2..2b03c6f 100644 (file)
@@ -4,20 +4,26 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <acess_logging.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+#define LOGHDR(col,type)       fprintf(stderr, "\e["col"m[%-8.8s]"type" ", Ident)
+#define LOGTAIL()      fprintf(stderr, "\e[0m\n")
 
 #define PUTERR(col,type)       {\
-       fprintf(stderr, "\e["col"m[%-8.8s]"type" ", Ident); \
+       LOGHDR(col,type);\
        va_list args; va_start(args, Message);\
        vfprintf(stderr, Message, args);\
        va_end(args);\
-       fprintf(stderr, "\e[0m\n"); \
+       LOGTAIL();\
 }
 
 // === CODE ===
 void Log_KernelPanic(const char *Ident, const char *Message, ...) {
        PUTERR("35", "k")
-       exit(-1);
+       abort();
 }
 void Log_Panic(const char *Ident, const char *Message, ...)
        PUTERR("34", "p")
@@ -33,10 +39,163 @@ void Log_Debug(const char *Ident, const char *Message, ...)
        PUTERR("37", "d")
 
 void Warning(const char *Message, ...) {
-       const char *Ident = "WARNING";
-       PUTERR("34", "W")
+       const char *Ident = "";
+       PUTERR("33", "W")
 }
 void Log(const char *Message, ...) {
-       const char *Ident = "LOGLOG";
-       PUTERR("31", "L")
+       const char *Ident = "";
+       PUTERR("37", "L")
+}
+
+void Debug_HexDump(const char *Prefix, const void *Data, size_t Length)
+{
+       const uint8_t *data = Data;
+       size_t  ofs;
+       fprintf(stderr, "[HexDump ]d %s: %i bytes\n", Prefix, (int)Length);
+       for( ofs = 0; ofs + 16 <= Length; ofs += 16 )
+       {
+               fprintf(stderr, "[HexDump ]d %s:", Prefix);
+               fprintf(stderr, "  %02x %02x %02x %02x %02x %02x %02x %02x",
+                       data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
+               data += 8;
+               fprintf(stderr, "  %02x %02x %02x %02x %02x %02x %02x %02x",
+                       data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
+               data += 8;
+               fprintf(stderr, "\n");
+       }
+       
+       fprintf(stderr, "[HexDump ]d %s:", Prefix);
+       for( ; ofs < Length; ofs ++ )
+       {
+               if( ofs % 16 == 8 )     fprintf(stderr, " ");
+               fprintf(stderr, " %02x", data[ofs%16]);
+       }
+       fprintf(stderr, "\n");
+}
+
+ int   giDebug_TraceLevel = 0;
+
+void Debug_TraceEnter(const char *Function, const char *Format, ...)
+{
+       const char *Ident = "Trace";
+       LOGHDR("37","T");
+       for( int i = 0; i < giDebug_TraceLevel; i ++ )
+               fprintf(stderr, " ");
+       fprintf(stderr, "%s: (", Function);
+
+       va_list args;
+       va_start(args, Format);
+       
+       int hasBeenPrev = 0;
+       while(*Format)
+       {
+               while( *Format && isblank(*Format) )
+                       Format ++;
+               if( !*Format )  break;
+               
+               char type = *Format++;
+               const char *start = Format;
+               while( *Format && !isblank(*Format) )
+                       Format ++;
+               
+               if(hasBeenPrev)
+                       fprintf(stderr, ",");
+               hasBeenPrev = 1;
+               
+               fprintf(stderr, "%.*s=", (int)(Format-start), start);
+               switch(type)
+               {
+               case 'p':
+                       fprintf(stderr, "%p", va_arg(args,const void *));
+                       break;
+               case 's':
+                       fprintf(stderr, "\"%s\"", va_arg(args,const char *));
+                       break;
+               case 'i':
+                       fprintf(stderr, "%i", va_arg(args,int));
+                       break;
+               case 'x':
+                       fprintf(stderr, "0x%x", va_arg(args,unsigned int));
+                       break;
+               case 'X':
+                       fprintf(stderr, "0x%"PRIx64, va_arg(args,uint64_t));
+                       break;
+               default:
+                       va_arg(args,uintptr_t);
+                       fprintf(stderr, "?");
+                       break;
+               }
+       }
+
+       va_end(args);
+
+       fprintf(stderr, ")");
+       LOGTAIL();
+       giDebug_TraceLevel ++;
+}
+
+void Debug_TraceLog(const char *Function, const char *Format, ...)
+{
+       const char *Ident = "Trace";
+       LOGHDR("37","T");
+       
+       for( int i = 0; i < giDebug_TraceLevel; i ++ )
+               fprintf(stderr, " ");
+       fprintf(stderr, "%s: ", Function);
+       
+       va_list args;
+       va_start(args, Format);
+
+       vfprintf(stderr, Format, args);
+       
+       va_end(args);
+       LOGTAIL();
 }
+
+void Debug_TraceLeave(const char *Function, char Type, ...)
+{
+       if( giDebug_TraceLevel == 0 ) {
+               Log_Error("Debug", "Function %s called LEAVE without ENTER", Function);
+       }
+       
+       const char *Ident = "Trace";
+       LOGHDR("37","T");
+       
+       va_list args;
+       va_start(args, Type);
+
+       if( giDebug_TraceLevel > 0 )
+       {       
+               giDebug_TraceLevel --;
+               for( int i = 0; i < giDebug_TraceLevel; i ++ )
+                       fprintf(stderr, " ");
+       }
+       fprintf(stderr, "%s: RETURN", Function);
+       switch(Type)
+       {
+       case '-':
+               break;
+       case 'i':
+               fprintf(stderr, " %i", va_arg(args, int));
+               break;
+       case 'x':
+               fprintf(stderr, " 0x%x", va_arg(args, unsigned int));
+               break;
+       case 'X':
+               fprintf(stderr, " 0x%"PRIx64, va_arg(args,uint64_t));
+               break;
+       case 's':
+               fprintf(stderr, " \"%s\"", va_arg(args, const char *));
+               break;
+       case 'p':
+               fprintf(stderr, " %p", va_arg(args, const void *));
+               break;
+       default:
+               fprintf(stderr, " ?");
+               break;
+       }
+       
+       va_end(args);
+       LOGTAIL();
+}
+

UCC git Repository :: git.ucc.asn.au