Extend TRACEs for Winelib applications

Francois Gouget fgouget at free.fr
Mon Jan 21 02:34:22 CST 2002


   This patch makes it possible to use Wine's trace mechanism when
writing Winelib applications. That's pretty nice as Wine's trace
mechanism is quite sophisticated. The only hurdle is that things like
ERR, WARN, etc. are very, very, very likely to clash. Well, TRACE does
clash with the MFC for instance.
   So I renamed everything with the standard WINE_ and __WINE_ prefixes.
Then, because it would really be a pain to rename every single
ERR/WARN/TRACE call in Wine, debugtools.h provides synonyms that don't
have the prefix when we compile Wine.

   It's all pretty painless except that there are a couple of files
(pidl.c and shellord.c) that use the debugtools internal API! Naughty,
naughty.

   I did not modify include/Makefile.in to install debugtools.h though.
I believe we should move it to include/wine before we do that (but
everyone is compiling against the Wine source tree anyway, right?). And
maybe we could rename it to something else? 'winetrace.h', 'traces.h',
'debug.h'?



Changelog:

 * dlls/ntdll/debugtools.c,
   dlls/shell32/pidl.c,
   dlls/shell32/shellord.c,
   include/debugtools.h,
   misc/options.c

   Make the Wine trace facilities accessible from Winelib applications



--
Francois Gouget         fgouget at free.fr        http://fgouget.free.fr/
                         Stolen from an Internet user:
              "f u cn rd ths, u cn gt a gd jb n cmptr prgrmmng !"
-------------- next part --------------
Index: dlls/ntdll/debugtools.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/debugtools.c,v
retrieving revision 1.14
diff -u -r1.14 debugtools.c
--- dlls/ntdll/debugtools.c	2002/01/07 18:03:14	1.14
+++ dlls/ntdll/debugtools.c	2002/01/21 05:08:44
@@ -296,17 +296,17 @@
 /***********************************************************************
  *		wine_dbg_log (NTDLL.@)
  */
-int wine_dbg_log(enum __DEBUG_CLASS cls, const char *channel,
+int wine_dbg_log(enum __WINE_DEBUG_CLASS cls, const char *channel,
                  const char *function, const char *format, ... )
 {
-    static const char *classes[__DBCL_COUNT] = { "fixme", "err", "warn", "trace" };
+    static const char *classes[__WINE_DBCL_COUNT] = { "fixme", "err", "warn", "trace" };
     va_list valist;
     int ret = 0;
 
     va_start(valist, format);
     if (TRACE_ON(tid))
         ret = wine_dbg_printf( "%08lx:", (DWORD)NtCurrentTeb()->tid );
-    if (cls < __DBCL_COUNT)
+    if (cls < __WINE_DBCL_COUNT)
         ret += wine_dbg_printf( "%s:%s:%s ", classes[cls], channel + 1, function );
     if (format)
         ret += wine_dbg_vprintf( format, valist );
Index: dlls/shell32/pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.63
diff -u -r1.63 pidl.c
--- dlls/shell32/pidl.c	2001/11/06 22:31:20	1.63
+++ dlls/shell32/pidl.c	2002/01/21 05:08:45
@@ -37,8 +37,8 @@
 
 	/* silence the sub-functions */
 	bIsShellDebug = TRACE_ON(shell);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, FALSE);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, FALSE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_shell, FALSE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, FALSE);
 
 	if (! pidltemp)
 	{
@@ -78,8 +78,8 @@
 	  pcheck(pidl);
 	}
 
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, bIsShellDebug);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, TRUE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_shell, bIsShellDebug);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, TRUE);
 
 }
 #define BYTES_PRINTED 32
@@ -90,7 +90,7 @@
         LPITEMIDLIST pidltemp = pidl;
 
 	bIsPidlDebug = TRACE_ON(shell);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, FALSE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, FALSE);
 
         if (pidltemp && pidltemp->mkid.cb)
         { do
@@ -137,7 +137,7 @@
 	    pidltemp = ILGetNext(pidltemp);
 	  } while (pidltemp->mkid.cb);
 	}
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, bIsPidlDebug);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, bIsPidlDebug);
 	return ret;
 }
 
