#ifndef GENERIC_H #define GENERIC_H #include #include /** \defgroup generic */ /** \{ */ #define FALSE 0 #define TRUE 1 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901 # define INLINE static inline /**< Generic inline macro. */ #else # define INLINE __inline /**< Generic inline macro. */ #endif #define TRAP do { __asm {INT 0} } while (0) /**< Generic assembler TRAP. */ /** Wrapper to vsnprintf(). \returns 0 if error occured. \returns number of written characters (not counting '\\0') if successfull. \returns -1 if \a dst was to small (altough data was written till count \a maxLen - 1 and '\\0' was appended).*/ INLINE int wrapper_vsnprintf(char *dst, size_t maxLen, const char *formatString, va_list ap) { int ret; #ifdef _WIN32 ret = _vsnprintf(dst, maxLen, formatString, ap); /*attention: return is 5 in case of _snprintf(dst, 5, "Hallo")*/ if (ret < 0 || (unsigned) ret == maxLen) { dst[maxLen - 1] = '\0'; ret = -1; } #else ret = vsnprintf(dst, maxLen, formatString, ap); if (ret >= maxLen) ret = -1; else if (ret < 0) ret = 0; #endif return ret; } /* --end-- Wrapper to vsnprintf(). */ /** Wrapper to snprintf(). \returns 0 if error occured. \returns number of written characters (not counting '\\0') if successfull. \returns -1 if \a dst was to small (altough data was written till count \a maxLen - 1 and '\\0' was appended).*/ INLINE int wrapper_snprintf(char *dst, size_t maxLen, const char *formatString, ...) { int ret; va_list ap; va_start(ap, formatString); ret = wrapper_vsnprintf(dst, maxLen, formatString, ap); va_end(ap); return ret; } /* --end-- Wrapper to snprintf(). */ #define LSB(value, bits) ( ((bits) <= 8)?LSB8(value):(((bits) <= 16)?LSB16(value):(value)) ) /*Intel architecture*/ /** Source is LSB first */ #define LSB8(bytevalue) (bytevalue) #define LSB16(shortvalue) (shortvalue) /*LSB <-> MSB conversions*/ #define WORDSWAP(shortvalue) ((unsigned short) (((unsigned short) shortvalue)>>8 | ((unsigned short) shortvalue)<<8)) /**< Swaps 16 bit word. \a shortvalue has to be a 16 bitvalue! */ /** \} */ //#define STR(text) # text //#define XSTR(text) STR(text) //#define METAMESSAGE_SWITCH #ifdef METAMESSAGE_SWITCH # define METAMESSAGE(funccall) \ do \ { \ fprintf(stdout, "%s(%u):\n\t", __FILE__, __LINE__); \ funccall; \ } while (0) #else # define METAMESSAGE(funccall) funccall #endif //#define DEBUGPRINTSWITCH //#define ECHOSWITCH #ifdef DEBUGPRINTSWITCH # define DEBUGPRINTS(text, strp) fprintf(stderr, "\tDEBUG: " STR(text) ": '%s'! ", (strp)) # define DEBUGPRINTD(text, i) fprintf(stderr, "\tDEBUG: " STR(text) ": %d! ", (i)) # define DEBUGPRINT(text) fprintf(stderr, "\tDEBUG: " STR(text) "! ") # define DEBUGPRINTNL fputc('\n', stderr) #else # define DEBUGPRINTS(text, strp) # define DEBUGPRINTD(text, i) # define DEBUGPRINT(text) # define DEBUGPRINTNL #endif #ifdef ECHOSWITCH # define ECHOPRINTS(text, strp) DEBUGPRINTS(text, strp) # define ECHOPRINTD(text, i) DEBUGPRINTD(text, i) # define ECHOPRINT(text) DEBUGPRINT(text) # define ECHONL DEBUGNL #else # define ECHOPRINTS(text, strp) # define ECHOPRINTD(text, i) # define ECHOPRINT(text) # define ECHONL #endif #endif