X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2FDiskTool%2Fsrc%2Flogging.c;h=2b03c6ff0b4ef16983513c7590b0d1784d30c510;hb=151e0400c6cf69d71a51e49bc75fac3d7bdfc2f7;hp=a7a934e1323af6646fd46adfbc978ff77624ce14;hpb=9d050efae63542b0d69377eec02367e178b88731;p=tpg%2Facess2.git diff --git a/Tools/DiskTool/src/logging.c b/Tools/DiskTool/src/logging.c index a7a934e1..2b03c6ff 100644 --- a/Tools/DiskTool/src/logging.c +++ b/Tools/DiskTool/src/logging.c @@ -6,19 +6,24 @@ #include #include #include +#include +#include + +#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") @@ -68,3 +73,129 @@ void Debug_HexDump(const char *Prefix, const void *Data, size_t Length) 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(); +} +