1 #ifndef _PMISCDEF_H 2 #define _PMISCDEF_H 1 3 4 #include <string.h> 5 6 /* snprintf MS VC++ support; 7 * thanks to Viacheslav Sheveliov <slavash@aha.ru> 8 */ 9 #ifdef _MSC_VER 10 # define snprintf _snprintf 11 #endif 12 13 /* printf ptrdiff_t format modifier */ 14 #if __STDC_VERSION__ >= 199901L 15 # define TO_PTRDIFF_T(X) (X) 16 # define MOD_TD "%td" 17 #elif defined _MSC_VER 18 # define TO_PTRDIFF_T(X) (X) 19 # define MOD_TD "%Id" 20 #else 21 # define TO_PTRDIFF_T(X) ((long) (X)) 22 # define MOD_TD "%ld" 23 #endif 24 25 #if ! defined HAVE_STRDUP && ! defined strdup 26 # if defined HAVE__STRDUP 27 # define strdup _strdup 28 # else 29 # define strdup(str) strcpy(malloc(strlen(str) + 1), str) 30 # endif 31 #endif 32 33 #define COMPILE_TIME_ASSERT(x) \ 34 void __cta_proto__(int __cta_foo__[(x) ? 1 : -1]) 35 36 #ifdef __GNUC__ 37 #define FORMAT_PRINTF(X,Y) __attribute__ ((__format__ (__printf__, X, Y))) 38 #else 39 #define FORMAT_PRINTF(X,Y) 40 #endif 41 42 #if defined(__GNUC__) && !(defined(PEDANTIC)) 43 #define INLINE inline 44 #else /* !__GNUC__ */ 45 #define INLINE 46 #endif /* __GNUC__ */ 47 48 49 /* C89 compatible flexible array 50 struct header { 51 size_t len; 52 unsigned char data[FLEXIBLE_SIZE]; 53 }; 54 struct header *my_header = malloc(SIZEOF_FLEXIBLE(struct header, data, n)); 55 56 expands to 57 = malloc(offsetof(struct header, data) + n * sizeof my_header->data); 58 59 Setting FLEXIBLE_SIZE to SIZE_MAX almost ensures this will fail : 60 struct header *my_header = malloc(sizeof *my_header); 61 */ 62 #define FLEXIBLE_SIZE SIZE_MAX /* or whatever maximum length for an array */ 63 #define SIZEOF_FLEXIBLE(type, member, length) \ 64 ( offsetof(type, member) + (length) * sizeof ((type *)0)->member[0] ) 65 66 #endif /* pmiscdef.h */ 67 68 /* 69 * Local Variables: 70 * mode: c 71 * End: 72 */ 73