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@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 !"
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); }