summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2015-04-06 12:41:02 -0400
committerPietro Gagliardi <[email protected]>2015-04-06 12:41:02 -0400
commitd1be6e3ce158384b62ffab3bb439683a2018099d (patch)
treed5ed4616d74d15b1fff12774221422f5417a65b6
parent95440a3be135d1b34e1fe8b8f06315e65f26c168 (diff)
Added wintable's debugging printers to the new UI code.
-rw-r--r--new/debug_windows.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/new/debug_windows.c b/new/debug_windows.c
new file mode 100644
index 0000000..d044f33
--- /dev/null
+++ b/new/debug_windows.c
@@ -0,0 +1,99 @@
+// 25 february 2015
+#include "ui_windows.h"
+
+// uncomment the following line to enable debug messages
+#define tableDebug
+// uncomment the following line to halt on a debug message
+#define tableDebugStop
+
+#ifdef tableDebug
+
+#include <stdio.h>
+
+HRESULT logLastError(const char *context)
+{
+ DWORD le;
+ WCHAR *msg;
+ int parenthesize = 0;
+
+ le = GetLastError();
+ fprintf(stderr, "%s: ", context);
+ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, le, 0, (LPWSTR) (&msg), 0, NULL) != 0) {
+ fprintf(stderr, "%S (", msg);
+ // TODO check error
+ LocalFree(msg);
+ parenthesize = 1;
+ }
+ fprintf(stderr, "GetLastError() == %I32u", le);
+ if (parenthesize)
+ fprintf(stderr, ")");
+ fprintf(stderr, "\n");
+#ifdef tableDebugStop
+ DebugBreak();
+#endif
+ SetLastError(le);
+ // a function does not have to set a last error
+ // if the last error we get is actually 0, then HRESULT_FROM_WIN32(0) will return S_OK (0 cast to an HRESULT, since 0 <= 0), which we don't want
+ // prevent this by returning E_FAIL, so the rest of the Table code doesn't barge onward
+ if (le == 0)
+ return E_FAIL;
+ return HRESULT_FROM_WIN32(le);
+}
+
+HRESULT logHRESULT(const char *context, HRESULT hr)
+{
+ WCHAR *msg;
+ int parenthesize = 0;
+
+ fprintf(stderr, "%s: ", context);
+ // this isn't technically documented, but everyone does it, including Microsoft (see the implementation of _com_error::ErrorMessage() in a copy of comdef.h that comes with the Windows DDK)
+ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD) hr, 0, (LPWSTR) (&msg), 0, NULL) != 0) {
+ fprintf(stderr, "%S (", msg);
+ // TODO check error
+ LocalFree(msg);
+ parenthesize = 1;
+ }
+ fprintf(stderr, "HRESULT == 0x%I32X", hr);
+ if (parenthesize)
+ fprintf(stderr, ")");
+ fprintf(stderr, "\n");
+#ifdef tableDebugStop
+ DebugBreak();
+#endif
+ return hr;
+}
+
+HRESULT logMemoryExhausted(const char *reason)
+{
+ fprintf(stderr, "memory exhausted %s\n", reason);
+#ifdef tableDebugStop
+ DebugBreak();
+#endif
+ return E_OUTOFMEMORY;
+}
+
+#else
+
+HRESULT logLastError(const char *reason)
+{
+ DWORD le;
+
+ le = GetLastError();
+ // technically (I think? TODO) we don't need to do this, but let's do this anyway just to be safe
+ SetLastError(le);
+ if (le == 0)
+ return E_FAIL;
+ return HRESULT_FROM_WIN32(le);
+}
+
+HRESULT logHRESULT(const char *reason, HRESULT hr)
+{
+ return hr;
+}
+
+HRESULT logMemoryExhausted(const char *reason)
+{
+ return E_OUTOFMEMORY;
+}
+
+#endif