Logo Search packages:      
Sourcecode: batctl version File versions  Download package

list-batman.c

/* 
 * Copyright (C) 2006-2009 B.A.T.M.A.N. contributors:
 *
 * Marek Lindner
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 *
 */



#include "list-batman.h"



/*
 * Insert a new entry between two known consecutive entries.
 *
 * This is only for internal list manipulation where we know
 * the next entries already!
 */
static void __list_add( struct list_head *new, struct list_head *prev, struct list_head *next ) {

      new->next = next;
      prev->next = new;

}

/**
 * list_add - add a new entry
 * @new: new entry to be added
 * @head: list head to add it after
 *
 * Insert a new entry after the specified head.
 * This is good for implementing stacks.
 */
void list_add( struct list_head *new, struct list_head_first *head ) {

      __list_add( new, (struct list_head *)head, head->next );

      if ( head->prev == (struct list_head *)head )
            head->prev = new;

}

/**
 * list_add_tail - add a new entry
 * @new: new entry to be added
 * @head: list head to add it before
 *
 * Insert a new entry before the specified head.
 * This is useful for implementing queues.
 */
void list_add_tail( struct list_head *new, struct list_head_first *head ) {

      __list_add( new, head->prev, (struct list_head *)head );

      head->prev = new;

}

void list_add_before( struct list_head *prev_node, struct list_head *next_node, struct list_head *new_node ) {

      prev_node->next = new_node;
      new_node->next = next_node;

}



/*
 * Delete a list entry by making the next entries
 * point to each other.
 *
 * This is only for internal list manipulation where we know
 * the next entries already!
 */
static void __list_del( struct list_head *prev, struct list_head *next ) {

      prev->next = next;

}

/**
 * list_del - deletes entry from list.
 * @entry: the element to delete from the list.
 * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
 */
void list_del( struct list_head *prev_entry, struct list_head *entry, struct list_head_first *head ) {

      if ( head->prev == entry )
            head->prev = prev_entry;

      __list_del( prev_entry, entry->next );

      entry->next = (void *) 0;

}



/**
 * list_empty - tests whether a list is empty
 * @head: the list to test.
 */
int list_empty( struct list_head_first *head ) {

      return head->next == (struct list_head *)head;

}


Generated by  Doxygen 1.6.0   Back to index