//#define DEBUG_CUSTOM
#define DEBUG_NONE
-#if defined (DEBUG_ALL)
-ULONG DebugPrintMask = DPRINT_WARNING | DPRINT_MEMORY | DPRINT_FILESYSTEM |
- DPRINT_UI | DPRINT_DISK | DPRINT_CACHE | DPRINT_REACTOS |
- DPRINT_LINUX | DPRINT_HWDETECT | DPRINT_PELOADER | DPRINT_WINDOWS;
-#elif defined (DEBUG_INIFILE)
-ULONG DebugPrintMask = DPRINT_INIFILE;
-#elif defined (DEBUG_REACTOS)
-ULONG DebugPrintMask = DPRINT_REACTOS | DPRINT_REGISTRY;
-#elif defined (DEBUG_CUSTOM)
-ULONG DebugPrintMask = DPRINT_WARNING | DPRINT_WINDOWS;
-#else //#elif defined (DEBUG_NONE)
-ULONG DebugPrintMask = 0;
-#endif
+#define DBG_DEFAULT_LEVELS (ERR_LEVEL|FIXME_LEVEL)
#define SCREEN 1
#define RS232 2
#define BOCHS_OUTPUT_PORT 0xe9
+
+static UCHAR DbgChannels[DBG_CHANNELS_COUNT];
+
ULONG DebugPort = RS232;
//ULONG DebugPort = SCREEN;
//ULONG DebugPort = BOCHS;
VOID DebugInit(VOID)
{
+#if defined (DEBUG_ALL)
+ memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT);
+#else
+ memset(DbgChannels, 0, DBG_CHANNELS_COUNT);
+#endif
+
+#if defined (DEBUG_INIFILE)
+ DbgChannels[DPRINT_INIFILE] = MAX_LEVEL;
+#elif defined (DEBUG_REACTOS)
+ DbgChannels[DPRINT_REACTOS] = MAX_LEVEL;
+ DbgChannels[DPRINT_REGISTRY] = MAX_LEVEL;
+#elif defined (DEBUG_CUSTOM)
+ DbgChannels[DPRINT_WARNING] = MAX_LEVEL;
+ DbgChannels[DPRINT_WINDOWS] = MAX_LEVEL;
+#endif
+
if (DebugPort & RS232)
{
Rs232PortInitialize(ComPort, BaudRate);
char *ptr = Buffer;
// Mask out unwanted debug messages
- if (Level >= WARN_LEVEL && !(Mask & DebugPrintMask))
+ if (!(DbgChannels[Mask] & Level) && !(Level & DBG_DEFAULT_LEVELS ))
{
return;
}
ULONG Idx2;
// Mask out unwanted debug messages
- if (!(Mask & DebugPrintMask))
+ if (!(DbgChannels[Mask] & TRACE_LEVEL))
{
return;
}
assert(FALSE);
for (;;);
}
+
+
+static BOOLEAN
+DbgAddDebugChannel( CHAR* channel, CHAR* level, CHAR op)
+{
+ int iLevel, iChannel;
+
+ if(channel == NULL || *channel == L'\0' ||strlen(channel) == 0 )
+ return FALSE;
+
+ if(level == NULL || *level == L'\0' ||strlen(level) == 0 )
+ iLevel = MAX_LEVEL;
+ else if(strcmp(level, "err") == 0)
+ iLevel = ERR_LEVEL;
+ else if(strcmp(level, "fixme") == 0)
+ iLevel = FIXME_LEVEL;
+ else if(strcmp(level, "warn") == 0)
+ iLevel = WARN_LEVEL;
+ else if (strcmp(level, "trace") == 0)
+ iLevel = TRACE_LEVEL;
+ else
+ return FALSE;
+
+ if(strcmp(channel, "memory") == 0) iChannel = DPRINT_MEMORY;
+ else if(strcmp(channel, "filesystem") == 0) iChannel = DPRINT_FILESYSTEM;
+ else if(strcmp(channel, "inifile") == 0) iChannel = DPRINT_INIFILE;
+ else if(strcmp(channel, "ui") == 0) iChannel = DPRINT_UI;
+ else if(strcmp(channel, "disk") == 0) iChannel = DPRINT_DISK;
+ else if(strcmp(channel, "cache") == 0) iChannel = DPRINT_CACHE;
+ else if(strcmp(channel, "registry") == 0) iChannel = DPRINT_REGISTRY;
+ else if(strcmp(channel, "linux") == 0) iChannel = DPRINT_LINUX;
+ else if(strcmp(channel, "hwdetect") == 0) iChannel = DPRINT_HWDETECT;
+ else if(strcmp(channel, "windows") == 0) iChannel = DPRINT_WINDOWS;
+ else if(strcmp(channel, "peloader") == 0) iChannel = DPRINT_PELOADER;
+ else if(strcmp(channel, "scsiport") == 0) iChannel = DPRINT_SCSIPORT;
+ else if(strcmp(channel, "heap") == 0) iChannel = DPRINT_HEAP;
+ else if(strcmp(channel, "all") == 0)
+ {
+ int i;
+
+ for(i= 0 ; i < DBG_CHANNELS_COUNT; i++)
+ {
+ if(op==L'+')
+ DbgChannels[i] |= iLevel;
+ else
+ DbgChannels[i] &= ~iLevel;
+ }
+
+ return TRUE;
+ }
+
+ if(op==L'+')
+ DbgChannels[iChannel] |= iLevel;
+ else
+ DbgChannels[iChannel] &= ~iLevel;
+
+ return TRUE;
+}
+
+BOOLEAN
+DbgParseDebugChannels(PCHAR Value)
+{
+ CHAR *str, *separator, *c, op;
+
+ str = Value;
+
+ do
+ {
+ separator = strchr(str, L',');
+ if(separator != NULL)
+ *separator = L'\0';
+
+ c = strchr(str, L'+');
+ if(c == NULL)
+ c = strchr(str, L'-');
+
+ if(c != NULL)
+ {
+ op = *c;
+ *c = L'\0';
+ c++;
+
+ DbgAddDebugChannel(c, str, op);
+ }
+
+ str = separator + 1;
+ }while(separator != NULL);
+
+ return TRUE;
+}
+