From f878c3ed2447cc4ab0d9a171d10a1b9478465d8e Mon Sep 17 00:00:00 2001 From: misomosi Date: Tue, 7 May 2024 00:26:40 -0400 Subject: [PATCH] Only include logging when forced --- pld.h | 188 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 100 insertions(+), 88 deletions(-) diff --git a/pld.h b/pld.h index ce7b7fe..f103b88 100644 --- a/pld.h +++ b/pld.h @@ -1,12 +1,22 @@ #ifndef COOL_PLD_H #define COOL_PLD_H +// Always define GNU sources +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #ifdef _MSC_VER #define PLDTYPEOF(x) __typeof__(x) #else #define PLDTYPEOF(x) typeof(x) #endif +// Allow users to provide their own logging +// This may also help to reduce headers and +// imports to allow for more easy preloads. +#ifndef PLDLOG +#define PLD_PRIVATE_LOG_INCLUDED static int PLD_Private_strlen(const char *s) { int len = 0; @@ -15,47 +25,108 @@ static int PLD_Private_strlen(const char *s) return len - 1; } -#ifndef PLDLOG -#define PLDLOG(message, name, err) PLD_Private_Log(message, name, err) -#endif - -// Private dlopen function has platform-specific behavior when name == NULL -// * Windows: Return GetModuleHandleA(NULL) -// * POSIX: Return RTLD_NEXT -// -// Private dlsym function has platform-specific behavior when handle == NULL -// * Windows: Use GetModuleHandleA(NULL) instead -// * POSIX: Use RTLD_NEXT instead #ifdef _WIN32 - #include -typedef FARPROC PLD_ProcAddress; -typedef HMODULE PLD_LibHandle; -typedef DWORD PLD_ErrCode; -static void PLD_Private_Log(const char *, const char *, PLD_ErrCode); - -static PLD_ErrCode PLD_Private_ErrCode(void) +static void *PLD_Private_ErrCode(void) { - return GetLastError(); + return (void *)(DWORD_PTR)GetLastError(); } - static void PLD_Private_WriteString(const char *s) { DWORD dummy; WriteFile(GetStdHandle(STD_ERROR_HANDLE), s, PLD_Private_strlen(s), &dummy, NULL); } - -static void PLD_Private_FormatError(DWORD code, char *s, int len) +static void PLD_Private_FormatError(void *code, char *s, int len, const char *name) { - DWORD_PTR arg = (DWORD_PTR)s; + DWORD_PTR arg = (DWORD_PTR)name; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, - code, + (DWORD_PTR)code, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), s, len, (va_list *)&arg); } +#else // _WIN32 +#include +#include +static void *PLD_Private_ErrCode(void) +{ + return dlerror(); +} +static void PLD_Private_WriteString(const char *s) +{ + write(2, s, PLD_Private_strlen(s)); +} +static void PLD_Private_FormatError(void *code, char *s, int len, const char *name) +{ + (void)name; + if (len == 0) + return; + const char *dlerr = (const char *)code; + while (--len && (*s++ = *dlerr++)) + ; + *s = 0; +} +#endif // _WIN32 + +// When code is 0, output nothing +static void PLD_Private_FormatError_wrapper(void *code, char *s, int len, const char *name) { + // Add an extra newline only on Windows to mimic FormatMessageA + if (code == 0) { +#ifdef _WIN32 + s[0] = '\r'; + s[1] = '\n'; + s[2] = 0; +#else + *s = 0; +#endif // _WIN32 + return; + } + PLD_Private_FormatError(code, s, len, name); +} + + +static void PLD_Private_Log(const char *message, const char *name, void *err) +{ + PLD_Private_WriteString(message); + PLD_Private_WriteString(" "); + PLD_Private_WriteString(name); +#ifdef _WIN32 + PLD_Private_WriteString("\r\n"); +#else + PLD_Private_WriteString("\n"); +#endif // _WIN32 + char errtext[256]; + PLD_Private_FormatError_wrapper(err, errtext, sizeof(errtext), name); + PLD_Private_WriteString(errtext); + + // An extra newline because dlerror doesn't append one +#ifndef _WIN32 + PLD_Private_WriteString("\n"); +#endif +} + +#define PLDLOG(message, name, err) PLD_Private_Log(message, name, err) +#endif // PLDLOG + +// Private dlopen function has platform-specific behavior when name == NULL +// * Windows: Return GetModuleHandleA(NULL) +// * POSIX: Return RTLD_NEXT +// +// Private dlsym function has platform-specific behavior when handle == NULL +// * Windows: Use GetModuleHandleA(NULL) instead +// * POSIX: Use RTLD_NEXT instead +#ifdef _WIN32 + +// Optimization to not include Windows twice +// when defining our own PLDLOG +#ifndef PLD_PRIVATE_LOG_INCLUDED +#include +#endif + +typedef HMODULE PLD_LibHandle; +typedef FARPROC PLD_ProcAddress; static PLD_LibHandle PLD_Private_dlopen(const char *name) { @@ -72,35 +143,14 @@ static PLD_ProcAddress PLD_Private_dlsym(PLD_LibHandle handle, const char *name) return GetProcAddress(handle, name); } -#else +#else // _WIN32 -#define _GNU_SOURCE -#include -#include -#include -#include +#ifndef PLD_PRIVATE_LOG_INCLUDED #include +#endif -typedef void *PLD_ProcAddress; typedef void *PLD_LibHandle; -typedef intptr_t PLD_ErrCode; -static void PLD_Private_Log(const char *, const char *, PLD_ErrCode); - -static PLD_ErrCode PLD_Private_ErrCode(void) -{ - return (intptr_t)dlerror(); -} - -static void PLD_Private_WriteString(const char *s) -{ - write(2, s, PLD_Private_strlen(s)); -} - -static void PLD_Private_FormatError(intptr_t code, char *s, int len) -{ - *s = 0; - strncat(s, (const char *)code, len); -} +typedef void *PLD_ProcAddress; static PLD_LibHandle PLD_Private_dlopen(const char *name) { @@ -119,8 +169,7 @@ static PLD_ProcAddress PLD_Private_dlsym(PLD_LibHandle handle, const char *name) return dlsym(handle, name); } - -#endif +#endif // _WIN32 static PLD_ProcAddress PLD_Private_dlsym_wrapper(PLD_LibHandle handle, const char *name) { @@ -159,41 +208,4 @@ static PLD_LibHandle PLD_Private_dlopen_wrapper(const char *name) #define PFNALT(name, alt) ((PLDTYPEOF(&name))PLD_Private_dlsym_wrapper(PLDH(), alt)) #define PFN(name) PFNALT(name, #name) -// When code is 0, output nothing -static void PLD_Private_FormatError_wrapper(intptr_t code, char *s, int len) { - // Add an extra newline only on Windows to mimic FormatMessageA - if (code == 0) { -#ifdef _WIN32 - s[0] = '\r'; - s[1] = '\n'; - s[2] = 0; -#else - *s = 0; -#endif - return; - } - PLD_Private_FormatError(code, s, len); -} - - -static void PLD_Private_Log(const char *message, const char *name, PLD_ErrCode err) -{ - PLD_Private_WriteString(message); - PLD_Private_WriteString(" "); - PLD_Private_WriteString(name); -#ifdef _WIN32 - PLD_Private_WriteString("\r\n"); -#else - PLD_Private_WriteString("\n"); -#endif - char errtext[256]; - PLD_Private_FormatError_wrapper(err, errtext, sizeof(errtext)); - PLD_Private_WriteString(errtext); - - // An extra newline because dlerror doesn't append one -#ifndef _WIN32 - PLD_Private_WriteString("\n"); -#endif -} - #endif // COOL_PLD_H -- 2.49.1