Re: Extraction Crash

From: Erwin S. Andreasen (erwin@PIP.DKNET.DK)
Date: 10/21/97


On Mon, 20 Oct 1997, Daniel Koepke wrote:

> -+/* BEGIN REMOVE_FROM_LIST */

This is not quite related to this, but just some minor, maybe useful
thing: for removing things from linked lists I use this macro (having
gotten tired after writing the same code for the Nth time :)

e.g.

UNLINK(ch, char_list);
LINK(something, something_list);

Note thaty they are gcc specific (typeof() gcc extension).


#define UNLINK(item, list_head) do      \
        {                                                                                                                       \
        if ((item) == (list_head))                                                                      \
                (list_head) = (item)->next;                                                             \
        else                                                                                                            \
        {                                                                                                                       \
                typeof(item) tmp;                                                                               \
                for (tmp = (list_head); tmp; tmp = tmp->next)                   \
                        if (tmp->next == (item))                                                        \
                                break;                                                                                  \
                if (!tmp)                                                                                               \
                        bug ("UNLINK: did not find previous item: " __FILE__ ":%d" ,__LINE__);  \
                else                                                                                                    \
                        tmp->next = (item)->next;                                                       \
        } } while(0)

This might also be useful:

/* Link an item into a linked list (at the end of it)*/
#define LINK(item, list_head) do \
{ \
        if ((list_head) == NULL) \
                list_head = item; \
        else \
        { \
                typeof(item) prev; \
                for (prev = (list_head); prev && prev->next; prev = prev->next); \
                prev->next = item; \
        } \
} while(0)



 =============================================================================
Erwin Andreasen   Herlev, Denmark <erwin@pip.dknet.dk>  UNIX System Programmer
<URL:http://pip.dknet.dk/~erwin/>         <*>           (not speaking for) DDE
 =============================================================================


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST