| // | 
 | // Copyright 2005 The Android Open Source Project | 
 | // | 
 | // C/C++ logging functions.  See the logging documentation for API details. | 
 | // | 
 | // We'd like these to be available from C code (in case we import some from | 
 | // somewhere), so this has a C interface. | 
 | // | 
 | // The output will be correct when the log file is shared between multiple | 
 | // threads and/or multiple processes so long as the operating system | 
 | // supports O_APPEND.  These calls have mutex-protected data structures | 
 | // and so are NOT reentrant.  Do not use LOG in a signal handler. | 
 | // | 
 | #ifndef _MINZIP_LOG_H | 
 | #define _MINZIP_LOG_H | 
 |  | 
 | #include <stdio.h> | 
 |  | 
 | // --------------------------------------------------------------------- | 
 |  | 
 | /* | 
 |  * Normally we strip LOGV (VERBOSE messages) from release builds. | 
 |  * You can modify this (for example with "#define LOG_NDEBUG 0" | 
 |  * at the top of your source file) to change that behavior. | 
 |  */ | 
 | #ifndef LOG_NDEBUG | 
 | #ifdef NDEBUG | 
 | #define LOG_NDEBUG 1 | 
 | #else | 
 | #define LOG_NDEBUG 0 | 
 | #endif | 
 | #endif | 
 |  | 
 | /* | 
 |  * This is the local tag used for the following simplified | 
 |  * logging macros.  You can change this preprocessor definition | 
 |  * before using the other macros to change the tag. | 
 |  */ | 
 | #ifndef LOG_TAG | 
 | #define LOG_TAG NULL | 
 | #endif | 
 |  | 
 | // --------------------------------------------------------------------- | 
 |  | 
 | /* | 
 |  * Simplified macro to send a verbose log message using the current LOG_TAG. | 
 |  */ | 
 | #ifndef LOGV | 
 | #if LOG_NDEBUG | 
 | #define LOGV(...)   ((void)0) | 
 | #else | 
 | #define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) | 
 | #endif | 
 | #endif | 
 |  | 
 | #define CONDITION(cond)     (__builtin_expect((cond)!=0, 0)) | 
 |  | 
 | #ifndef LOGV_IF | 
 | #if LOG_NDEBUG | 
 | #define LOGV_IF(cond, ...)   ((void)0) | 
 | #else | 
 | #define LOGV_IF(cond, ...) \ | 
 |     ( (CONDITION(cond)) \ | 
 |     ? ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ | 
 |     : (void)0 ) | 
 | #endif | 
 | #endif | 
 |  | 
 | #define LOGVV LOGV | 
 | #define LOGVV_IF LOGV_IF | 
 |  | 
 | /* | 
 |  * Simplified macro to send a debug log message using the current LOG_TAG. | 
 |  */ | 
 | #ifndef LOGD | 
 | #define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) | 
 | #endif | 
 |  | 
 | #ifndef LOGD_IF | 
 | #define LOGD_IF(cond, ...) \ | 
 |     ( (CONDITION(cond)) \ | 
 |     ? ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ | 
 |     : (void)0 ) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Simplified macro to send an info log message using the current LOG_TAG. | 
 |  */ | 
 | #ifndef LOGI | 
 | #define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) | 
 | #endif | 
 |  | 
 | #ifndef LOGI_IF | 
 | #define LOGI_IF(cond, ...) \ | 
 |     ( (CONDITION(cond)) \ | 
 |     ? ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \ | 
 |     : (void)0 ) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Simplified macro to send a warning log message using the current LOG_TAG. | 
 |  */ | 
 | #ifndef LOGW | 
 | #define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) | 
 | #endif | 
 |  | 
 | #ifndef LOGW_IF | 
 | #define LOGW_IF(cond, ...) \ | 
 |     ( (CONDITION(cond)) \ | 
 |     ? ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \ | 
 |     : (void)0 ) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Simplified macro to send an error log message using the current LOG_TAG. | 
 |  */ | 
 | #ifndef LOGE | 
 | #define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) | 
 | #endif | 
 |  | 
 | #ifndef LOGE_IF | 
 | #define LOGE_IF(cond, ...) \ | 
 |     ( (CONDITION(cond)) \ | 
 |     ? ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ | 
 |     : (void)0 ) | 
 | #endif | 
 |  | 
 |  | 
 | /* | 
 |  * Conditional based on whether the current LOG_TAG is enabled at | 
 |  * verbose priority. | 
 |  */ | 
 | #ifndef IF_LOGV | 
 | #if LOG_NDEBUG | 
 | #define IF_LOGV() if (false) | 
 | #else | 
 | #define IF_LOGV() IF_LOG(LOG_VERBOSE, LOG_TAG) | 
 | #endif | 
 | #endif | 
 |  | 
 | /* | 
 |  * Conditional based on whether the current LOG_TAG is enabled at | 
 |  * debug priority. | 
 |  */ | 
 | #ifndef IF_LOGD | 
 | #define IF_LOGD() IF_LOG(LOG_DEBUG, LOG_TAG) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Conditional based on whether the current LOG_TAG is enabled at | 
 |  * info priority. | 
 |  */ | 
 | #ifndef IF_LOGI | 
 | #define IF_LOGI() IF_LOG(LOG_INFO, LOG_TAG) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Conditional based on whether the current LOG_TAG is enabled at | 
 |  * warn priority. | 
 |  */ | 
 | #ifndef IF_LOGW | 
 | #define IF_LOGW() IF_LOG(LOG_WARN, LOG_TAG) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Conditional based on whether the current LOG_TAG is enabled at | 
 |  * error priority. | 
 |  */ | 
 | #ifndef IF_LOGE | 
 | #define IF_LOGE() IF_LOG(LOG_ERROR, LOG_TAG) | 
 | #endif | 
 |  | 
 | // --------------------------------------------------------------------- | 
 |  | 
 | /* | 
 |  * Basic log message macro. | 
 |  * | 
 |  * Example: | 
 |  *  LOG(LOG_WARN, NULL, "Failed with error %d", errno); | 
 |  * | 
 |  * The second argument may be NULL or "" to indicate the "global" tag. | 
 |  * | 
 |  * Non-gcc probably won't have __FUNCTION__.  It's not vital.  gcc also | 
 |  * offers __PRETTY_FUNCTION__, which is rather more than we need. | 
 |  */ | 
 | #ifndef LOG | 
 | #define LOG(priority, tag, ...) \ | 
 |     LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Log macro that allows you to specify a number for the priority. | 
 |  */ | 
 | #ifndef LOG_PRI | 
 | #define LOG_PRI(priority, tag, ...) \ | 
 |     printf(tag ": " __VA_ARGS__) | 
 | #endif | 
 |  | 
 | /* | 
 |  * Conditional given a desired logging priority and tag. | 
 |  */ | 
 | #ifndef IF_LOG | 
 | #define IF_LOG(priority, tag) \ | 
 |     if (1) | 
 | #endif | 
 |  | 
 | #endif // _MINZIP_LOG_H |