From 0520464870756b67be3f75ab8c8b02e583e16524 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 1 Nov 2013 12:41:09 +0100 Subject: [PATCH] queue: strengthen type checks Rewrite some of the macros in a way that: a) makes them more likely to trigger compile-time errors if used inappropriately, and b) makes C++ compilers happy --- src/queue.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/queue.h b/src/queue.h index aa15837d0f..fe02b454ea 100644 --- a/src/queue.h +++ b/src/queue.h @@ -19,20 +19,20 @@ typedef void *QUEUE[2]; /* Private macros. */ -#define QUEUE_NEXT(q) ((*(q))[0]) -#define QUEUE_PREV(q) ((*(q))[1]) -#define QUEUE_PREV_NEXT(q) (QUEUE_NEXT((QUEUE *) QUEUE_PREV(q))) -#define QUEUE_NEXT_PREV(q) (QUEUE_PREV((QUEUE *) QUEUE_NEXT(q))) +#define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0])) +#define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1])) +#define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q))) +#define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q))) /* Public macros. */ #define QUEUE_DATA(ptr, type, field) \ ((type *) ((char *) (ptr) - ((char *) &((type *) 0)->field))) #define QUEUE_FOREACH(q, h) \ - for ((q) = (QUEUE *) (*(h))[0]; (q) != (h); (q) = (QUEUE *) (*(q))[0]) + for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q)) #define QUEUE_EMPTY(q) \ - (QUEUE_NEXT(q) == (q)) + ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q)) #define QUEUE_HEAD(q) \ (QUEUE_NEXT(q))