Index: dlls/shell32/shellord.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shellord.c,v
retrieving revision 1.90
diff -u -r1.90 shellord.c
--- dlls/shell32/shellord.c	2002/01/03 02:33:51	1.90
+++ dlls/shell32/shellord.c	2002/01/21 05:08:46
@@ -1476,14 +1476,14 @@
 	TRACE("(%p, %ld, %p, %p)\n", pidlFolder, cpidlFiles,
 	      lppidlFiles, ppdataObject);
 	boldpidl = TRACE_ON(pidl);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, FALSE);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, TRUE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_shell, FALSE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, TRUE);
 	pdump (pidlFolder);
 	for (i=0; i<cpidlFiles; i++){
 	    pdump (lppidlFiles[i]);
 	}
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, TRUE);
-	__SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, boldpidl);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_shell, TRUE);
+	__WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_pidl, boldpidl);
     }
     *ppdataObject = IDataObject_Constructor( hwnd, pidlFolder,
 					     lppidlFiles, cpidlFiles);
Index: include/debugtools.h
===================================================================
RCS file: /home/wine/wine/include/debugtools.h,v
retrieving revision 1.14
diff -u -r1.14 debugtools.h
--- include/debugtools.h	2001/11/06 19:01:06	1.14
+++ include/debugtools.h	2002/01/21 05:08:50
@@ -2,63 +2,78 @@
 #ifndef __WINE_DEBUGTOOLS_H
 #define __WINE_DEBUGTOOLS_H
 
-#ifdef __WINE__  /* Debugging interface is internal to Wine */
 
 #include <stdarg.h>
 #include "windef.h"
 
-struct _GUID;
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-/* Internal definitions (do not use these directly) */
+struct _GUID;
 
-enum __DEBUG_CLASS { __DBCL_FIXME, __DBCL_ERR, __DBCL_WARN, __DBCL_TRACE, __DBCL_COUNT };
+/*
+ * Internal definitions (do not use these directly)
+ */
+
+enum __WINE_DEBUG_CLASS {
+    __WINE_DBCL_FIXME,
+    __WINE_DBCL_ERR,
+    __WINE_DBCL_WARN,
+    __WINE_DBCL_TRACE,
+    __WINE_DBCL_COUNT
+};
 
 #ifndef NO_TRACE_MSGS
-# define __GET_DEBUGGING_TRACE(dbch) ((dbch)[0] & (1 << __DBCL_TRACE))
+# define __WINE_GET_DEBUGGING_TRACE(dbch) ((dbch)[0] & (1 << __WINE_DBCL_TRACE))
 #else
-# define __GET_DEBUGGING_TRACE(dbch) 0
+# define __WINE_GET_DEBUGGING_TRACE(dbch) 0
 #endif
 
 #ifndef NO_DEBUG_MSGS
-# define __GET_DEBUGGING_WARN(dbch)  ((dbch)[0] & (1 << __DBCL_WARN))
-# define __GET_DEBUGGING_FIXME(dbch) ((dbch)[0] & (1 << __DBCL_FIXME))
+# define __WINE_GET_DEBUGGING_WARN(dbch)  ((dbch)[0] & (1 << __WINE_DBCL_WARN))
+# define __WINE_GET_DEBUGGING_FIXME(dbch) ((dbch)[0] & (1 << __WINE_DBCL_FIXME))
 #else
-# define __GET_DEBUGGING_WARN(dbch)  0
-# define __GET_DEBUGGING_FIXME(dbch) 0
+# define __WINE_GET_DEBUGGING_WARN(dbch)  0
+# define __WINE_GET_DEBUGGING_FIXME(dbch) 0
 #endif
 
 /* define error macro regardless of what is configured */
-#define __GET_DEBUGGING_ERR(dbch)  ((dbch)[0] & (1 << __DBCL_ERR))
+#define __WINE_GET_DEBUGGING_ERR(dbch)  ((dbch)[0] & (1 << __WINE_DBCL_ERR))
 
