[freeldr]
[reactos.git] / reactos / boot / freeldr / freeldr / debug.c
index 987ed78..56c5709 100644 (file)
 //#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
@@ -54,6 +42,9 @@ ULONG   DebugPrintMask = 0;
 
 #define BOCHS_OUTPUT_PORT      0xe9
 
+
+static UCHAR DbgChannels[DBG_CHANNELS_COUNT];
+
 ULONG          DebugPort = RS232;
 //ULONG                DebugPort = SCREEN;
 //ULONG                DebugPort = BOCHS;
@@ -66,6 +57,22 @@ BOOLEAN      DebugStartOfLine = TRUE;
 
 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);
@@ -135,7 +142,7 @@ DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, .
        char *ptr = Buffer;
 
        // Mask out unwanted debug messages
-       if (Level >= WARN_LEVEL && !(Mask & DebugPrintMask))
+       if (!(DbgChannels[Mask] & Level) && !(Level & DBG_DEFAULT_LEVELS ))
        {
                return;
        }
@@ -182,7 +189,7 @@ DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length)
        ULONG           Idx2;
 
        // Mask out unwanted debug messages
-       if (!(Mask & DebugPrintMask))
+       if (!(DbgChannels[Mask] & TRACE_LEVEL))
        {
                return;
        }
@@ -306,3 +313,94 @@ KeBugCheckEx(
     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;
+}
+