/* Defind to 1 if compiler has typeof */
#undef HAVE_TYPEOF
+/* Define to nonstandard `typeof` supported by compiler */
+#undef TYPEOF_FUNC
+
/* Define to 1 if you don't have `tm_zone' but do have the external array
`tzname'. */
#undef HAVE_TZNAME
AC_LANG_PUSH(C++)
AC_CACHE_CHECK(for typeof, ba_cv_have_typeof,
[
- AC_TRY_RUN(
- [
- main(){char *a = 0; a = (typeof a)a;}
- ], [
- ba_cv_have_typeof=yes
- ], [
- ba_cv_have_typeof=no
- ], [
- ba_cv_have_typeof=no
- ]
- )
+ AC_TRY_RUN(
+ [
+ main(){char *a = 0; a = (typeof a)a;}
+ ], [
+ ba_cv_have_typeof=yes
+ ], [
+ ba_cv_have_typeof=no
+ ], [
+ ba_cv_have_typeof=no
+ ]
+ )
]
)
-test $ba_cv_have_typeof = yes && AC_DEFINE([HAVE_TYPEOF], 1, [Defind to 1 if compiler has typeof])
+if test $ba_cv_have_typeof = yes; then
+ AC_DEFINE([HAVE_TYPEOF], 1, [Defind to 1 if compiler has typeof])
+ AC_DEFINE([TYPEOF_FUNC], typeof, [Define to nonstandard `typeof` supported by compiler])
+else
+AC_CACHE_CHECK(for __typeof, ba_cv_have_utypeof,
+ [
+ AC_TRY_RUN(
+ [
+ main(){char *a = 0; a = (__typeof a)a;}
+ ], [
+ ba_cv_have_utypeof=yes
+ ], [
+ ba_cv_have_utypeof=no
+ ], [
+ ba_cv_have_utypeof=no
+ ]
+ )
+ ]
+)
+if test $ba_cv_have_utypeof = yes; then
+ AC_DEFINE([HAVE_TYPEOF], 1, [Defind to 1 if compiler has typeof])
+ AC_DEFINE([TYPEOF_FUNC], __typeof, [Define to nonstandard `typeof` supported by compiler])
+fi
+fi
+
AC_LANG_POP(C++)
AC_C_CONST
#define unser_check(x, s) ASSERT(unser_length(x) == ((uint32_t)(s)))
/* ser_assign(ptr, len) -- assign current position to ptr and go len bytes forward */
-#define ser_assign(ptr, len) { ptr = (typeof(ptr))ser_ptr; ser_ptr += (len); }
-#define unser_assign(ptr, len) { ptr = (typeof(ptr))ser_ptr; ser_ptr += (len); }
+#ifdef HAVE_TYPEOF
+#define ser_assign(ptr, len) { ptr = (TYPEOF_FUNC(ptr))ser_ptr; ser_ptr += (len); }
+#define unser_assign(ptr, len) { ptr = (TYPEOF_FUNC(ptr))ser_ptr; ser_ptr += (len); }
+#else
+#define ser_assign(ptr, len) \
+ { \
+ void **_p1 = (void **)(&ser_ptr); \
+ void **_p2 = (void **)(&ptr); \
+ *_p2 = *_p1; \
+ ser_ptr += (len); \
+ }
+#define unser_assign(ptr, len) \
+ { \
+ void **_p1 = (void **)(&ser_ptr); \
+ void **_p2 = (void **)(&ptr); \
+ *_p2 = *_p1; \
+ ser_ptr += (len); \
+ }
+#endif
/* Serialisation */