aheinecke@404: /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik aheinecke@404: * Software engineering by Intevation GmbH aheinecke@404: * aheinecke@404: * This file is Free Software under the GNU GPL (v>=2) aheinecke@404: * and comes with ABSOLUTELY NO WARRANTY! aheinecke@404: * See LICENSE.txt for details. aheinecke@404: */ aheinecke@252: #ifndef COMMON_LOGGING_H aheinecke@252: #define COMMON_LOGGING_H aheinecke@252: aheinecke@252: #ifdef __cplusplus aheinecke@252: extern "C" { aheinecke@252: #endif aheinecke@252: aheinecke@252: /* aheinecke@252: * @file aheinecke@252: * @brief Logging and debugging functions aheinecke@252: */ aheinecke@252: aheinecke@503: #include aheinecke@503: aheinecke@252: #ifdef WIN32 aheinecke@252: aheinecke@252: #include aheinecke@252: aheinecke@252: /** @brief Gets the localized error message for the last error aheinecke@252: * returned by GetLastError aheinecke@252: * aheinecke@252: * @returns utf8 error message that needs to be freed by the caller. aheinecke@252: **/ aheinecke@252: aheinecke@252: char *getLastErrorMsg(); aheinecke@252: aheinecke@252: #endif aheinecke@252: aheinecke@252: /** aheinecke@252: * @def DEBUGOUTPUT aheinecke@252: * @brief If defined code for extra debugging output will be generated. aheinecke@252: * aheinecke@252: * Will be defined if current build is not an RELEASE_BUILD. aheinecke@252: */ aheinecke@252: #ifndef RELEASE_BUILD aheinecke@252: #define DEBUGOUTPUT aheinecke@252: #endif aheinecke@252: aheinecke@252: /** aheinecke@252: * @def DEBUGPREFIX aheinecke@252: * @brief A string prepended to debug output. aheinecke@252: * aheinecke@252: * Should be defined to indicate which module created the output. aheinecke@252: */ aheinecke@252: #ifndef DEBUGPREFIX aheinecke@252: #define DEBUGPREFIX "" aheinecke@252: #endif aheinecke@252: aheinecke@252: /** aheinecke@252: * @def DEBUGPRINTF(fmt, ...) aheinecke@252: * @brief Debug printf aheinecke@252: * aheinecke@252: * Prints to stderr if DEBUGOUTPUT is defined. aheinecke@252: */ aheinecke@252: #ifdef DEBUGOUTPUT aheinecke@329: # ifndef WIN32 aheinecke@329: # define DEBUGPRINTF(fmt, ...) fprintf(stderr, DEBUGPREFIX "DEBUG: " fmt, ##__VA_ARGS__); aheinecke@329: # else /* WIN32 */ aheinecke@329: # define DEBUGPRINTF(fmt, ...) \ aheinecke@329: { \ aheinecke@329: char buf[512]; \ aheinecke@329: snprintf(buf, 511, "DEBUG: " fmt, ##__VA_ARGS__); \ aheinecke@329: buf[511] = '\0'; \ aheinecke@329: OutputDebugStringA(buf); \ aheinecke@329: } aheinecke@329: # endif /* WIN32 */ aheinecke@287: #else aheinecke@287: # define DEBUGPRINTF(fmt, ...) aheinecke@287: #endif aheinecke@287: aheinecke@287: /** aheinecke@287: * @def ERRORPRINTF(fmt, ...) aheinecke@287: * @brief Debug printf aheinecke@287: * aheinecke@287: * Prints an error to stderr aheinecke@287: */ aheinecke@287: #define ERRORPRINTF(fmt, ...) fprintf(stderr, DEBUGPREFIX "ERROR: " fmt, ##__VA_ARGS__); aheinecke@287: aheinecke@503: #define PRINTLASTERROR(msg) \ aheinecke@503: char *my_error = getLastErrorMsg(); \ aheinecke@503: if (my_error) { \ aheinecke@503: ERRORPRINTF(msg" : %s\n", my_error); \ aheinecke@503: free (my_error); \ aheinecke@503: } \ aheinecke@503: ERRORPRINTF ("Failed to get error information\n"); aheinecke@287: aheinecke@287: aheinecke@252: #ifdef __cplusplus aheinecke@252: } aheinecke@252: #endif aheinecke@252: aheinecke@252: #endif /* COMMON_LOGGING_H */