carpal.h

00001 /* 
00002  * Copyright (c) 2005-2012 by KoanLogic s.r.l. - All rights reserved.  
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   /* !OS_WIN */
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 /* OS_WIN */
00375 
00380 /* nop_ macros */
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 /* con_ macros */
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 /* emerg_ macros */
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 /* alert_ macros */
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 /* crit_ macros */
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 /* err_ macros */
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 /* warn_ macros */
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 /* notice_ macros */
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 /* info_ macros */
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 /* dbg_ macros */
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     /* simple debugging timing macros */
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 /* disable debugging */
00609     #include <ctype.h>
00610     /* this will be used just to avoid empty-if (and similar) warnings */
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 /* ifdef DEBUG */
00639 
00640 #ifdef __cplusplus
00641 }
00642 #endif
00643 
00644 #endif /* !_U_CARPAL_H_ */

←Products
© 2005-2012 - KoanLogic S.r.l. - All rights reserved