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

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