fde905525cfa8bbc17e1630d19a8360ba2165814
[tpg/acess2.git] / Tools / DiskTool / src / logging.c
1 /*
2  * 
3  */
4 #include <stdio.h>
5 #include <stdarg.h>
6 #include <stdlib.h>
7 #include <stdint.h>
8 #include <acess_logging.h>
9 #include <ctype.h>
10
11 #define LOGHDR(col,type)        fprintf(stderr, "\e["col"m[%-8.8s]"type" ", Ident)
12 #define LOGTAIL()       fprintf(stderr, "\e[0m\n")
13
14 #define PUTERR(col,type)        {\
15         LOGHDR(col,type);\
16         va_list args; va_start(args, Message);\
17         vfprintf(stderr, Message, args);\
18         va_end(args);\
19         LOGTAIL();\
20 }
21
22 // === CODE ===
23 void Log_KernelPanic(const char *Ident, const char *Message, ...) {
24         PUTERR("35", "k")
25         exit(-1);
26 }
27 void Log_Panic(const char *Ident, const char *Message, ...)
28         PUTERR("34", "p")
29 void Log_Error(const char *Ident, const char *Message, ...)
30         PUTERR("31", "e")
31 void Log_Warning(const char *Ident, const char *Message, ...)
32         PUTERR("33", "w")
33 void Log_Notice(const char *Ident, const char *Message, ...)
34         PUTERR("32", "n")
35 void Log_Log(const char *Ident, const char *Message, ...)
36         PUTERR("37", "l")
37 void Log_Debug(const char *Ident, const char *Message, ...)
38         PUTERR("37", "d")
39
40 void Warning(const char *Message, ...) {
41         const char *Ident = "";
42         PUTERR("33", "W")
43 }
44 void Log(const char *Message, ...) {
45         const char *Ident = "";
46         PUTERR("37", "L")
47 }
48
49 void Debug_HexDump(const char *Prefix, const void *Data, size_t Length)
50 {
51         const uint8_t *data = Data;
52         size_t  ofs;
53         fprintf(stderr, "[HexDump ]d %s: %i bytes\n", Prefix, (int)Length);
54         for( ofs = 0; ofs + 16 <= Length; ofs += 16 )
55         {
56                 fprintf(stderr, "[HexDump ]d %s:", Prefix);
57                 fprintf(stderr, "  %02x %02x %02x %02x %02x %02x %02x %02x",
58                         data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
59                 data += 8;
60                 fprintf(stderr, "  %02x %02x %02x %02x %02x %02x %02x %02x",
61                         data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
62                 data += 8;
63                 fprintf(stderr, "\n");
64         }
65         
66         fprintf(stderr, "[HexDump ]d %s:", Prefix);
67         for( ; ofs < Length; ofs ++ )
68         {
69                 if( ofs % 16 == 8 )     fprintf(stderr, " ");
70                 fprintf(stderr, " %02x", data[ofs%16]);
71         }
72         fprintf(stderr, "\n");
73 }
74
75  int    giDebug_TraceLevel = 0;
76
77 void Debug_TraceEnter(const char *Function, const char *Format, ...)
78 {
79         const char *Ident = "Trace";
80         LOGHDR("37","T");
81         for( int i = 0; i < giDebug_TraceLevel; i ++ )
82                 fprintf(stderr, " ");
83         fprintf(stderr, "%s: (", Function);
84
85         va_list args;
86         va_start(args, Format);
87         
88         int hasBeenPrev = 0;
89         while(*Format)
90         {
91                 while( *Format && isblank(*Format) )
92                         Format ++;
93                 if( !*Format )  break;
94                 
95                 char type = *Format++;
96                 const char *start = Format;
97                 while( *Format && !isblank(*Format) )
98                         Format ++;
99                 
100                 if(hasBeenPrev)
101                         fprintf(stderr, ",");
102                 hasBeenPrev = 1;
103                 
104                 fprintf(stderr, "%.*s=", (int)(Format-start), start);
105                 switch(type)
106                 {
107                 case 'p':
108                         fprintf(stderr, "%p", va_arg(args,const void *));
109                         break;
110                 case 's':
111                         fprintf(stderr, "\"%s\"", va_arg(args,const char *));
112                         break;
113                 case 'i':
114                         fprintf(stderr, "%i", va_arg(args,int));
115                         break;
116                 case 'x':
117                         fprintf(stderr, "0x%x", va_arg(args,unsigned int));
118                         break;
119                 default:
120                         va_arg(args,uintptr_t);
121                         fprintf(stderr, "?");
122                         break;
123                 }
124         }
125
126         va_end(args);
127
128         fprintf(stderr, ")");
129         LOGTAIL();
130         giDebug_TraceLevel ++;
131 }
132
133 void Debug_TraceLog(const char *Function, const char *Format, ...)
134 {
135         const char *Ident = "Trace";
136         LOGHDR("37","T");
137         
138         for( int i = 0; i < giDebug_TraceLevel; i ++ )
139                 fprintf(stderr, " ");
140         fprintf(stderr, "%s: ", Function);
141         
142         va_list args;
143         va_start(args, Format);
144
145         vfprintf(stderr, Format, args);
146         
147         va_end(args);
148         LOGTAIL();
149 }
150
151 void Debug_TraceLeave(const char *Function, char Type, ...)
152 {
153         if( giDebug_TraceLevel == 0 ) {
154                 Log_Error("Debug", "Function %s called LEAVE without ENTER", Function);
155         }
156         
157         const char *Ident = "Trace";
158         LOGHDR("37","T");
159         
160         va_list args;
161         va_start(args, Type);
162
163         if( giDebug_TraceLevel > 0 )
164         {       
165                 giDebug_TraceLevel --;
166                 for( int i = 0; i < giDebug_TraceLevel; i ++ )
167                         fprintf(stderr, " ");
168         }
169         fprintf(stderr, "%s: RETURN", Function);
170         switch(Type)
171         {
172         case '-':
173                 break;
174         case 'i':
175                 fprintf(stderr, " %i", va_arg(args, int));
176                 break;
177         case 'x':
178                 fprintf(stderr, " 0x%x", va_arg(args, unsigned int));
179                 break;
180         case 's':
181                 fprintf(stderr, " \"%s\"", va_arg(args, const char *));
182                 break;
183         case 'p':
184                 fprintf(stderr, " %p", va_arg(args, const void *));
185                 break;
186         default:
187                 fprintf(stderr, " ?");
188                 break;
189         }
190         
191         va_end(args);
192         LOGTAIL();
193 }
194

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