CPU_IDLE(): Fix for new emulator.
[bertos.git] / cfg / compiler.h
index f0f3285e19744c12be272ce0f6cd01a742444f94..78a63bdcb449f7726856853d4dd4407b939bb5a7 100755 (executable)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.18  2006/03/22 13:34:34  bernie
+ *#* MSVC support.
+ *#*
+ *#* Revision 1.17  2006/03/22 09:48:35  bernie
+ *#* Formatting.
+ *#*
+ *#* Revision 1.16  2006/03/20 17:48:09  bernie
+ *#* Fix for avr-libc; INTERRUPT(): Remove macro.
+ *#*
+ *#* Revision 1.15  2006/03/13 02:06:25  bernie
+ *#* containerof(): New macro.
+ *#*
+ *#* Revision 1.14  2006/02/23 08:36:33  bernie
+ *#* Emulate __func__ on MSVC.
+ *#*
+ *#* Revision 1.13  2006/02/23 07:37:37  bernie
+ *#* Compile fix for MSVC.
+ *#*
  *#* Revision 1.12  2006/02/21 16:06:31  bernie
  *#* Fix ssize_t redefinitions on glibc systems.
  *#*
        #define snprintf _snprintf
        #define vsnprintf _vsnprintf
 
+       /* MSVC doesn't support C99's __func__, but has a similar extension. */
+       #define __func__ __FUNCTION__
+
+       /* MSVC doesn't support C99's inline keyword */
+       #ifndef __cplusplus
+               #define INLINE __inline
+       #endif
+
 #elif defined(__GNUC__)
 
        /* Compiler features */
        #include <stddef.h>
        #include <stdint.h>
        #include <stdbool.h>
+       #if !CPU_AVR
        #include <sys/types.h> /* for ssize_t */
+       #endif
 
        #ifndef __cplusplus
                /*
 #ifndef REGISTER
 #define REGISTER               /* nothing */
 #endif
-#ifndef INTERRUPT
-#define INTERRUPT(x)           ERROR_NOT_IMPLEMENTED
-#endif
 #ifndef LIKELY
 #define LIKELY(x)              x
 #endif
        #define EXTERN_C        extern "C"
        #define EXTERN_C_BEGIN  extern "C" {
        #define EXTERN_C_END    }
-       #define EXTERN_CONST    extern const
+       #define EXTERN_CONST    extern const
 #else
        #define EXTERN_C        extern
        #define EXTERN_C_BEGIN  /* nothing */
        #define EXTERN_C_END    /* nothing */
-       #define EXTERN_CONST    const
+       #define EXTERN_CONST    const
 #endif
 
 
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) \
        || ((defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__)) && CPU_I196)
        /*!
         * \name ISO C99 fixed-size types
@@ -422,7 +447,7 @@ typedef unsigned char page_t;    /*!< Type for banked memory pages. */
  * We check for some common definitions to avoid redefinitions:
  *
  *    glibc, avr-libc: _SIZE_T_DEFINED, __ssize_t_defined
- *    Darwin libc:     _BSD_SIZE_T_DEFINED_
+ *    Darwin libc:     _BSD_SIZE_T_DEFINED_, _SIZE_T
  *    IAR ARM:         _SIZE_T
  *
  * \{
@@ -437,7 +462,7 @@ typedef unsigned char page_t;    /*!< Type for banked memory pages. */
        #endif
 #endif
 
-#if !(defined(ssize_t) || defined(__ssize_t_defined))
+#if !(defined(ssize_t) || defined(_SSIZE_T) || defined(__ssize_t_defined))
        #if CPU_X86
                /* 32bit or 64bit (32bit for _WIN64). */
                typedef long ssize_t;
@@ -491,6 +516,23 @@ typedef unsigned char page_t;    /*!< Type for banked memory pages. */
        #define countof(a)  (sizeof(a) / sizeof(*(a)))
 #endif
 
+/**
+ * Cast a member of a structure out to the containing structure.
+ *
+ * \param ptr     the pointer to the member.
+ * \param type    the type of the container struct this is embedded in.
+ * \param member  the name of the member within the struct.
+ */
+#if COMPILER_TYPEOF && COMPILER_STATEMENT_EXPRESSIONS
+       #define containerof(ptr, type, member) ({ \
+               const typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \
+               (type *)((char *)_mptr - offsetof(type, member)); \
+       })
+#else
+       #define containerof(ptr, type, member) \
+               ( (type *)((char *)(ptr) - offsetof(type, member)) )
+#endif
+
 /*! Issue a compilation error if the \a condition is false */
 #define STATIC_ASSERT(condition)  \
        UNUSED_VAR(extern char, STATIC_ASSERTION_FAILED__[(condition) ? 1 : -1])
@@ -502,9 +544,9 @@ typedef unsigned char page_t;    /*!< Type for banked memory pages. */
 #endif
 
 #ifndef ASSERT_TYPE_IS
-/*! Ensure variable is of specified type. */
+/** Ensure variable is of specified type. */
 #define ASSERT_TYPE_IS(var, type)  \
-               do { (void)(&var == (type *)0); } while(0)
+               do { (void)(&(var) == (type *)0); } while(0)
 #endif
 
 #endif /* DEVLIB_COMPILER_H */