symlist.c

Sat, 26 Feb 2005 10:37:20 +0100

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sat, 26 Feb 2005 10:37:20 +0100
changeset 89
17a16ed84bbf
parent 88
308dfa54da3e
permissions
-rw-r--r--

Added struct field address macros.

/*
 * libtu/symlist.c
 *
 * Copyright (c) Tuomo Valkonen 1999-2004. 
 *
 * 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.
 */

#include "obj.h"
#include "symlist.h"
#include "types.h"
#include "dlist.h"
#include "misc.h"


static void free_node(Symlist **symlist, Symlist *node)
{
    UNLINK_ITEM(*symlist, node, next, prev);
    free(node);
}


static Symlist *mknode(void *symbol)
{
    Symlist *node;
    
    if(symbol==NULL)
        return NULL;
    
    node=ALLOC(Symlist);
    
    if(node==NULL)
        return FALSE;
        
    node->symbol=symbol;
    
    return node;
}


static Symlist *symlist_find_node(Symlist *symlist, void *symbol)
{
    Symlist *node=symlist;
    
    while(node!=NULL){
        if(node->symbol==symbol)
            break;
        node=node->next;
    }
    
    return node;
}


bool symlist_insert_last(Symlist **symlist, void *symbol)
{
    Symlist *node=mknode(symbol);
    
    if(node==NULL)
        return FALSE;
    
    LINK_ITEM_LAST(*symlist, node, next, prev);
    
    return TRUE;
}


bool symlist_insert_first(Symlist **symlist, void *symbol)
{
    Symlist *node=mknode(symbol);
    
    if(node==NULL)
        return FALSE;
    
    LINK_ITEM_FIRST(*symlist, node, next, prev);
    
    return TRUE;
}


bool symlist_reinsert_last(Symlist **symlist, void *symbol)
{
    Symlist *node=symlist_find_node(*symlist, symbol);
    
    if(node==NULL)
        return FALSE;
    
    UNLINK_ITEM(*symlist, node, next, prev);
    LINK_ITEM_LAST(*symlist, node, next, prev);
    
    return TRUE;
}


bool symlist_reinsert_first(Symlist **symlist, void *symbol)
{
    Symlist *node=symlist_find_node(*symlist, symbol);
    
    if(node==NULL)
        return FALSE;
    
    UNLINK_ITEM(*symlist, node, next, prev);
    LINK_ITEM_FIRST(*symlist, node, next, prev);
    
    return TRUE;
}


void symlist_remove(Symlist **symlist, void *symbol)
{
    Symlist *node=symlist_find_node(*symlist, symbol);
    
    if(node!=NULL)
        free_node(symlist, node);
}


void symlist_clear(Symlist **symlist)
{
    while(*symlist!=NULL)
        free_node(symlist, *symlist);
}


SymlistIterTmp symlist_iter_tmp=NULL;


void symlist_iter_init(SymlistIterTmp *state, Symlist *symlist)
{
    *state=symlist;
}


void *symlist_iter(SymlistIterTmp *state)
{
    void *symbol=NULL;
    
    if(*state!=NULL){
        symbol=(*state)->symbol;
        (*state)=(*state)->next;
    }
    
    return symbol;
}


void symlist_iter_rev_init(SymlistIterTmp *state, Symlist *symlist)
{
    *state=(symlist==NULL ? NULL : symlist->prev);
}


void *symlist_iter_rev(SymlistIterTmp *state)
{
    void *symbol=NULL;
    
    if(*state!=NULL){
        symbol=(*state)->symbol;
        *state=(*state)->prev;
        if((*state)->next==NULL)
            *state=NULL;
    }
    
    return symbol;
}

mercurial