xref: /reactos/base/shell/cmd/trace.c (revision 7f021deb)
1 /*
2  * PROJECT:     ReactOS Command Shell
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Dynamic trace (generates debugging output to console output)
5  * COPYRIGHT:   Copyright 2011 Hans Harder <hans@atbas.org>
6  *              Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7  */
8 
9 #include "precomp.h"
10 
11 #ifdef FEATURE_DYNAMIC_TRACE
12 
13 BOOL g_bDynamicTrace = FALSE;
14 
15 VOID CmdTrace(INT type, LPCSTR file, INT line, LPCSTR func, LPCSTR fmt, ...)
16 {
17     va_list va;
18     int cch;
19     char szTextA[800];
20 #ifdef _UNICODE
21     wchar_t szTextW[800];
22 #endif
23     static struct __wine_debug_functions s_Debug;
24 
25     va_start(va, fmt);
26 
27     /* Console output */
28     if (g_bDynamicTrace)
29     {
30         StringCchPrintfA(szTextA, _countof(szTextA), "%s (%d): ", file, line);
31         cch = lstrlenA(szTextA);
32         StringCchVPrintfA(&szTextA[cch], _countof(szTextA) - cch, fmt, va);
33 
34 #ifdef _UNICODE
35         MultiByteToWideChar(OutputCodePage, 0, szTextA, -1, szTextW, _countof(szTextW));
36         szTextW[_countof(szTextW) - 1] = UNICODE_NULL; /* Avoid buffer overrun */
37         ConOutPuts(szTextW);
38 #else
39         ConOutPuts(szTextA);
40 #endif
41     }
42 
43     if (!s_Debug.dbg_vlog)
44         __wine_dbg_set_functions(NULL, &s_Debug, sizeof(s_Debug));
45 
46     /* Debug logging */
47     switch (type)
48     {
49         case __WINE_DBCL_FIXME:
50             if (__WINE_IS_DEBUG_ON(_FIXME, __wine_dbch___default))
51                 s_Debug.dbg_vlog(__WINE_DBCL_FIXME, __wine_dbch___default, file, func, line, fmt, va);
52             break;
53         case __WINE_DBCL_ERR:
54             if (__WINE_IS_DEBUG_ON(_ERR, __wine_dbch___default))
55                 s_Debug.dbg_vlog(__WINE_DBCL_ERR, __wine_dbch___default, file, func, line, fmt, va);
56             break;
57         case __WINE_DBCL_WARN:
58             if (__WINE_IS_DEBUG_ON(_WARN, __wine_dbch___default))
59                 s_Debug.dbg_vlog(__WINE_DBCL_WARN, __wine_dbch___default, file, func, line, fmt, va);
60             break;
61         case __WINE_DBCL_TRACE:
62             if (__WINE_IS_DEBUG_ON(_TRACE, __wine_dbch___default))
63                 s_Debug.dbg_vlog(__WINE_DBCL_TRACE, __wine_dbch___default, file, func, line, fmt, va);
64             break;
65         default:
66             break;
67     }
68 
69     va_end(va);
70 }
71 
72 #endif /* def FEATURE_DYNAMIC_TRACE */
73