-#define __GET_DEBUGGING(dbcl,dbch)  __GET_DEBUGGING##dbcl(dbch)
-#define __SET_DEBUGGING(dbcl,dbch,on) \
+#define __WINE_GET_DEBUGGING(dbcl,dbch)  __WINE_GET_DEBUGGING##dbcl(dbch)
+#define __WINE_SET_DEBUGGING(dbcl,dbch,on) \
     ((on) ? ((dbch)[0] |= 1 << (dbcl)) : ((dbch)[0] &= ~(1 << (dbcl))))
 
 #ifdef __GNUC__
 
-#define __DPRINTF(dbcl,dbch) \
-  do { if(__GET_DEBUGGING(dbcl,(dbch))) { \
+#define __WINE_DPRINTF(dbcl,dbch) \
+  do { if(__WINE_GET_DEBUGGING(dbcl,(dbch))) { \
        const char * const __dbch = (dbch); \
-       const enum __DEBUG_CLASS __dbcl = __DBCL##dbcl; \
+       const enum __WINE_DEBUG_CLASS __dbcl = __WINE_DBCL##dbcl; \
        __WINE_DBG_LOG
 
 #define __WINE_DBG_LOG(args...) \
     wine_dbg_log( __dbcl, __dbch, __FUNCTION__, args); } } while(0)
 
-#define __PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
+#define __WINE_PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args)))
 
 #else  /* __GNUC__ */
 
-#define __DPRINTF(dbcl,dbch) \
-    (!__GET_DEBUGGING(dbcl,(dbch)) || \
-     (wine_dbg_log(__DBCL##dbcl,(dbch),__FILE__,"%d: ",__LINE__),0)) ? \
+#define __WINE_DPRINTF(dbcl,dbch) \
+    (!__WINE_GET_DEBUGGING(dbcl,(dbch)) || \
+     (wine_dbg_log(__WINE_DBCL##dbcl,(dbch),__FILE__,"%d: ",__LINE__),0)) ? \
      (void)0 : (void)wine_dbg_printf
 
-#define __PRINTF_ATTR(fmt, args)
+#define __WINE_PRINTF_ATTR(fmt, args)
 
 #endif  /* __GNUC__ */
+
+
 
-/* Exported definitions and macros */
+/*
+ * Exported definitions and macros
+ */
 
 /* These function return a printable version of a string, including
    quotes.  The string will be valid for some time, but not indefinitely
@@ -67,44 +82,82 @@
 extern const char *wine_dbgstr_wn( const WCHAR *s, int n );
 extern const char *wine_dbgstr_guid( const struct _GUID *id );
 
-extern int wine_dbg_vprintf( const char *format, va_list args ) __PRINTF_ATTR(1,0);
-extern int wine_dbg_printf( const char *format, ... ) __PRINTF_ATTR(1,2);
-extern int wine_dbg_log( enum __DEBUG_CLASS cls, const char *ch,
-                         const char *func, const char *format, ... ) __PRINTF_ATTR(4,5);
-
-inline static const char *debugstr_an( const char * s, int n ) { return wine_dbgstr_an( s, n ); }
-inline static const char *debugstr_wn( const WCHAR *s, int n ) { return wine_dbgstr_wn( s, n ); }
-inline static const char *debugstr_guid( const struct _GUID *id ) { return wine_dbgstr_guid(id); }
-inline static const char *debugstr_a( const char *s )  { return wine_dbgstr_an( s, 80 ); }
-inline static const char *debugstr_w( const WCHAR *s ) { return wine_dbgstr_wn( s, 80 ); }
-inline static const char *debugres_a( const char *s )  { return wine_dbgstr_an( s, 80 ); }
-inline static const char *debugres_w( const WCHAR *s ) { return wine_dbgstr_wn( s, 80 ); }
-
-#define TRACE        __DPRINTF(_TRACE,__wine_dbch___default)
-#define TRACE_(ch)   __DPRINTF(_TRACE,__wine_dbch_##ch)
-#define TRACE_ON(ch) __GET_DEBUGGING(_TRACE,__wine_dbch_##ch)
-
-#define WARN         __DPRINTF(_WARN,__wine_dbch___default)
-#define WARN_(ch)    __DPRINTF(_WARN,__wine_dbch_##ch)
-#define WARN_ON(ch)  __GET_DEBUGGING(_WARN,__wine_dbch_##ch)
-
-#define FIXME        __DPRINTF(_FIXME,__wine_dbch___default)
-#define FIXME_(ch)   __DPRINTF(_FIXME,__wine_dbch_##ch)
-#define FIXME_ON(ch) __GET_DEBUGGING(_FIXME,__wine_dbch_##ch)
+extern int wine_dbg_vprintf( const char *format, va_list args ) __WINE_PRINTF_ATTR(1,0);
+extern int wine_dbg_printf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
+extern int wine_dbg_log( enum __WINE_DEBUG_CLASS cls, const char *ch,
+                         const char *func, const char *format, ... ) __WINE_PRINTF_ATTR(4,5);
+
+inline static const char *wine_debugstr_an( const char * s, int n ) { return wine_dbgstr_an( s, n ); }
+inline static const char *wine_debugstr_wn( const WCHAR *s, int n ) { return wine_dbgstr_wn( s, n ); }
+inline static const char *wine_debugstr_guid( const struct _GUID *id ) { return wine_dbgstr_guid(id); }
+inline static const char *wine_debugstr_a( const char *s )  { return wine_dbgstr_an( s, 80 ); }
+inline static const char *wine_debugstr_w( const WCHAR *s ) { return wine_dbgstr_wn( s, 80 ); }
+inline static const char *wine_debugres_a( const char *s )  { return wine_dbgstr_an( s, 80 ); }
+inline static const char *wine_debugres_w( const WCHAR *s ) { return wine_dbgstr_wn( s, 80 ); }
+
+#define WINE_TRACE                 __WINE_DPRINTF(_TRACE,__wine_dbch___default)
+#define WINE_TRACE_(ch)            __WINE_DPRINTF(_TRACE,__wine_dbch_##ch)
+#define WINE_TRACE_ON(ch)          __WINE_GET_DEBUGGING(_TRACE,__wine_dbch_##ch)
+
+#define WINE_WARN                  __WINE_DPRINTF(_WARN,__wine_dbch___default)
+#define WINE_WARN_(ch)             __WINE_DPRINTF(_WARN,__wine_dbch_##ch)
+#define WINE_WARN_ON(ch)           __WINE_GET_DEBUGGING(_WARN,__wine_dbch_##ch)
+
+#define WINE_FIXME                 __WINE_DPRINTF(_FIXME,__wine_dbch___default)
+#define WINE_FIXME_(ch)            __WINE_DPRINTF(_FIXME,__wine_dbch_##ch)
+#define WINE_FIXME_ON(ch)          __WINE_GET_DEBUGGING(_FIXME,__wine_dbch_##ch)
+
+#define WINE_ERR                   __WINE_DPRINTF(_ERR,__wine_dbch___default)
+#define WINE_ERR_(ch)              __WINE_DPRINTF(_ERR,__wine_dbch_##ch)
+#define WINE_ERR_ON(ch)            __WINE_GET_DEBUGGING(_ERR,__wine_dbch_##ch)
 
+#define WINE_DECLARE_DEBUG_CHANNEL(ch) \
+    extern char __wine_dbch_##ch[]
+#define WINE_DEFAULT_DEBUG_CHANNEL(ch) \
+    extern char __wine_dbch_##ch[]; \
+    static char * const __wine_dbch___default = __wine_dbch_##ch
+
+#define WINE_DPRINTF               wine_dbg_printf
+#define WINE_MESSAGE               wine_dbg_printf
+
+#ifdef __WINE__
+/* Wine uses shorter names that are very likely to conflict with other software */
+
+#define debugstr_an(s,n)           wine_debugstr_an(s,n)
+#define debugstr_wn(s,n)           wine_debugstr_wn(s,n)
+#define debugstr_guid(id)          wine_debugstr_guid(id)
+#define debugstr_a(s)              wine_debugstr_a(s)
+#define debugstr_w(s)              wine_debugstr_w(s)
+#define debugres_a(s)              wine_debugres_a(s)
+#define debugres_w(s)              wine_debugres_w(s)
+
+#define TRACE                      WINE_TRACE
+#define TRACE_(ch)                 WINE_TRACE_(ch)
+#define TRACE_ON(ch)               WINE_TRACE_ON(ch)
+
+#define WARN                       WINE_WARN
+#define WARN_(ch)                  WINE_WARN_(ch)
+#define WARN_ON(ch)                WINE_WARN_ON(ch)
+
+#define FIXME                      WINE_FIXME
+#define FIXME_(ch)                 WINE_FIXME_(ch)
+#define FIXME_ON(ch)               WINE_FIXME_ON(ch)
+
 #undef ERR  /* Solaris got an 'ERR' define in <sys/reg.h> */
-#define ERR          __DPRINTF(_ERR,__wine_dbch___default)
-#define ERR_(ch)     __DPRINTF(_ERR,__wine_dbch_##ch)
-#define ERR_ON(ch)   __GET_DEBUGGING(_ERR,__wine_dbch_##ch)
+#define ERR                        WINE_ERR
+#define ERR_(ch)                   WINE_ERR_(ch)
+#define ERR_ON(ch)                 WINE_ERR_ON(ch)
 
-#define DECLARE_DEBUG_CHANNEL(ch) \
-    extern char __wine_dbch_##ch[]
-#define DEFAULT_DEBUG_CHANNEL(ch) \
-    extern char __wine_dbch_##ch[]; static char * const __wine_dbch___default = __wine_dbch_##ch
+#define DECLARE_DEBUG_CHANNEL(ch)  WINE_DECLARE_DEBUG_CHANNEL(ch)
+#define DEFAULT_DEBUG_CHANNEL(ch)  WINE_DEFAULT_DEBUG_CHANNEL(ch)
 
-#define DPRINTF wine_dbg_printf
-#define MESSAGE wine_dbg_printf
+#define DPRINTF                    WINE_DPRINTF
+#define MESSAGE                    WINE_MESSAGE
 
-#endif  /* __WINE__ */
+#endif /* __WINE__ */
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif  /* __WINE_DEBUGTOOLS_H */
Index: misc/options.c
===================================================================
RCS file: /home/wine/wine/misc/options.c,v
retrieving revision 1.30
diff -u -r1.30 options.c
--- misc/options.c	2001/11/30 18:46:48	1.30
+++ misc/options.c	2002/01/21 05:08:51
@@ -89,7 +89,7 @@
 
 static void do_debugmsg( const char *arg )
 {
-    static const char * const debug_class_names[__DBCL_COUNT] = { "fixme", "err", "warn", "trace" };
+    static const char * const debug_class_names[__WINE_DBCL_COUNT] = { "fixme", "err", "warn", "trace" };
 
     char *opt, *options = strdup(arg);
     int i;
@@ -109,7 +109,7 @@
         if (!p || !p[1]) goto error;
         if (p > opt)
         {
-            for (i = 0; i < __DBCL_COUNT; i++)
+            for (i = 0; i < __WINE_DBCL_COUNT; i++)
             {
                 int len = strlen(debug_class_names[i]);
                 if (len != (p - opt)) continue;
@@ -120,7 +120,7 @@
                     break;
                 }
             }
-            if (i == __DBCL_COUNT) goto error;  /* class name not found */
+            if (i == __WINE_DBCL_COUNT) goto error;  /* class name not found */
         }
         else
         {
@@ -184,7 +184,7 @@
     MESSAGE("Example: --debugmsg +all,warn-heap\n"
             "  turn on all messages except warning heap messages\n");
     MESSAGE("Available message classes:\n");
-    for( i = 0; i < __DBCL_COUNT; i++) MESSAGE( "%-9s", debug_class_names[i] );
+    for( i = 0; i < __WINE_DBCL_COUNT; i++) MESSAGE( "%-9s", debug_class_names[i] );
     MESSAGE("\n\n");
     ExitProcess(1);
 }


More information about the wine-patches mailing list