1 /***************************************************************************
3 openurl.library - universal URL display and browser launcher library
4 Copyright (C) 1998-2005 by Troels Walsted Hansen, et al.
5 Copyright (C) 2005-2013 by openurl.library Open Source Team
7 This library is free software; it has been placed in the public domain
8 and you can freely redistribute it and/or modify it. Please note, however,
9 that some components may be under the LGPL or GPL license.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 openurl.library project: http://sourceforge.net/projects/openurllib/
19 ***************************************************************************/
28 #include <proto/utility.h>
29 #include <proto/dos.h>
30 #include <proto/exec.h>
37 // our static variables with default values
38 static int indent_level
= 0;
39 static BOOL ansi_output
= FALSE
;
40 static ULONG debug_flags
= DBF_ALWAYS
| DBF_STARTUP
; // default debug flags
41 static ULONG debug_classes
= DBC_ERROR
| DBC_DEBUG
| DBC_WARNING
| DBC_ASSERT
| DBC_REPORT
; // default debug classes
43 /****************************************************************************/
49 kprintf("** openurl.prefs %s (%s) startup ****************************\n", LIB_REV_STRING
, LIB_DATE
);
50 kprintf("Initializing runtime debugging:\n");
52 if(GetVar("openurl.prefs.debug", var
, sizeof(var
), 0) > 0)
56 // static list of our debugging classes tokens.
57 // in the yamdebug variable these classes always start with a @
58 static struct { const char *token
; unsigned long flag
; } dbclasses
[] =
60 { "ctrace", DBC_CTRACE
},
61 { "report", DBC_REPORT
},
62 { "assert", DBC_ASSERT
},
63 { "timeval", DBC_TIMEVAL
},
64 { "debug", DBC_DEBUG
},
65 { "error", DBC_ERROR
},
66 { "warning", DBC_WARNING
},
71 static struct { const char *token
; unsigned long flag
; } dbflags
[] =
73 { "always", DBF_ALWAYS
},
74 { "startup", DBF_STARTUP
},
79 // we parse the env variable token-wise
85 if((e
= strpbrk(s
, " ,;")) == NULL
)
88 // check if the token is class definition or
89 // just a flag definition
94 // check if this call is a negation or not
99 // search for the token and clear the flag
100 for(i
=0; dbclasses
[i
].token
; i
++)
102 if(strnicmp(s
, dbclasses
[i
].token
, strlen(dbclasses
[i
].token
)) == 0)
104 kprintf("clear '%s' debug class flag.\n", dbclasses
[i
].token
);
105 CLEAR_FLAG(debug_classes
, dbclasses
[i
].flag
);
111 // search for the token and set the flag
112 for(i
=0; dbclasses
[i
].token
; i
++)
114 if(strnicmp(s
, dbclasses
[i
].token
, strlen(dbclasses
[i
].token
)) == 0)
116 kprintf("set '%s' debug class flag\n", dbclasses
[i
].token
);
117 SET_FLAG(debug_classes
, dbclasses
[i
].flag
);
124 // check if this call is a negation or not
129 for(i
=0; dbflags
[i
].token
; i
++)
131 if(strnicmp(s
, dbflags
[i
].token
, strlen(dbflags
[i
].token
)) == 0)
133 kprintf("clear '%s' debug flag\n", dbflags
[i
].token
);
134 CLEAR_FLAG(debug_flags
, dbflags
[i
].flag
);
140 // check if the token was "ansi" and if so enable the ANSI color
142 if(strnicmp(s
, "ansi", 4) == 0)
144 kprintf("ansi output enabled\n");
149 for(i
=0; dbflags
[i
].token
; i
++)
151 if(strnicmp(s
, dbflags
[i
].token
, strlen(dbflags
[i
].token
)) == 0)
153 kprintf("set '%s' debug flag\n", dbflags
[i
].token
);
154 SET_FLAG(debug_flags
, dbflags
[i
].flag
);
161 // set the next start to our last search
169 kprintf("set debug classes/flags (env:openurl.prefs.debug): %08lx/%08lx\n", debug_classes
, debug_flags
);
170 kprintf("** Normal processing follows ***************************************\n");
173 /****************************************************************************/
175 // define variables for using ANSI colors in our debugging scheme
176 #define ANSI_ESC_CLR "\033[0m"
177 #define ANSI_ESC_BOLD "\033[1m"
178 #define ANSI_ESC_UNDERLINE "\033[4m"
179 #define ANSI_ESC_BLINK "\033[5m"
180 #define ANSI_ESC_REVERSE "\033[7m"
181 #define ANSI_ESC_INVISIBLE "\033[8m"
182 #define ANSI_ESC_FG_BLACK "\033[0;30m"
183 #define ANSI_ESC_FG_RED "\033[0;31m"
184 #define ANSI_ESC_FG_GREEN "\033[0;32m"
185 #define ANSI_ESC_FG_BROWN "\033[0;33m"
186 #define ANSI_ESC_FG_BLUE "\033[0;34m"
187 #define ANSI_ESC_FG_PURPLE "\033[0;35m"
188 #define ANSI_ESC_FG_CYAN "\033[0;36m"
189 #define ANSI_ESC_FG_LGRAY "\033[0;37m"
190 #define ANSI_ESC_FG_DGRAY "\033[1;30m"
191 #define ANSI_ESC_FG_LRED "\033[1;31m"
192 #define ANSI_ESC_FG_LGREEN "\033[1;32m"
193 #define ANSI_ESC_FG_YELLOW "\033[1;33m"
194 #define ANSI_ESC_FG_LBLUE "\033[1;34m"
195 #define ANSI_ESC_FG_LPURPLE "\033[1;35m"
196 #define ANSI_ESC_FG_LCYAN "\033[1;36m"
197 #define ANSI_ESC_FG_WHITE "\033[1;37m"
198 #define ANSI_ESC_BG "\033[0;4" // background esc-squ start with 4x
199 #define ANSI_ESC_BG_BLACK "\033[0;40m"
200 #define ANSI_ESC_BG_RED "\033[0;41m"
201 #define ANSI_ESC_BG_GREEN "\033[0;42m"
202 #define ANSI_ESC_BG_BROWN "\033[0;43m"
203 #define ANSI_ESC_BG_BLUE "\033[0;44m"
204 #define ANSI_ESC_BG_PURPLE "\033[0;45m"
205 #define ANSI_ESC_BG_CYAN "\033[0;46m"
206 #define ANSI_ESC_BG_LGRAY "\033[0;47m"
208 /****************************************************************************/
210 INLINE
void _INDENT(void)
213 for(i
=0; i
< indent_level
; i
++)
217 /****************************************************************************/
219 void _ENTER(unsigned long dclass
, const char *file
, int line
, const char *function
)
221 if(isFlagSet(debug_classes
, dclass
))
225 kprintf("%s%s:%ld:Entering %s%s\n", ANSI_ESC_FG_BROWN
, file
, line
, function
, ANSI_ESC_CLR
);
227 kprintf("%s:%ld:Entering %s\n", file
, line
, function
);
233 void _LEAVE(unsigned long dclass
, const char *file
, int line
, const char *function
)
237 if(isFlagSet(debug_classes
, dclass
))
241 kprintf("%s%s:%ld:Leaving %s%s\n", ANSI_ESC_FG_BROWN
, file
, line
, function
, ANSI_ESC_CLR
);
243 kprintf("%s:%ld:Leaving %s\n", file
, line
, function
);
247 void _RETURN(unsigned long dclass
, const char *file
, int line
, const char *function
, unsigned long result
)
251 if(isFlagSet(debug_classes
, dclass
))
255 kprintf("%s%s:%ld:Leaving %s (result 0x%08lx, %ld)%s\n", ANSI_ESC_FG_BROWN
, file
, line
, function
, result
, result
, ANSI_ESC_CLR
);
257 kprintf("%s:%ld:Leaving %s (result 0x%08lx, %ld)\n", file
, line
, function
, result
, result
);
261 /****************************************************************************/
263 void _SHOWVALUE(unsigned long dclass
, unsigned long dflags
, unsigned long value
, int size
, const char *name
, const char *file
, int line
)
265 if(isFlagSet(debug_classes
, dclass
) &&
266 isFlagSet(debug_flags
, dflags
))
273 fmt
= "%s:%ld:%s = %ld, 0x%02lx";
277 fmt
= "%s:%ld:%s = %ld, 0x%04lx";
281 fmt
= "%s:%ld:%s = %ld, 0x%08lx";
288 kprintf(ANSI_ESC_FG_GREEN
);
290 kprintf(fmt
, file
, line
, name
, value
, value
);
292 if(size
== 1 && value
< 256)
294 if(value
< ' ' || (value
>= 127 && value
< 160))
295 kprintf(", '\\x%02lx'", value
);
297 kprintf(", '%lc'", value
);
301 kprintf("%s\n", ANSI_ESC_CLR
);
307 /****************************************************************************/
309 void _SHOWPOINTER(unsigned long dclass
, unsigned long dflags
, const void *p
, const char *name
, const char *file
, int line
)
311 if(isFlagSet(debug_classes
, dclass
) &&
312 isFlagSet(debug_flags
, dflags
))
319 fmt
= "%s:%ld:%s = 0x%08lx\n";
321 fmt
= "%s:%ld:%s = NULL\n";
325 kprintf(ANSI_ESC_FG_GREEN
);
326 kprintf(fmt
, file
, line
, name
, p
);
327 kprintf(ANSI_ESC_CLR
);
330 kprintf(fmt
, file
, line
, name
, p
);
334 /****************************************************************************/
336 void _SHOWSTRING(unsigned long dclass
, unsigned long dflags
, const char *string
, const char *name
, const char *file
, int line
)
338 if(isFlagSet(debug_classes
, dclass
) &&
339 isFlagSet(debug_flags
, dflags
))
344 kprintf("%s%s:%ld:%s = 0x%08lx \"%s\"%s\n", ANSI_ESC_FG_GREEN
, file
, line
, name
, string
, string
, ANSI_ESC_CLR
);
346 kprintf("%s:%ld:%s = 0x%08lx \"%s\"\n", file
, line
, name
, string
, string
);
350 /****************************************************************************/
352 void _SHOWMSG(unsigned long dclass
, unsigned long dflags
, const char *msg
, const char *file
, int line
)
354 if(isFlagSet(debug_classes
, dclass
) &&
355 isFlagSet(debug_flags
, dflags
))
360 kprintf("%s%s:%ld:%s%s\n", ANSI_ESC_FG_GREEN
, file
, line
, msg
, ANSI_ESC_CLR
);
362 kprintf("%s:%ld:%s\n", file
, line
, msg
);
366 /****************************************************************************/
368 void _DPRINTF(unsigned long dclass
, unsigned long dflags
, const char *file
, int line
, const char *format
, ...)
370 if((isFlagSet(debug_classes
, dclass
) && isFlagSet(debug_flags
, dflags
)) ||
371 (isFlagSet(dclass
, DBC_ERROR
) || isFlagSet(dclass
, DBC_WARNING
)))
374 static char buf
[1024];
378 va_start(args
, format
);
379 vsnprintf(buf
, 1024, format
, args
);
384 const char *highlight
= ANSI_ESC_FG_GREEN
;
388 case DBC_CTRACE
: highlight
= ANSI_ESC_FG_BROWN
; break;
389 case DBC_REPORT
: highlight
= ANSI_ESC_FG_GREEN
; break;
390 case DBC_ASSERT
: highlight
= ANSI_ESC_FG_RED
; break;
391 case DBC_TIMEVAL
: highlight
= ANSI_ESC_FG_GREEN
; break;
392 case DBC_DEBUG
: highlight
= ANSI_ESC_FG_GREEN
; break;
393 case DBC_ERROR
: highlight
= ANSI_ESC_FG_RED
; break;
394 case DBC_WARNING
: highlight
= ANSI_ESC_FG_PURPLE
;break;
397 kprintf("%s%s:%ld:%s%s\n", highlight
, file
, line
, buf
, ANSI_ESC_CLR
);
400 kprintf("%s:%ld:%s\n", file
, line
, buf
);
404 /****************************************************************************/