// // 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