ccan_tokenizer, check_type, container_of, typesafe_cb: handle !HAVE_TYPEOF
[ccan] / ccan / container_of / container_of.h
index 1f4b18e4426a1c3c0bfc5c47e2a4e807ae7e2a52..2a6b1cd54e9dcf97f57b0b282e23bb7de82ae0db 100644 (file)
@@ -3,7 +3,7 @@
 #include <stddef.h>
 
 #include "config.h"
-#include "check_type/check_type.h"
+#include <ccan/check_type/check_type.h>
 
 /**
  * container_of - get pointer to enclosing structure
  * subtraction to return the pointer to the enclosing type.
  *
  * Example:
- *     struct info
- *     {
+ *     struct foo {
+ *             int fielda, fieldb;
+ *             // ...
+ *     };
+ *     struct info {
  *             int some_other_field;
  *             struct foo my_foo;
  *     };
  *
- *     struct info *foo_to_info(struct foo *foop)
+ *     static struct info *foo_to_info(struct foo *foo)
  *     {
  *             return container_of(foo, struct info, my_foo);
  *     }
  * subtraction to return the pointer to the enclosing type.
  *
  * Example:
- *     struct info
- *     {
- *             int some_other_field;
- *             struct foo my_foo;
- *     };
- *
- *     struct info *foo_to_info(struct foo *foop)
+ *     static struct info *foo_to_i(struct foo *foo)
  *     {
  *             struct info *i = container_of_var(foo, i, my_foo);
  *             return i;
  *     }
  */
-#ifdef HAVE_TYPEOF
+#if HAVE_TYPEOF
 #define container_of_var(member_ptr, var, member) \
        container_of(member_ptr, typeof(*var), member)
 #else
-#define container_of_var(member_ptr, var, member) \
-       ((void *)((char *)(member_ptr) - offsetof(containing_type, member)))
+#define container_of_var(member_ptr, var, member)              \
+       ((void *)((char *)(member_ptr)                          \
+                 - ((char *)&(var)->member - (char *)(var))))
 #endif
 
 #endif /* CCAN_CONTAINER_OF_H */