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