Use new CPU-neutral program-memory API.
[bertos.git] / mware / list.h
index 0fe471d031073ab7a7eed9c738f979ac23abd0dc..e28abb43da95097c2e1bcfe03a3bf0021c6da908 100755 (executable)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.12  2005/01/22 04:21:32  bernie
+ *#* Add integrity checks.
+ *#*
+ *#* Revision 1.11  2004/12/31 16:44:11  bernie
+ *#* list_remHead(), list_remTail(): Name like normal functions.
+ *#*
+ *#* Revision 1.10  2004/11/28 23:21:05  bernie
+ *#* Remove obsolete INITLIST macro.
+ *#*
  *#* Revision 1.9  2004/10/21 09:37:55  bernie
  *#* Revamp documentation.
  *#*
@@ -47,6 +56,8 @@
 #ifndef MWARE_LIST_H
 #define MWARE_LIST_H
 
+#include <compiler.h> // INLINE
+
 /*!
  * This structure represents a node for bidirectional lists.
  *
@@ -110,8 +121,25 @@ typedef struct _List
                (l)->tail = (Node *)(&(l)->head); \
        } while (0)
 
-/* OBSOLETE */
-#define INITLIST(l) LIST_INIT(l)
+/* Make sure that a list is valid (it was initialized and is not corrupted) */
+#ifdef _DEBUG
+       #define LIST_ASSERT_VALID(l) \
+               do { \
+                       Node *n, *pred; \
+                       ASSERT((l)->head != NULL); \
+                       ASSERT((l)->null == NULL); \
+                       ASSERT((l)->tail != NULL); \
+                       pred = (Node *)(&(l)->head); \
+                       FOREACHNODE(n, l) \
+                       { \
+                               ASSERT(n->pred == pred); \
+                               pred = n; \
+                       } \
+                       ASSERT(n == (Node *)(&(l)->null)); \
+               } while (0)
+#else
+       #define LIST_ASSERT_VALID(l) do {} while (0)
+#endif
 
 /*! Add node to list head. */
 #define ADDHEAD(l,n) \
@@ -165,7 +193,7 @@ typedef struct _List
  *
  * \return Pointer to node, or NULL if the list was empty.
  */
-INLINE Node *REMHEAD(List *l)
+INLINE Node *list_remHead(List *l)
 {
        Node *n;
 
@@ -183,7 +211,7 @@ INLINE Node *REMHEAD(List *l)
  *
  * \return Pointer to node, or NULL if the list was empty.
  */
-INLINE Node *REMTAIL(List *l)
+INLINE Node *list_remTail(List *l)
 {
        Node *n;
 
@@ -196,4 +224,8 @@ INLINE Node *REMTAIL(List *l)
        return n;
 }
 
+/* OBSOLETE names */
+#define REMHEAD list_remHead
+#define REMTAIL list_remTail
+
 #endif /* MWARE_LIST_H */