00001
00002
00003
00004
00005 #ifndef _U_CARPAL_H_
00006 #define _U_CARPAL_H_
00007 #include "libu_conf.h"
00008 #include <sys/types.h>
00009 #include <sys/time.h>
00010 #include <string.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <stdarg.h>
00014
00015 #include <u/syslog.h>
00016 #include <u/log.h>
00017
00018 #ifdef __cplusplus
00019 extern "C" {
00020 #endif
00021
00022 #define msg(label, ...) label( __VA_ARGS__)
00023 #define msg_noargs(label, literal) label("%s", literal)
00024
00030 #define msg_err(label, ...) do { msg(label, __VA_ARGS__); goto err; } while(0)
00031
00041 #define msg_if(label, expr) do { if( expr ) msg_noargs(label, #expr); } while(0)
00042
00057 #define msg_ifb(label, expr) if( (expr) && (msg_noargs(label, #expr) ? 1 : 1) )
00058
00069 #define msg_return_if(label, expr, err) msg_ifb(label, expr) return err
00070
00078 #define msg_return_sif(label, expr, err) \
00079 do { msg_ifb(label, expr) { msg_strerror(label, errno); return err; } } while(0)
00080
00088 #define msg_goto_if(label, expr, gt) msg_ifb(label, expr) goto gt
00089
00097 #define msg_err_if(label, expr) do { msg_ifb(label, expr) { goto err;} } while(0)
00098
00105 #define msg_err_ifm(label, expr, ...) \
00106 do { if( (expr) ) { msg(label, __VA_ARGS__); goto err; } } while(0)
00107
00113 #define msg_err_sif(label, expr) \
00114 do { msg_ifb(label, expr) { msg_strerror(label, errno); goto err; } } while(0)
00115
00117 #ifdef OS_WIN
00118 #define msg_strerror(label, en) \
00119 do { \
00120 LPVOID lpMsgBuf = NULL; DWORD dw = GetLastError(); \
00121 if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | \
00122 FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, \
00123 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
00124 (LPTSTR) &lpMsgBuf, 0, NULL ) && lpMsgBuf) \
00125 { \
00126 msg(label, "%s", lpMsgBuf); \
00127 LocalFree(lpMsgBuf); \
00128 } \
00129 } while(0)
00130 #else
00131 #ifdef HAVE_STRERROR_R
00132 #ifdef STRERROR_R_CHAR_P
00133 #define msg_strerror(label, en) \
00134 do { \
00135 enum { _DBG_BUFSZ = 256 }; \
00136 char *p, _eb[_DBG_BUFSZ] = { 0 }; \
00137 p = strerror_r(en, _eb, _DBG_BUFSZ); \
00138 if(p) { \
00139 msg(label, "%s", p); \
00140 } else { \
00141 msg(label, "strerror_r(%d, ...) failed", en); \
00142 } \
00143 } while(0)
00144 #else
00145 #define msg_strerror(label, en) \
00146 do { \
00147 enum { _DBG_BUFSZ = 256 }; \
00148 char _eb[_DBG_BUFSZ] = { 0 }; \
00149 if(strerror_r(en, _eb, _DBG_BUFSZ) == 0) { \
00150 msg(label, "%s", _eb); \
00151 } else { \
00152 msg(label, "strerror_r(%d, ...) failed", en); \
00153 } \
00154 } while(0)
00155 #endif
00156 #else
00157 #define msg_strerror(label, en) \
00158 do { \
00159 char *p; \
00160 if((p = strerror(en)) != NULL) { \
00161 msg(label, "%s", p); \
00162 } else { \
00163 msg(label, "strerror(%d) failed", en); \
00164 } \
00165 } while(0)
00166 #endif
00167 #endif
00168
00169
00170 #define nop_return_if(expr, err) do { if(expr) return err; } while(0)
00171 #define nop_err_if(expr) do { if(expr) goto err; } while(0)
00172 #define nop_goto_if(expr, gt) do { if(expr) goto gt; } while(0)
00173
00174
00175 #define con(...) msg(console, __VA_ARGS__)
00176 #define con_err(...) msg_err(console, __VA_ARGS__)
00177 #define con_ifb(expr) msg_ifb(console, expr)
00178 #define con_if(expr) msg_if(console, expr)
00179 #define con_return_if(expr, err) msg_return_if(console, expr, err)
00180 #define con_err_if(expr) msg_err_if(console, expr)
00181 #define con_err_ifm(expr, ...) \
00182 msg_err_ifm(console, expr, __VA_ARGS__)
00183 #define con_goto_if(expr, gt) msg_goto_if(console, expr, gt)
00184 #define con_strerror(errno) msg_strerror(console, errno)
00185
00186
00187
00188 #define info_err(...) msg_err(info, __VA_ARGS__)
00189 #define info_ifb(expr) msg_ifb(info, expr)
00190 #define info_if(expr) msg_if(info, expr)
00191 #define info_return_if(expr, err) msg_return_if(info, expr, err)
00192 #define info_err_if(expr) msg_err_if(info, expr)
00193 #define info_err_sif(expr) msg_err_sif(info, expr)
00194 #define info_err_ifm(expr, ...) \
00195 msg_err_ifm(info, expr, __VA_ARGS__)
00196 #define info_goto_if(expr, gt) msg_goto_if(info, expr, gt)
00197 #define info_strerror(errno) msg_strerror(info, errno)
00198
00199
00200 #define warn(...) msg(warning, __VA_ARGS__)
00201 #define warn_err(...) msg_err(warning, __VA_ARGS__)
00202 #define warn_ifb(expr) msg_ifb(warning, expr)
00203 #define warn_if(expr) msg_if(warning, expr)
00204 #define warn_return_if(expr, err) msg_return_if(warning, expr, err)
00205 #define warn_err_if(expr) msg_err_if(warning, expr)
00206 #define warn_err_sif(expr) msg_err_sif(warning, expr)
00207 #define warn_err_ifm(expr, ...) \
00208 msg_err_ifm(warning, expr, __VA_ARGS__)
00209 #define warn_goto_if(expr, gt) msg_goto_if(warning, expr, gt)
00210 #define warn_strerror(errno) msg_strerror(warning, errno)
00211
00212
00213 #ifdef DEBUG
00214 #define dbg(...) msg(debug, __VA_ARGS__)
00215 #define dbg_err(...) msg_err(debug, __VA_ARGS__)
00216 #define dbg_ifb(expr) msg_ifb(debug, expr)
00217 #define dbg_if(expr) msg_if(debug, expr)
00218 #define dbg_return_if(expr, err) msg_return_if(debug, expr, err)
00219 #define dbg_return_sif(expr, err) msg_return_sif(debug, expr, err)
00220 #define dbg_err_if(expr) msg_err_if(debug, expr)
00221 #define dbg_err_sif(expr) msg_err_sif(debug, expr)
00222 #define dbg_err_ifm(expr, ...) \
00223 msg_err_ifm(debug, expr, __VA_ARGS__)
00224 #define dbg_goto_if(expr, gt) msg_goto_if(debug, expr, gt)
00225 #define dbg_strerror(errno) msg_strerror(debug, errno)
00226
00227 #define TIMER_ON \
00228 time_t _t_beg = time(0), _t_prev = _t_beg, _t_now; int _t_step = 0
00229 #define TIMER_STEP \
00230 do { \
00231 _t_now = time(0); \
00232 dbg(" step %u: %u s (delta: %u s)", \
00233 _t_step++, _t_now - _t_beg, _t_now - _t_prev); \
00234 _t_prev = _t_now; \
00235 } while(0)
00236 #define TIMER_OFF dbg("elapsed: %u s", (time(0) - _t_beg))
00237 #else
00238 #include <ctype.h>
00239
00240 #define dbg_nop() isspace(0)
00241 #define dbg(...) dbg_nop()
00242 #define dbg_err(...) do { goto err; } while(0)
00243 #define dbg_ifb(expr) if( (expr) )
00244 #define dbg_if(expr) expr
00245 #define dbg_return_if(expr, err) do { if( (expr) ) return err; } while(0)
00246 #define dbg_err_if(expr) do { if( (expr)) goto err; } while(0)
00247 #define dbg_err_sif(expr) do { if( (expr)) goto err; } while(0)
00248 #define dbg_err_ifm(expr, ...) do { if( (expr)) goto err; } while(0)
00249 #define dbg_goto_if(expr, gt) do { if((expr)) goto gt; } while(0)
00250 #define dbg_strerror(errno) dbg_nop()
00251 #define TIMER_ON
00252 #define TIMER_STEP
00253 #define TIMER_OFF
00254 #endif
00255
00256 #ifdef __cplusplus
00257 }
00258 #endif
00259
00260 #endif
00261