Main Page | Modules | Data Structures | File List | Data Fields

carpal.h

00001 /* 
00002  * Copyright (c) 2005, 2006 by KoanLogic s.r.l. - All rights reserved.  
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 /* ! def OS_WIN */
00168 
00169 /* nop_ macros */
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 /* con_ macros */
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 /* info_ macros */
00187 /* #define info(...)                    msg(info, __VA_ARGS__) */
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 /* warn_ macros */
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 /* dbg_ macros */
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     /* simple debugging timing macros */
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 /* disable debugging */
00238     #include <ctype.h>
00239     /* this will be used just to avoid empty-if (and similar) warnings */
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 /* ifdef DEBUG */
00255 
00256 #ifdef __cplusplus
00257 }
00258 #endif
00259 
00260 #endif /* _U_CARPAL_H_ */
00261 

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