Home | History | Annotate | Download | only in minzip
      1 //
      2 // Copyright 2005 The Android Open Source Project
      3 //
      4 // C/C++ logging functions.  See the logging documentation for API details.
      5 //
      6 // We'd like these to be available from C code (in case we import some from
      7 // somewhere), so this has a C interface.
      8 //
      9 // The output will be correct when the log file is shared between multiple
     10 // threads and/or multiple processes so long as the operating system
     11 // supports O_APPEND.  These calls have mutex-protected data structures
     12 // and so are NOT reentrant.  Do not use LOG in a signal handler.
     13 //
     14 #ifndef _MINZIP_LOG_H
     15 #define _MINZIP_LOG_H
     16 
     17 #include <stdio.h>
     18 
     19 // ---------------------------------------------------------------------
     20 
     21 /*
     22  * Normally we strip LOGV (VERBOSE messages) from release builds.
     23  * You can modify this (for example with "#define LOG_NDEBUG 0"
     24  * at the top of your source file) to change that behavior.
     25  */
     26 #ifndef LOG_NDEBUG
     27 #ifdef NDEBUG
     28 #define LOG_NDEBUG 1
     29 #else
     30 #define LOG_NDEBUG 0
     31 #endif
     32 #endif
     33 
     34 /*
     35  * This is the local tag used for the following simplified
     36  * logging macros.  You can change this preprocessor definition
     37  * before using the other macros to change the tag.
     38  */
     39 #ifndef LOG_TAG
     40 #define LOG_TAG NULL
     41 #endif
     42 
     43 // ---------------------------------------------------------------------
     44 
     45 /*
     46  * Simplified macro to send a verbose log message using the current LOG_TAG.
     47  */
     48 #ifndef LOGV
     49 #if LOG_NDEBUG
     50 #define LOGV(...)   ((void)0)
     51 #else
     52 #define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
     53 #endif
     54 #endif
     55 
     56 #define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
     57 
     58 #ifndef LOGV_IF
     59 #if LOG_NDEBUG
     60 #define LOGV_IF(cond, ...)   ((void)0)
     61 #else
     62 #define LOGV_IF(cond, ...) \
     63     ( (CONDITION(cond)) \
     64     ? ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
     65     : (void)0 )
     66 #endif
     67 #endif
     68 
     69 #define LOGVV LOGV
     70 #define LOGVV_IF LOGV_IF
     71 
     72 /*
     73  * Simplified macro to send a debug log message using the current LOG_TAG.
     74  */
     75 #ifndef LOGD
     76 #define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
     77 #endif
     78 
     79 #ifndef LOGD_IF
     80 #define LOGD_IF(cond, ...) \
     81     ( (CONDITION(cond)) \
     82     ? ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
     83     : (void)0 )
     84 #endif
     85 
     86 /*
     87  * Simplified macro to send an info log message using the current LOG_TAG.
     88  */
     89 #ifndef LOGI
     90 #define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
     91 #endif
     92 
     93 #ifndef LOGI_IF
     94 #define LOGI_IF(cond, ...) \
     95     ( (CONDITION(cond)) \
     96     ? ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
     97     : (void)0 )
     98 #endif
     99 
    100 /*
    101  * Simplified macro to send a warning log message using the current LOG_TAG.
    102  */
    103 #ifndef LOGW
    104 #define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
    105 #endif
    106 
    107 #ifndef LOGW_IF
    108 #define LOGW_IF(cond, ...) \
    109     ( (CONDITION(cond)) \
    110     ? ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
    111     : (void)0 )
    112 #endif
    113 
    114 /*
    115  * Simplified macro to send an error log message using the current LOG_TAG.
    116  */
    117 #ifndef LOGE
    118 #define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
    119 #endif
    120 
    121 #ifndef LOGE_IF
    122 #define LOGE_IF(cond, ...) \
    123     ( (CONDITION(cond)) \
    124     ? ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
    125     : (void)0 )
    126 #endif
    127 
    128 
    129 /*
    130  * Conditional based on whether the current LOG_TAG is enabled at
    131  * verbose priority.
    132  */
    133 #ifndef IF_LOGV
    134 #if LOG_NDEBUG
    135 #define IF_LOGV() if (false)
    136 #else
    137 #define IF_LOGV() IF_LOG(LOG_VERBOSE, LOG_TAG)
    138 #endif
    139 #endif
    140 
    141 /*
    142  * Conditional based on whether the current LOG_TAG is enabled at
    143  * debug priority.
    144  */
    145 #ifndef IF_LOGD
    146 #define IF_LOGD() IF_LOG(LOG_DEBUG, LOG_TAG)
    147 #endif
    148 
    149 /*
    150  * Conditional based on whether the current LOG_TAG is enabled at
    151  * info priority.
    152  */
    153 #ifndef IF_LOGI
    154 #define IF_LOGI() IF_LOG(LOG_INFO, LOG_TAG)
    155 #endif
    156 
    157 /*
    158  * Conditional based on whether the current LOG_TAG is enabled at
    159  * warn priority.
    160  */
    161 #ifndef IF_LOGW
    162 #define IF_LOGW() IF_LOG(LOG_WARN, LOG_TAG)
    163 #endif
    164 
    165 /*
    166  * Conditional based on whether the current LOG_TAG is enabled at
    167  * error priority.
    168  */
    169 #ifndef IF_LOGE
    170 #define IF_LOGE() IF_LOG(LOG_ERROR, LOG_TAG)
    171 #endif
    172 
    173 // ---------------------------------------------------------------------
    174 
    175 /*
    176  * Basic log message macro.
    177  *
    178  * Example:
    179  *  LOG(LOG_WARN, NULL, "Failed with error %d", errno);
    180  *
    181  * The second argument may be NULL or "" to indicate the "global" tag.
    182  *
    183  * Non-gcc probably won't have __FUNCTION__.  It's not vital.  gcc also
    184  * offers __PRETTY_FUNCTION__, which is rather more than we need.
    185  */
    186 #ifndef LOG
    187 #define LOG(priority, tag, ...) \
    188     LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
    189 #endif
    190 
    191 /*
    192  * Log macro that allows you to specify a number for the priority.
    193  */
    194 #ifndef LOG_PRI
    195 #define LOG_PRI(priority, tag, ...) \
    196     printf(tag ": " __VA_ARGS__)
    197 #endif
    198 
    199 /*
    200  * Conditional given a desired logging priority and tag.
    201  */
    202 #ifndef IF_LOG
    203 #define IF_LOG(priority, tag) \
    204     if (1)
    205 #endif
    206 
    207 #endif // _MINZIP_LOG_H
    208