dlist.h

Wed, 10 Mar 2004 17:33:39 +0100

author
tuomov
date
Wed, 10 Mar 2004 17:33:39 +0100
changeset 66
42085c134e29
parent 62
aae5facf9fc5
child 87
95553f8ea540
permissions
-rw-r--r--

trunk: changeset 1369
Fixed some issues with the ripped red-black tree code (compiler printf
warnings, type safety, check of malloc result).

/*
 * libtu/common.h
 *
 * Copyright (c) Tuomo Valkonen 1999-2002. 
 *
 * You may distribute and modify this library under the terms of either
 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
 */

#ifndef LIBTU_DLIST_H
#define LIBTU_DLIST_H

#define LINK_ITEM(LIST, ITEM, NEXT, PREV) \
    (ITEM)->NEXT=NULL;                    \
    if((LIST)==NULL){                     \
        (LIST)=(ITEM);                    \
        (ITEM)->PREV=(ITEM);              \
    }else{                                \
        (ITEM)->PREV=(LIST)->PREV;        \
        (ITEM)->PREV->NEXT=(ITEM);        \
        (LIST)->PREV=(ITEM);              \
    }


#define LINK_ITEM_FIRST(LIST, ITEM, NEXT, PREV) \
    (ITEM)->NEXT=(LIST);                        \
    if((LIST)==NULL){                           \
        (ITEM)->PREV=(ITEM);                    \
    }else{                                      \
        (ITEM)->PREV=(LIST)->PREV;              \
        (LIST)->PREV=(ITEM);                    \
    }                                           \
    (LIST)=(ITEM);


#define LINK_ITEM_LIST LINK_ITEM


#define LINK_ITEM_BEFORE(LIST, BEFORE, ITEM, NEXT, PREV) \
    (ITEM)->NEXT=(BEFORE);                               \
    (ITEM)->PREV=(BEFORE)->PREV;                         \
    (BEFORE)->PREV=(ITEM);                               \
    if((BEFORE)==(LIST))                                 \
        (LIST)=(ITEM);                                   \
    else                                                 \
        (ITEM)->PREV->NEXT=(ITEM)


#define LINK_ITEM_AFTER(LIST, AFTER, ITEM, NEXT, PREV) \
    (ITEM)->NEXT=(AFTER)->NEXT;                        \
    (ITEM)->PREV=(AFTER);                              \
    (AFTER)->NEXT=(ITEM);                              \
    if((ITEM)->NEXT==NULL)                             \
        (LIST)->PREV=(ITEM);                           \
    else                                               \
        (ITEM)->NEXT->PREV=ITEM;


#define UNLINK_ITEM(LIST, ITEM, NEXT, PREV)  \
    if((ITEM)->PREV!=NULL){                  \
        if((ITEM)==(LIST)){                  \
            (LIST)=(ITEM)->NEXT;             \
            if((LIST)!=NULL)                 \
                (LIST)->PREV=(ITEM)->PREV;   \
        }else if((ITEM)->NEXT==NULL){        \
            (ITEM)->PREV->NEXT=NULL;         \
            (LIST)->PREV=(ITEM)->PREV;       \
        }else{                               \
            (ITEM)->PREV->NEXT=(ITEM)->NEXT; \
            (ITEM)->NEXT->PREV=(ITEM)->PREV; \
        }                                    \
    }                                        \
    (ITEM)->NEXT=NULL;                       \
    (ITEM)->PREV=NULL;

#endif /* LIBTU_DLIST_H */

mercurial