00001
00002
00003
00004
00005 #ifndef _U_CARPAL_H_
00006 #define _U_CARPAL_H_
00007
00008 #include <u/libu_conf.h>
00009 #include <sys/types.h>
00010 #include <sys/time.h>
00011 #include <string.h>
00012 #include <stdio.h>
00013 #include <errno.h>
00014 #include <stdarg.h>
00015
00016 #include <u/missing/syslog.h>
00017 #include <u/toolbox/log.h>
00018
00019 #ifdef __cplusplus
00020 extern "C" {
00021 #endif
00022
00023 #define msg(label, err, ...) label( err, __VA_ARGS__ )
00024 #define msg_noargs(label, err, literal) label( err, "%s", literal)
00025
00031 #define msg_err(label, ...) \
00032 do { msg(label, 0, __VA_ARGS__); goto err; } while(0)
00033
00043 #define msg_if(label, expr) do { if( expr ) \
00044 msg_noargs(label, 0, #expr); } while(0)
00045
00053 #define msg_ifm(label, expr, ...) \
00054 do { if(expr) { msg(label, 0, __VA_ARGS__); } } while(0);
00055
00070 #define msg_ifb(label, expr) \
00071 if( (expr) && (msg_noargs(label, 0, #expr) ? 1 : 1) )
00072
00083 #define msg_return_if(label, expr, err) msg_ifb(label, expr) { return err; }
00084
00093 #define msg_return_ifm(label, expr, err, ...) \
00094 if(expr) { msg(label, 0, __VA_ARGS__); return err; }
00095
00104 #define msg_return_sifm(label, expr, err, ...) \
00105 if(expr) { msg(label, errno, __VA_ARGS__); return err; }
00106
00114 #define msg_return_sif(label, expr, err) \
00115 do { if(expr) { msg_noargs(label, errno, #expr); return err; } } while(0)
00116
00124 #define msg_goto_if(label, expr, gt) msg_ifb(label, expr) goto gt
00125
00133 #define msg_err_if(label, expr) do { msg_ifb(label, expr) { goto err;} } while(0)
00134
00141 #define msg_err_ifm(label, expr, ...) \
00142 do { if( (expr) ) { msg(label, 0, __VA_ARGS__); goto err; } } while(0)
00143
00150 #define msg_err_sif(label, expr) \
00151 do { if(expr) { msg_noargs(label, errno, #expr); goto err; } } while(0)
00152
00160 #define msg_err_sifm(label, expr, ...) \
00161 do { if((expr)) { msg(label, errno, __VA_ARGS__); goto err; } } while(0)
00162
00163
00165 #ifdef OS_WIN
00166 #define msg_strerror(label, en) \
00167 do { \
00168 LPVOID lpMsgBuf = NULL; DWORD dw = GetLastError(); \
00169 if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | \
00170 FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, \
00171 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
00172 (LPTSTR) &lpMsgBuf, 0, NULL ) && lpMsgBuf) \
00173 { \
00174 msg(label, 0, "%s", lpMsgBuf); \
00175 LocalFree(lpMsgBuf); \
00176 } \
00177 } while(0)
00178 #else
00179
00180 #define msg_strerror(label, en) \
00181 do { \
00182 enum { _DBG_BUFSZ = 256 }; \
00183 char _eb[_DBG_BUFSZ] = { 0 }; \
00184 if(u_strerror_r(en, _eb, _DBG_BUFSZ)) { \
00185 msg(label, 0, "strerror_r(%d, ...) failed", en); \
00186 } else { \
00187 msg(label, 0, "errno: %d (%s)", errno, _eb); \
00188 } \
00189 } while(0)
00190
00191 #endif
00192
00193
00194 #define nop_return_if(expr, err) do { if(expr) return err; } while(0)
00195 #define nop_err_if(expr) do { if(expr) goto err; } while(0)
00196 #define nop_goto_if(expr, gt) do { if(expr) goto gt; } while(0)
00197
00198
00199 #define con(...) msg(con_, 0, __VA_ARGS__)
00200 #define con_err(...) msg_err(con_, __VA_ARGS__)
00201 #define con_ifb(expr) msg_ifb(con_, expr)
00202 #define con_if(expr) msg_if(con_, expr)
00203 #define con_ifm(expr, ...) msg_ifm(con_, expr, __VA_ARGS__)
00204
00205 #define con_return_if(expr, err) msg_return_if(con_, expr, err)
00206 #define con_return_sif(expr, err) msg_return_sif(con_, expr, err)
00207 #define con_return_ifm(expr, err, ...) \
00208 msg_return_ifm(con_, expr, err, __VA_ARGS__)
00209 #define con_return_sifm(expr, err, ...) \
00210 msg_return_sifm(con_, expr, err, __VA_ARGS__)
00211
00212 #define con_err_if(expr) msg_err_if(con_, expr)
00213 #define con_err_sif(expr) msg_err_sif(con_, expr)
00214 #define con_err_ifm(expr, ...) msg_err_ifm(con_, expr, __VA_ARGS__)
00215 #define con_err_sifm(expr, ...) msg_err_sifm(con_, expr, __VA_ARGS__)
00216
00217 #define con_goto_if(expr, gt) msg_goto_if(con_, expr, gt)
00218 #define con_strerror(err) msg_strerror(con_, err)
00219
00220
00221 #define emerg(...) msg(emerg_, 0, __VA_ARGS__)
00222 #define emerg_err(...) msg_err(emerg_, __VA_ARGS__)
00223 #define emerg_ifb(expr) msg_ifb(emerg_, expr)
00224 #define emerg_if(expr) msg_if(emerg_, expr)
00225 #define emerg_ifm(expr, ...) msg_ifm(emerg_, expr, __VA_ARGS__)
00226
00227 #define emerg_return_if(expr, err) msg_return_if(emerg_, expr, err)
00228 #define emerg_return_sif(expr, err) msg_return_sif(emerg_, expr, err)
00229 #define emerg_return_ifm(expr, err, ...) \
00230 msg_return_ifm(emerg_, expr, err, __VA_ARGS__)
00231 #define emerg_return_sifm(expr, err, ...) \
00232 msg_return_sifm(emerg_, expr, err, __VA_ARGS__)
00233
00234 #define emerg_err_if(expr) msg_err_if(emerg_, expr)
00235 #define emerg_err_sif(expr) msg_err_sif(emerg_, expr)
00236 #define emerg_err_ifm(expr, ...) msg_err_ifm(emerg_, expr, __VA_ARGS__)
00237 #define emerg_err_sifm(expr, ...) msg_err_sifm(emerg_, expr, __VA_ARGS__)
00238
00239 #define emerg_goto_if(expr, gt) msg_goto_if(emerg_, expr, gt)
00240 #define emerg_strerror(err) msg_strerror(emerg_, err)
00241
00242
00243 #define alert(...) msg(alert_, 0, __VA_ARGS__)
00244 #define alert_err(...) msg_err(alert_, __VA_ARGS__)
00245 #define alert_ifb(expr) msg_ifb(alert_, expr)
00246 #define alert_if(expr) msg_if(alert_, expr)
00247 #define alert_ifm(expr, ...) msg_ifm(alert_, expr, __VA_ARGS__)
00248
00249 #define alert_return_if(expr, err) msg_return_if(alert_, expr, err)
00250 #define alert_return_sif(expr, err) msg_return_sif(alert_, expr, err)
00251 #define alert_return_ifm(expr, err, ...) \
00252 msg_return_ifm(alert_, expr, err, __VA_ARGS__)
00253 #define alert_return_sifm(expr, err, ...) \
00254 msg_return_sifm(alert_, expr, err, __VA_ARGS__)
00255
00256 #define alert_err_if(expr) msg_err_if(alert_, expr)
00257 #define alert_err_sif(expr) msg_err_sif(alert_, expr)
00258 #define alert_err_ifm(expr, ...) msg_err_ifm(alert_, expr, __VA_ARGS__)
00259 #define alert_err_sifm(expr, ...) msg_err_sifm(alert_, expr, __VA_ARGS__)
00260
00261 #define alert_goto_if(expr, gt) msg_goto_if(alert_, expr, gt)
00262 #define alert_strerror(err) msg_strerror(alert_, err)
00263
00264
00265 #define crit(...) msg(crit_, 0, __VA_ARGS__)
00266 #define crit_err(...) msg_err(crit_, __VA_ARGS__)
00267 #define crit_ifb(expr) msg_ifb(crit_, expr)
00268 #define crit_if(expr) msg_if(crit_, expr)
00269 #define crit_ifm(expr, ...) msg_ifm(crit_, expr, __VA_ARGS__)
00270
00271 #define crit_return_if(expr, err) msg_return_if(crit_, expr, err)
00272 #define crit_return_sif(expr, err) msg_return_sif(crit_, expr, err)
00273 #define crit_return_ifm(expr, err, ...) \
00274 msg_return_ifm(crit_, expr, err, __VA_ARGS__)
00275 #define crit_return_sifm(expr, err, ...) \
00276 msg_return_sifm(crit_, expr, err, __VA_ARGS__)
00277
00278 #define crit_err_if(expr) msg_err_if(crit_, expr)
00279 #define crit_err_sif(expr) msg_err_sif(crit_, expr)
00280 #define crit_err_ifm(expr, ...) msg_err_ifm(crit_, expr, __VA_ARGS__)
00281 #define crit_err_sifm(expr, ...) msg_err_sifm(crit_, expr, __VA_ARGS__)
00282
00283 #define crit_goto_if(expr, gt) msg_goto_if(crit, expr, gt)
00284 #define crit_strerror(err) msg_strerror(crit, err)
00285
00286
00287 #define err(...) msg(err_, 0, __VA_ARGS__)
00288 #define err_err(...) msg_err(err_, __VA_ARGS__)
00289 #define err_ifb(expr) msg_ifb(err_, expr)
00290 #define err_if(expr) msg_if(err_, expr)
00291 #define err_ifm(expr, ...) msg_ifm(err_, expr, __VA_ARGS__)
00292
00293 #define err_return_if(expr, err) msg_return_if(err_, expr, err)
00294 #define err_return_sif(expr, err) msg_return_sif(err_, expr, err)
00295 #define err_return_ifm(expr, err, ...) \
00296 msg_return_ifm(err_, expr, err, __VA_ARGS__)
00297 #define err_return_sifm(expr, err, ...) \
00298 msg_return_sifm(err_, expr, err, __VA_ARGS__)
00299
00300 #define err_err_if(expr) msg_err_if(err_, expr)
00301 #define err_err_sif(expr) msg_err_sif(err_, expr)
00302 #define err_err_ifm(expr, ...) msg_err_ifm(err_, expr, __VA_ARGS__)
00303 #define err_err_sifm(expr, ...) msg_err_sifm(err_, expr, __VA_ARGS__)
00304
00305 #define err_goto_if(expr, gt) msg_goto_if(err_, expr, gt)
00306 #define err_strerror(err) msg_strerror(err_, err)
00307
00308
00309 #define warn(...) msg(warn_, 0, __VA_ARGS__)
00310 #define warn_err(...) msg_err(warn_, __VA_ARGS__)
00311 #define warn_ifb(expr) msg_ifb(warn_, expr)
00312 #define warn_if(expr) msg_if(warn_, expr)
00313 #define warn_ifm(expr, ...) msg_ifm(warn_, expr, __VA_ARGS__)
00314
00315 #define warn_return_if(expr, err) msg_return_if(warn_, expr, err)
00316 #define warn_return_sif(expr, err) msg_return_sif(warn_, expr, err)
00317 #define warn_return_ifm(expr, err, ...) \
00318 msg_return_ifm(warn_, expr, err, __VA_ARGS__)
00319 #define warn_return_sifm(expr, err, ...) \
00320 msg_return_sifm(warn_, expr, err, __VA_ARGS__)
00321
00322 #define warn_err_if(expr) msg_err_if(warn_, expr)
00323 #define warn_err_sif(expr) msg_err_sif(warn_, expr)
00324 #define warn_err_ifm(expr, ...) msg_err_ifm(warn_, expr, __VA_ARGS__)
00325 #define warn_err_sifm(expr, ...) msg_err_sifm(warn_, expr, __VA_ARGS__)
00326
00327 #define warn_goto_if(expr, gt) msg_goto_if(warn_, expr, gt)
00328 #define warn_strerror(err) msg_strerror(warn_, err)
00329
00330
00331 #define notice(...) msg(notice_, 0, __VA_ARGS__)
00332 #define notice_err(...) msg_err(notice_, __VA_ARGS__)
00333 #define notice_ifb(expr) msg_ifb(notice_, expr)
00334 #define notice_if(expr) msg_if(notice_, expr)
00335 #define notice_ifm(expr, ...) msg_ifm(notice_, expr, __VA_ARGS__)
00336
00337 #define notice_return_if(expr, err) msg_return_if(notice_, expr, err)
00338 #define notice_return_sif(expr, err) msg_return_sif(notice_, expr, err)
00339 #define notice_return_ifm(expr, err, ...) \
00340 msg_return_ifm(notice_, expr, err, __VA_ARGS__)
00341 #define notice_return_sifm(expr, err, ...) \
00342 msg_return_sifm(notice_, expr, err, __VA_ARGS__)
00343
00344 #define notice_err_if(expr) msg_err_if(notice_, expr)
00345 #define notice_err_sif(expr) msg_err_sif(notice_, expr)
00346 #define notice_err_ifm(expr, ...) \
00347 msg_err_ifm(notice_, expr, __VA_ARGS__)
00348 #define notice_err_sifm(expr, ...) \
00349 msg_err_sifm(notice_, expr, __VA_ARGS__)
00350
00351 #define notice_goto_if(expr, gt) msg_goto_if(notice_, expr, gt)
00352 #define notice_strerror(err) msg_strerror(notice_, err)
00353
00354
00355 #define info(...) msg(info_, 0, __VA_ARGS__)
00356 #define info_err(...) msg_err(info_, __VA_ARGS__)
00357 #define info_ifb(expr) msg_ifb(info_, expr)
00358 #define info_if(expr) msg_if(info_, expr)
00359 #define info_ifm(expr, ...) msg_ifm(info_, expr, __VA_ARGS__)
00360
00361 #define info_return_if(expr, err) msg_return_if(info_, expr, err)
00362 #define info_return_sif(expr, err) msg_return_sif(info_, expr, err)
00363 #define info_return_ifm(expr, err, ...) \
00364 msg_return_ifm(info_, expr, err, __VA_ARGS__)
00365 #define info_return_sifm(expr, err, ...) \
00366 msg_return_sifm(info_, expr, err, __VA_ARGS__)
00367
00368 #define info_err_if(expr) msg_err_if(info_, expr)
00369 #define info_err_sif(expr) msg_err_sif(info_, expr)
00370 #define info_err_ifm(expr, ...) msg_err_ifm(info_, expr, __VA_ARGS__)
00371 #define info_err_sifm(expr, ...) msg_err_sifm(info_, expr, __VA_ARGS__)
00372
00373 #define info_goto_if(expr, gt) msg_goto_if(info_, expr, gt)
00374 #define info_strerror(err) msg_strerror(info_, err)
00375
00376
00377 #ifdef DEBUG
00378 #define dbg(...) msg(dbg_, 0, __VA_ARGS__)
00379 #define dbg_err(...) msg_err(dbg_, __VA_ARGS__)
00380
00381 #define dbg_if(expr) msg_if(dbg_, expr)
00382 #define dbg_ifb(expr) msg_ifb(dbg_, expr)
00383 #define dbg_ifm(expr, ...) msg_ifm(dbg_, expr, __VA_ARGS__)
00384
00385 #define dbg_return_if(expr, err) msg_return_if(dbg_, expr, err)
00386 #define dbg_return_sif(expr, err) msg_return_sif(dbg_, expr, err)
00387 #define dbg_return_ifm(expr, err, ...) \
00388 msg_return_ifm(dbg_, expr, err, __VA_ARGS__)
00389 #define dbg_return_sifm(expr, err, ...) \
00390 msg_return_sifm(dbg_, expr, err, __VA_ARGS__)
00391
00392 #define dbg_err_if(expr) msg_err_if(dbg_, expr)
00393 #define dbg_err_sif(expr) msg_err_sif(dbg_, expr)
00394 #define dbg_err_ifm(expr, ...) msg_err_ifm(dbg_, expr, __VA_ARGS__)
00395 #define dbg_err_sifm(expr, ...) msg_err_sifm(dbg_, expr, __VA_ARGS__)
00396
00397 #define dbg_goto_if(expr, gt) msg_goto_if(dbg_, expr, gt)
00398 #define dbg_strerror(err) msg_strerror(dbg_, err)
00399
00400
00401 #define TIMER_ON \
00402 time_t _t_beg = time(0), _t_prev = _t_beg, _t_now; int _t_step = 0
00403 #define TIMER_STEP \
00404 do { \
00405 _t_now = time(0); \
00406 dbg(" step %u: %u s (delta: %u s)", \
00407 _t_step++, _t_now - _t_beg, _t_now - _t_prev); \
00408 _t_prev = _t_now; \
00409 } while(0)
00410 #define TIMER_OFF dbg("elapsed: %u s", (time(0) - _t_beg))
00411 #else
00412 #include <ctype.h>
00413
00414 #define dbg_nop() isspace(0)
00415 #define dbg(...) dbg_nop()
00416 #define dbg_err(...) do { goto err; } while(0)
00417
00418 #define dbg_if(expr) if( (expr) ) { ; }
00419 #define dbg_ifb(expr) if( (expr) )
00420 #define dbg_ifm(expr, ...) if( (expr) ) { ; }
00421
00422 #define dbg_return_if(expr, err) do { if( (expr) ) return err; } while(0)
00423 #define dbg_return_sif(expr, err) dbg_return_if(expr, err)
00424 #define dbg_return_ifm(expr, err, ...) \
00425 dbg_return_if(expr, err);
00426 #define dbg_return_sifm(expr, err, ...) \
00427 dbg_return_if(expr, err);
00428
00429 #define dbg_err_if(expr) do { if( (expr) ) goto err; } while(0)
00430 #define dbg_err_sif(expr) do { if( (expr) ) goto err; } while(0)
00431 #define dbg_err_ifm(expr, ...) do { if( (expr) ) goto err; } while(0)
00432 #define dbg_err_sifm(expr, ...) do { if( (expr) ) goto err; } while(0)
00433
00434 #define dbg_goto_if(expr, gt) do { if( (expr) ) goto gt; } while(0)
00435 #define dbg_strerror(err) dbg_nop()
00436 #define TIMER_ON
00437 #define TIMER_STEP
00438 #define TIMER_OFF
00439 #endif
00440
00441 #ifdef __cplusplus
00442 }
00443 #endif
00444
00445 #endif