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

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