Alexandre Julliard : include: Make wine_dbgstr_an()/wine_dbgstr_wn() into inline functions.

Alexandre Julliard julliard at winehq.org
Wed Apr 3 15:26:18 CDT 2019


Module: wine
Branch: master
Commit: 9f75f7189935aeec55df79a5abbc3d2691ec5f7e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9f75f7189935aeec55df79a5abbc3d2691ec5f7e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr  3 19:23:43 2019 +0200

include: Make wine_dbgstr_an()/wine_dbgstr_wn() into inline functions.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/debugtools.c | 54 ++++++----------------------
 dlls/ntdll/ntdll.spec   |  3 ++
 include/wine/debug.h    | 96 +++++++++++++++++++++++++++++++++++++++++++++++--
 libs/wine/debug.c       |  4 +++
 4 files changed, 111 insertions(+), 46 deletions(-)

diff --git a/dlls/ntdll/debugtools.c b/dlls/ntdll/debugtools.c
index 4e2fd78..42db30a 100644
--- a/dlls/ntdll/debugtools.c
+++ b/dlls/ntdll/debugtools.c
@@ -41,8 +41,6 @@
 WINE_DECLARE_DEBUG_CHANNEL(pid);
 WINE_DECLARE_DEBUG_CHANNEL(timestamp);
 
-static struct __wine_debug_functions default_funcs;
-
 static BOOL init_done;
 static struct debug_info initial_info;  /* debug info for initial thread */
 
@@ -77,49 +75,17 @@ static void release_temp_buffer( char *ptr, size_t size )
 }
 
 /***********************************************************************
- *		NTDLL_dbgstr_an
+ *		__wine_dbg_strdup  (NTDLL.@)
  */
-static const char *NTDLL_dbgstr_an( const char *src, int n )
+const char * __cdecl __wine_dbg_strdup( const char *str )
 {
-    const char *res;
     struct debug_info *info = get_info();
-    /* save current position to restore it on exception */
-    char *old_pos = info->str_pos;
-
-    __TRY
-    {
-        res = default_funcs.dbgstr_an( src, n );
-    }
-    __EXCEPT_PAGE_FAULT
-    {
-        release_temp_buffer( old_pos, 0 );
-        return "(invalid)";
-    }
-    __ENDTRY
-    return res;
-}
-
-/***********************************************************************
- *		NTDLL_dbgstr_wn
- */
-static const char *NTDLL_dbgstr_wn( const WCHAR *src, int n )
-{
-    const char *res;
-    struct debug_info *info = get_info();
-    /* save current position to restore it on exception */
-    char *old_pos = info->str_pos;
+    char *res = info->str_pos;
+    size_t n = strlen( str ) + 1;
 
-    __TRY
-    {
-        res = default_funcs.dbgstr_wn( src, n );
-    }
-    __EXCEPT_PAGE_FAULT
-    {
-        release_temp_buffer( old_pos, 0 );
-        return "(invalid)";
-    }
-    __ENDTRY
-     return res;
+    if (res + n > &info->strings[sizeof(info->strings)]) res = info->strings;
+    info->str_pos = res + n;
+    return strcpy( res, str );
 }
 
 /***********************************************************************
@@ -195,8 +161,8 @@ static const struct __wine_debug_functions funcs =
 {
     get_temp_buffer,
     release_temp_buffer,
-    NTDLL_dbgstr_an,
-    NTDLL_dbgstr_wn,
+    wine_dbgstr_an,
+    wine_dbgstr_wn,
     NTDLL_dbg_vprintf,
     NTDLL_dbg_vlog
 };
@@ -210,5 +176,5 @@ void debug_init(void)
     if (!initial_info.out_pos) initial_info.out_pos = initial_info.output;
     ntdll_get_thread_data()->debug_info = &initial_info;
     init_done = TRUE;
-    __wine_dbg_set_functions( &funcs, &default_funcs, sizeof(funcs) );
+    __wine_dbg_set_functions( &funcs, NULL, sizeof(funcs) );
 }
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 233c4ef..7622289 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1505,6 +1505,9 @@
 @ cdecl wine_server_send_fd(long)
 @ cdecl __wine_make_process_system()
 
+# Debugging
+@ cdecl -norelay __wine_dbg_strdup(str)
+
 # Virtual memory
 @ cdecl __wine_locked_recvmsg(long ptr long)
 
diff --git a/include/wine/debug.h b/include/wine/debug.h
index 07ac88d..65322d0 100644
--- a/include/wine/debug.h
+++ b/include/wine/debug.h
@@ -23,6 +23,9 @@
 
 #include <stdarg.h>
 #include <windef.h>
+#ifndef _NTSYSTEM_
+#include <winbase.h>
+#endif
 #ifndef GUID_DEFINED
 #include <guiddef.h>
 #endif
@@ -157,6 +160,7 @@ extern int __wine_dbg_set_channel_flags( struct __wine_debug_channel *channel,
                                          unsigned char set, unsigned char clear );
 extern void __wine_dbg_set_functions( const struct __wine_debug_functions *new_funcs,
                                       struct __wine_debug_functions *old_funcs, size_t size );
+extern const char * __cdecl __wine_dbg_strdup( const char *str );
 
 /*
  * Exported definitions and macros
@@ -165,14 +169,102 @@ extern void __wine_dbg_set_functions( const struct __wine_debug_functions *new_f
 /* These functions return a printable version of a string, including
    quotes.  The string will be valid for some time, but not indefinitely
    as strings are re-used.  */
