[PATCH 6/6] ntdll: Implement debugstr_guid/point/rect format extensions.

Rémi Bernon rbernon at codeweavers.com
Sat Nov 21 14:19:13 CST 2020


Respectively using %p(guid), %p(point), and %p(rect) format specifiers.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntdll/unix/debug.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/dlls/ntdll/unix/debug.c b/dlls/ntdll/unix/debug.c
index 134ae619575..e82472bafa1 100644
--- a/dlls/ntdll/unix/debug.c
+++ b/dlls/ntdll/unix/debug.c
@@ -385,6 +385,29 @@ static size_t sprintf_dbgstr_as( char *buffer, size_t length, const ANSI_STRING
     return sprintf_dbgstr_an( buffer, length, as->Buffer, as->Length );
 }
 
+static size_t sprintf_dbgstr_guid( char *buffer, size_t length, const GUID *id )
+{
+    if (!id) { if (length >= 7) strcpy(buffer, "(null)"); return 6; }
+    if (!((ULONG_PTR)id >> 16)) return snprintf( buffer, length, "<guid-0x%04hx>", (WORD)(ULONG_PTR)id );
+    return snprintf( buffer, length, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                             id->Data1, id->Data2, id->Data3,
+                             id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3],
+                             id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] );
+}
+
+static size_t sprintf_dbgstr_point( char *buffer, size_t length, const POINT *pt )
+{
+    if (!pt) { if (length >= 7) strcpy(buffer, "(null)"); return 6; }
+    return snprintf( buffer, length, "(%d,%d)", pt->x, pt->y );
+}
+
+static size_t sprintf_dbgstr_rect( char *buffer, size_t length, const RECT *rect )
+{
+    if (!rect) { if (length >= 7) strcpy(buffer, "(null)"); return 6; }
+    return snprintf( buffer, length, "(%d,%d)-(%d,%d)", rect->left, rect->top,
+                             rect->right, rect->bottom );
+}
+
 static int __cdecl wine_dbg_vsnprintf( char *buffer, size_t length, const char *format, __ms_va_list args )
 {
     char fmtbuf[1024];
@@ -555,6 +578,21 @@ static int __cdecl wine_dbg_vsnprintf( char *buffer, size_t length, const char *
                 append_checked( buf, end - buf, sprintf_dbgstr_as( buf, end - buf, va_arg( args, const ANSI_STRING * ) ) );
                 snprintf_checked( buf, end - buf, spec + 5 );
             }
+            else if (!strncmp( spec, "p(guid)", 7 )) /* debugstr_guid */
+            {
+                append_checked( buf, end - buf, sprintf_dbgstr_guid( buf, end - buf, va_arg( args, const GUID * ) ) );
+                snprintf_checked( buf, end - buf, spec + 7 );
+            }
+            else if (!strncmp( spec, "p(point)", 8 )) /* debugstr_point */
+            {
+                append_checked( buf, end - buf, sprintf_dbgstr_point( buf, end - buf, va_arg( args, const POINT * ) ) );
+                snprintf_checked( buf, end - buf, spec + 8 );
+            }
+            else if (!strncmp( spec, "p(rect)", 7 )) /* debugstr_rect */
+            {
+                append_checked( buf, end - buf, sprintf_dbgstr_rect( buf, end - buf, va_arg( args, const RECT * ) ) );
+                snprintf_checked( buf, end - buf, spec + 7 );
+            }
             else snprintf_dispatch( buf, end - buf, fmt, va_arg( args, void * ) );
             break;
         case 'A':
-- 
2.29.2




More information about the wine-devel mailing list