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
00114 #define msg_err(label, ...) \
00115 do { msg(label, 0, __VA_ARGS__); goto err; } while(0)
00116
00128 #define msg_if(label, expr) \
00129 do { if( expr ) msg_noargs(label, 0, #expr); } while(0)
00130
00141 #define msg_ifm(label, expr, ...) \
00142 do { if(expr) { msg(label, 0, __VA_ARGS__); } } while(0);
00143
00160 #define msg_ifb(label, expr) \
00161 if( (expr) && (msg_noargs(label, 0, #expr) ? 1 : 1) )
00162
00175 #define msg_return_if(label, expr, err) \
00176 msg_ifb(label, expr) { return err; }
00177
00188 #define msg_return_ifm(label, expr, err, ...) \
00189 if(expr) { msg(label, 0, __VA_ARGS__); return err; }
00190
00203 #define msg_return_sifm(label, expr, err, ...) \
00204 if(expr) { msg(label, errno, __VA_ARGS__); return err; }
00205
00220 #define msg_return_sif(label, expr, err) \
00221 do { if(expr) { msg_noargs(label, errno, #expr); return err; } } while(0)
00222
00237 #define msg_goto_if(label, expr, gt) \
00238 msg_ifb(label, expr) goto gt
00239
00256 #define msg_err_if(label, expr) \
00257 do { msg_ifb(label, expr) { goto err;} } while(0)
00258
00277 #define msg_err_rcif(label, expr, errcode) \
00278 do { msg_ifb(label, expr) { rc = errcode; goto err;} } while(0)
00279
00296 #define msg_err_ifm(label, expr, ...) \
00297 do { if( (expr) ) { msg(label, 0, __VA_ARGS__); goto err; } } while(0)
00298
00314 #define msg_err_sif(label, expr) \
00315 do { if(expr) { msg_noargs(label, errno, #expr); goto err; } } while(0)
00316
00332 #define msg_err_sifm(label, expr, ...) \
00333 do { if((expr)) { msg(label, errno, __VA_ARGS__); goto err; } } while(0)
00334
00335
00350 #ifdef OS_WIN
00351 #define msg_strerror(label, en) \
00352 do { \
00353 LPVOID lpMsgBuf = NULL; DWORD dw = GetLastError(); \
00354 if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | \
00355 FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, \
00356 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
00357 (LPTSTR) &lpMsgBuf, 0, NULL ) && lpMsgBuf) \
00358 { \
00359 msg(label, 0, "%s", lpMsgBuf); \
00360 LocalFree(lpMsgBuf); \
00361 } \
00362 } while(0)
00363 #else
00364 #define msg_strerror(label, en) \
00365 do { \
00366 enum { _DBG_BUFSZ = 256 }; \
00367 char _eb[_DBG_BUFSZ] = { 0 }; \
00368 if(u_strerror_r(en, _eb, _DBG_BUFSZ)) { \
00369 msg(label, 0, "strerror_r(%d, ...) failed", en); \
00370 } else { \
00371 msg(label, 0, "errno: %d (%s)", errno, _eb); \
00372 } \
00373 } while(0)
00374 #endif
00375
00380
00381 #define nop_return_if(expr, err) do { if(expr) return err; } while(0)
00382 #define nop_err_if(expr) do { if(expr) goto err; } while(0)
00383 #define nop_goto_if(expr, gt) do { if(expr) goto gt; } while(0)
00384
00385
00386 #define u_con(...) msg(con_, 0, __VA_ARGS__)
00387 #define con_err(...) msg_err(con_, __VA_ARGS__)
00388 #define con_ifb(expr) msg_ifb(con_, expr)
00389 #define con_if(expr) msg_if(con_, expr)
00390 #define con_ifm(expr, ...) msg_ifm(con_, expr, __VA_ARGS__)
00391
00392 #define con_return_if(expr, err) msg_return_if(con_, expr, err)
00393 #define con_return_sif(expr, err) msg_return_sif(con_, expr, err)
00394 #define con_return_ifm(expr, err, ...) \
00395 msg_return_ifm(con_, expr, err, __VA_ARGS__)
00396 #define con_return_sifm(expr, err, ...) \
00397 msg_return_sifm(con_, expr, err, __VA_ARGS__)
00398
00399 #define con_err_if(expr) msg_err_if(con_, expr)
00400 #define con_err_sif(expr) msg_err_sif(con_, expr)
00401 #define con_err_ifm(expr, ...) msg_err_ifm(con_, expr, __VA_ARGS__)
00402 #define con_err_sifm(expr, ...) msg_err_sifm(con_, expr, __VA_ARGS__)
00403 #define con_err_rcif(expr, ...) msg_err_rcif(con_, expr, __VA_ARGS__)
00404
00405 #define con_goto_if(expr, gt) msg_goto_if(con_, expr, gt)
00406 #define con_strerror(err) msg_strerror(con_, err)
00407
00408
00409 #define u_emerg(...) msg(emerg_, 0, __VA_ARGS__)
00410 #define emerg_err(...) msg_err(emerg_, __VA_ARGS__)
00411 #define emerg_ifb(expr) msg_ifb(emerg_, expr)
00412 #define emerg_if(expr) msg_if(emerg_, expr)
00413 #define emerg_ifm(expr, ...) msg_ifm(emerg_, expr, __VA_ARGS__)
00414
00415 #define emerg_return_if(expr, err) msg_return_if(emerg_, expr, err)
00416 #define emerg_return_sif(expr, err) msg_return_sif(emerg_, expr, err)
00417 #define emerg_return_ifm(expr, err, ...) \
00418 msg_return_ifm(emerg_, expr, err, __VA_ARGS__)
00419 #define emerg_return_sifm(expr, err, ...) \
00420 msg_return_sifm(emerg_, expr, err, __VA_ARGS__)
00421
00422 #define emerg_err_if(expr) msg_err_if(emerg_, expr)
00423 #define emerg_err_sif(expr) msg_err_sif(emerg_, expr)
00424 #define emerg_err_ifm(expr, ...) msg_err_ifm(emerg_, expr, __VA_ARGS__)
00425 #define emerg_err_sifm(expr, ...) msg_err_sifm(emerg_, expr, __VA_ARGS__)
00426 #define emerg_err_rcif(expr, ...) msg_err_rcif(emerg_, expr, __VA_ARGS__)
00427
00428 #define emerg_goto_if(expr, gt) msg_goto_if(emerg_, expr, gt)
00429 #define emerg_strerror(err) msg_strerror(emerg_, err)
00430
00431
00432 #define u_alert(...) msg(alert_, 0, __VA_ARGS__)
00433 #define alert_err(...) msg_err(alert_, __VA_ARGS__)
00434 #define alert_ifb(expr) msg_ifb(alert_, expr)
00435 #define alert_if(expr) msg_if(alert_, expr)
00436 #define alert_ifm(expr, ...) msg_ifm(alert_, expr, __VA_ARGS__)
00437
00438 #define alert_return_if(expr, err) msg_return_if(alert_, expr, err)
00439 #define alert_return_sif(expr, err) msg_return_sif(alert_, expr, err)
00440 #define alert_return_ifm(expr, err, ...) \
00441 msg_return_ifm(alert_, expr, err, __VA_ARGS__)
00442 #define alert_return_sifm(expr, err, ...) \
00443 msg_return_sifm(alert_, expr, err, __VA_ARGS__)
00444
00445 #define alert_err_if(expr) msg_err_if(alert_, expr)
00446 #define alert_err_sif(expr) msg_err_sif(alert_, expr)
00447 #define alert_err_ifm(expr, ...) msg_err_ifm(alert_, expr, __VA_ARGS__)
00448 #define alert_err_sifm(expr, ...) msg_err_sifm(alert_, expr, __VA_ARGS__)
00449 #define alert_err_rcif(expr, ...) msg_err_rcif(alert_, expr, __VA_ARGS__)
00450
00451 #define alert_goto_if(expr, gt) msg_goto_if(alert_, expr, gt)
00452 #define alert_strerror(err) msg_strerror(alert_, err)
00453
00454
00455 #define u_crit(...) msg(crit_, 0, __VA_ARGS__)
00456 #define crit_err(...) msg_err(crit_, __VA_ARGS__)
00457 #define crit_ifb(expr) msg_ifb(crit_, expr)
00458 #define crit_if(expr) msg_if(crit_, expr)
00459 #define crit_ifm(expr, ...) msg_ifm(crit_, expr, __VA_ARGS__)
00460
00461 #define crit_return_if(expr, err) msg_return_if(crit_, expr, err)
00462 #define crit_return_sif(expr, err) msg_return_sif(crit_, expr, err)
00463 #define crit_return_ifm(expr, err, ...) \
00464 msg_return_ifm(crit_, expr, err, __VA_ARGS__)
00465 #define crit_return_sifm(expr, err, ...) \
00466 msg_return_sifm(crit_, expr, err, __VA_ARGS__)
00467
00468 #define crit_err_if(expr) msg_err_if(crit_, expr)
00469 #define crit_err_sif(expr) msg_err_sif(crit_, expr)
00470 #define crit_err_ifm(expr, ...) msg_err_ifm(crit_, expr, __VA_ARGS__)
00471 #define crit_err_sifm(expr, ...) msg_err_sifm(crit_, expr, __VA_ARGS__)
00472 #define crit_err_rcif(expr, ...) msg_err_rcif(crit_, expr, __VA_ARGS__)
00473
00474 #define crit_goto_if(expr, gt) msg_goto_if(crit, expr, gt)
00475 #define crit_strerror(err) msg_strerror(crit, err)
00476
00477
00478 #define u_err(...) msg(err_, 0, __VA_ARGS__)
00479 #define err_err(...) msg_err(err_, __VA_ARGS__)
00480 #define err_ifb(expr) msg_ifb(err_, expr)
00481 #define err_if(expr) msg_if(err_, expr)
00482 #define err_ifm(expr, ...) msg_ifm(err_, expr, __VA_ARGS__)
00483
00484 #define err_return_if(expr, err) msg_return_if(err_, expr, err)
00485 #define err_return_sif(expr, err) msg_return_sif(err_, expr, err)
00486 #define err_return_ifm(expr, err, ...) \
00487 msg_return_ifm(err_, expr, err, __VA_ARGS__)
00488 #define err_return_sifm(expr, err, ...) \
00489 msg_return_sifm(err_, expr, err, __VA_ARGS__)
00490
00491 #define err_err_if(expr) msg_err_if(err_, expr)
00492 #define err_err_sif(expr) msg_err_sif(err_, expr)
00493 #define err_err_ifm(expr, ...) msg_err_ifm(err_, expr, __VA_ARGS__)
00494 #define err_err_sifm(expr, ...) msg_err_sifm(err_, expr, __VA_ARGS__)
00495 #define err_err_rcif(expr, ...) msg_err_rcif(err_, expr, __VA_ARGS__)
00496
00497 #define err_goto_if(expr, gt) msg_goto_if(err_, expr, gt)
00498 #define err_strerror(err) msg_strerror(err_, err)
00499
00500
00501 #define u_warn(...) msg(warn_, 0, __VA_ARGS__)
00502 #define warn_err(...) msg_err(warn_, __VA_ARGS__)
00503 #define warn_ifb(expr) msg_ifb(warn_, expr)
00504 #define warn_if(expr) msg_if(warn_, expr)
00505 #define warn_ifm(expr, ...) msg_ifm(warn_, expr, __VA_ARGS__)
00506
00507 #define warn_return_if(expr, err) msg_return_if(warn_, expr, err)
00508 #define warn_return_sif(expr, err) msg_return_sif(warn_, expr, err)
00509 #define warn_return_ifm(expr, err, ...) \
00510 msg_return_ifm(warn_, expr, err, __VA_ARGS__)
00511 #define warn_return_sifm(expr, err, ...) \
00512 msg_return_sifm(warn_, expr, err, __VA_ARGS__)
00513
00514 #define warn_err_if(expr) msg_err_if(warn_, expr)
00515 #define warn_err_sif(expr) msg_err_sif(warn_, expr)
00516 #define warn_err_ifm(expr, ...) msg_err_ifm(warn_, expr, __VA_ARGS__)
00517 #define warn_err_sifm(expr, ...) msg_err_sifm(warn_, expr, __VA_ARGS__)
00518 #define warn_err_rcif(expr, ...) msg_err_rcif(warn_, expr, __VA_ARGS__)
00519
00520 #define warn_goto_if(expr, gt) msg_goto_if(warn_, expr, gt)
00521 #define warn_strerror(err) msg_strerror(warn_, err)
00522
00523
00524 #define u_notice(...) msg(notice_, 0, __VA_ARGS__)
00525 #define notice_err(...) msg_err(notice_, __VA_ARGS__)
00526 #define notice_ifb(expr) msg_ifb(notice_, expr)
00527 #define notice_if(expr) msg_if(notice_, expr)
00528 #define notice_ifm(expr, ...) msg_ifm(notice_, expr, __VA_ARGS__)
00529
00530 #define notice_return_if(expr, err) msg_return_if(notice_, expr, err)
00531 #define notice_return_sif(expr, err) msg_return_sif(notice_, expr, err)
00532 #define notice_return_ifm(expr, err, ...) \
00533 msg_return_ifm(notice_, expr, err, __VA_ARGS__)
00534 #define notice_return_sifm(expr, err, ...) \
00535 msg_return_sifm(notice_, expr, err, __VA_ARGS__)
00536
00537 #define notice_err_if(expr) msg_err_if(notice_, expr)
00538 #define notice_err_sif(expr) msg_err_sif(notice_, expr)
00539 #define notice_err_ifm(expr, ...) \
00540 msg_err_ifm(notice_, expr, __VA_ARGS__)
00541 #define notice_err_sifm(expr, ...) \
00542 msg_err_sifm(notice_, expr, __VA_ARGS__)
00543 #define notice_err_rcif(expr, ...) \
00544 msg_err_rcif(notice_, expr, __VA_ARGS__)
00545
00546 #define notice_goto_if(expr, gt) msg_goto_if(notice_, expr, gt)
00547 #define notice_strerror(err) msg_strerror(notice_, err)
00548
00549
00550 #define u_info(...) msg(info_, 0, __VA_ARGS__)
00551 #define info_err(...) msg_err(info_, __VA_ARGS__)
00552 #define info_ifb(expr) msg_ifb(info_, expr)
00553 #define info_if(expr) msg_if(info_, expr)
00554 #define info_ifm(expr, ...) msg_ifm(info_, expr, __VA_ARGS__)
00555
00556 #define info_return_if(expr, err) msg_return_if(info_, expr, err)
00557 #define info_return_sif(expr, err) msg_return_sif(info_, expr, err)
00558 #define info_return_ifm(expr, err, ...) \
00559 msg_return_ifm(info_, expr, err, __VA_ARGS__)
00560 #define info_return_sifm(expr, err, ...) \
00561 msg_return_sifm(info_, expr, err, __VA_ARGS__)
00562
00563 #define info_err_if(expr) msg_err_if(info_, expr)
00564 #define info_err_sif(expr) msg_err_sif(info_, expr)
00565 #define info_err_ifm(expr, ...) msg_err_ifm(info_, expr, __VA_ARGS__)
00566 #define info_err_sifm(expr, ...) msg_err_sifm(info_, expr, __VA_ARGS__)
00567 #define info_err_rcif(expr, ...) msg_err_rcif(info_, expr, __VA_ARGS__)
00568
00569 #define info_goto_if(expr, gt) msg_goto_if(info_, expr, gt)
00570 #define info_strerror(err) msg_strerror(info_, err)
00571
00572
00573 #ifdef DEBUG
00574 #define u_dbg(...) msg(dbg_, 0, __VA_ARGS__)
00575 #define dbg_err(...) msg_err(dbg_, __VA_ARGS__)
00576
00577 #define dbg_if(expr) msg_if(dbg_, expr)
00578 #define dbg_ifb(expr) msg_ifb(dbg_, expr)
00579 #define dbg_ifm(expr, ...) msg_ifm(dbg_, expr, __VA_ARGS__)
00580
00581 #define dbg_return_if(expr, err) msg_return_if(dbg_, expr, err)
00582 #define dbg_return_sif(expr, err) msg_return_sif(dbg_, expr, err)
00583 #define dbg_return_ifm(expr, err, ...) \
00584 msg_return_ifm(dbg_, expr, err, __VA_ARGS__)
00585 #define dbg_return_sifm(expr, err, ...) \
00586 msg_return_sifm(dbg_, expr, err, __VA_ARGS__)
00587
00588 #define dbg_err_if(expr) msg_err_if(dbg_, expr)
00589 #define dbg_err_sif(expr) msg_err_sif(dbg_, expr)
00590 #define dbg_err_ifm(expr, ...) msg_err_ifm(dbg_, expr, __VA_ARGS__)
00591 #define dbg_err_sifm(expr, ...) msg_err_sifm(dbg_, expr, __VA_ARGS__)
00592 #define dbg_err_rcif(expr, ...) msg_err_rcif(dbg_, expr, __VA_ARGS__)
00593
00594 #define dbg_goto_if(expr, gt) msg_goto_if(dbg_, expr, gt)
00595 #define dbg_strerror(err) msg_strerror(dbg_, err)
00596
00597
00598 #define TIMER_ON \
00599 time_t _t_beg = time(0), _t_prev = _t_beg, _t_now; int _t_step = 0
00600 #define TIMER_STEP \
00601 do { \
00602 _t_now = time(0); \
00603 dbg(" step %u: %u s (delta: %u s)", \
00604 _t_step++, _t_now - _t_beg, _t_now - _t_prev); \
00605 _t_prev = _t_now; \
00606 } while(0)
00607 #define TIMER_OFF dbg("elapsed: %u s", (time(0) - _t_beg))
00608 #else
00609 #include <ctype.h>
00610
00611 #define dbg_nop() isspace(0)
00612 #define u_dbg(...) dbg_nop()
00613 #define dbg_err(...) do { goto err; } while(0)
00614
00615 #define dbg_if(expr) do { if( (expr) ) { ; } } while(0)
00616 #define dbg_ifb(expr) if( (expr) )
00617 #define dbg_ifm(expr, ...) do { if( (expr) ) { ; } } while(0)
00618
00619 #define dbg_return_if(expr, err) do { if( (expr) ) return err; } while(0)
00620 #define dbg_return_sif(expr, err) dbg_return_if(expr, err)
00621 #define dbg_return_ifm(expr, err, ...) \
00622 dbg_return_if(expr, err);
00623 #define dbg_return_sifm(expr, err, ...) \
00624 dbg_return_if(expr, err);
00625
00626 #define dbg_err_if(expr) do { if( (expr) ) goto err; } while(0)
00627 #define dbg_err_sif(expr) do { if( (expr) ) goto err; } while(0)
00628 #define dbg_err_ifm(expr, ...) do { if( (expr) ) goto err; } while(0)
00629 #define dbg_err_sifm(expr, ...) do { if( (expr) ) goto err; } while(0)
00630 #define dbg_err_rcif(expr, errcode, ...) \
00631 do { if( (expr) ) { rc = errcode; goto err; } } while(0)
00632
00633 #define dbg_goto_if(expr, gt) do { if( (expr) ) goto gt; } while(0)
00634 #define dbg_strerror(err) dbg_nop()
00635 #define TIMER_ON
00636 #define TIMER_STEP
00637 #define TIMER_OFF
00638 #endif
00639
00640 #ifdef __cplusplus
00641 }
00642 #endif
00643
00644 #endif