-extern const char *wine_dbgstr_an( const char * s, int n );
-extern const char *wine_dbgstr_wn( const WCHAR *s, int n );
 extern const char *wine_dbg_sprintf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
 
 extern int wine_dbg_printf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
 extern int wine_dbg_log( enum __wine_debug_class cls, struct __wine_debug_channel *ch, const char *func,
                          const char *format, ... ) __WINE_PRINTF_ATTR(4,5);
 
+static inline const char *wine_dbgstr_an( const char *str, int n )
+{
+    static const char hex[16] = "0123456789abcdef";
+    char buffer[300], *dst = buffer;
+
+    if (!str) return "(null)";
+    if (!((ULONG_PTR)str >> 16)) return wine_dbg_sprintf( "#%04x", LOWORD(str) );
+#ifndef _NTSYSTEM_
+    if (IsBadStringPtrA( str, n )) return "(invalid)";
+#endif
+    if (n == -1) for (n = 0; str[n]; n++) ;
+    *dst++ = '"';
+    while (n-- > 0 && dst <= buffer + sizeof(buffer) - 9)
+    {
+        unsigned char c = *str++;
+        switch (c)
+        {
+        case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
+        case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
+        case '\t': *dst++ = '\\'; *dst++ = 't'; break;
+        case '"':  *dst++ = '\\'; *dst++ = '"'; break;
+        case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
+        default:
+            if (c < ' ' || c >= 127)
+            {
+                *dst++ = '\\';
+                *dst++ = 'x';
+                *dst++ = hex[(c >> 4) & 0x0f];
+                *dst++ = hex[c & 0x0f];
+            }
+            else *dst++ = c;
+        }
+    }
+    *dst++ = '"';
+    if (n > 0)
+    {
+        *dst++ = '.';
+        *dst++ = '.';
+        *dst++ = '.';
+    }
+    *dst = 0;
+    return __wine_dbg_strdup( buffer );
+}
+
+static inline const char *wine_dbgstr_wn( const WCHAR *str, int n )
+{
+    static const char hex[16] = "0123456789abcdef";
+    char buffer[300], *dst = buffer;
+
+    if (!str) return "(null)";
+    if (!((ULONG_PTR)str >> 16)) return wine_dbg_sprintf( "#%04x", LOWORD(str) );
+#ifndef _NTSYSTEM_
+    if (IsBadStringPtrW( str, n )) return "(invalid)";
+#endif
+    if (n == -1) for (n = 0; str[n]; n++) ;
+    *dst++ = 'L';
+    *dst++ = '"';
+    while (n-- > 0 && dst <= buffer + sizeof(buffer) - 10)
+    {
+        WCHAR c = *str++;
+        switch (c)
+        {
+        case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
+        case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
+        case '\t': *dst++ = '\\'; *dst++ = 't'; break;
+        case '"':  *dst++ = '\\'; *dst++ = '"'; break;
+        case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
+        default:
+            if (c < ' ' || c >= 127)
+            {
+                *dst++ = '\\';
+                *dst++ = hex[(c >> 12) & 0x0f];
+                *dst++ = hex[(c >> 8) & 0x0f];
+                *dst++ = hex[(c >> 4) & 0x0f];
+                *dst++ = hex[c & 0x0f];
+            }
+            else *dst++ = c;
+        }
+    }
+    *dst++ = '"';
+    if (n > 0)
+    {
+        *dst++ = '.';
+        *dst++ = '.';
+        *dst++ = '.';
+    }
+    *dst = 0;
+    return __wine_dbg_strdup( buffer );
+}
+
 static inline const char *wine_dbgstr_a( const char *s )
 {
     return wine_dbgstr_an( s, -1 );
diff --git a/libs/wine/debug.c b/libs/wine/debug.c
index ae12356..0c3b4ef 100644
--- a/libs/wine/debug.c
+++ b/libs/wine/debug.c
@@ -30,6 +30,8 @@
 # include <sys/stat.h>
 #endif
 
+#define wine_dbgstr_an wine_dbgstr_an_inline
+#define wine_dbgstr_wn wine_dbgstr_wn_inline
 #include "wine/debug.h"
 #include "wine/library.h"
 
@@ -420,11 +422,13 @@ static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_ch
 
 /* wrappers to use the function pointers */
 
+#undef wine_dbgstr_an
 const char *wine_dbgstr_an( const char * s, int n )
 {
     return funcs.dbgstr_an(s, n);
 }
 
+#undef wine_dbgstr_wn
 const char *wine_dbgstr_wn( const WCHAR *s, int n )
 {
     return funcs.dbgstr_wn(s, n);




More information about the wine-cvs mailing list