Files
openairinterface5g/openair2/UTIL/LISTS/list.c
T
Lionel Gauthier 85cdfc7c1c Licence
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5158 818b1a75-f10b-46b9-bf7c-635c3b92a50f
2014-03-14 09:43:16 +00:00

265 lines
7.5 KiB
C
Executable File

/*******************************************************************************
Eurecom OpenAirInterface 2
Copyright(c) 1999 - 2014 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope 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 St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fsr/openairinterface
Address : EURECOM,
Campus SophiaTech,
450 Route des Chappes,
CS 50193
06904 Biot Sophia Antipolis cedex,
FRANCE
*******************************************************************************/
/***************************************************************************
list_t.c - description
-------------------
-------------------
AUTHOR : Lionel GAUTHIER
COMPANY : EURECOM
EMAIL : Lionel.Gauthier@eurecom.fr
***************************************************************************/
#define LIST_C
#define NULL 0
#include "list.h"
//-----------------------------------------------------------------------------
/*
* initialize list
*/
//-----------------------------------------------------------------------------
void
list_init (list_t * listP, char *nameP)
{
//-----------------------------------------------------------------------------
int i = 0;
if (nameP) {
while ((listP->name[i] = nameP[i]) && (i++ < LIST_NAME_MAX_CHAR));
}
listP->tail = NULL;
listP->head = NULL;
listP->nb_elements = 0;
}
//-----------------------------------------------------------------------------
void
list_free (list_t * listP)
{
//-----------------------------------------------------------------------------
mem_block_t *le;
while ((le = list_remove_head (listP))) {
free_mem_block (le);
}
}
//-----------------------------------------------------------------------------
mem_block_t *
list_get_head (list_t * listP)
{
//-----------------------------------------------------------------------------
return listP->head;
}
//-----------------------------------------------------------------------------
/*
* remove an element from head of a list
* @param pointer on targeted list
* @return pointer on removed mem_block_t
*/
mem_block_t *
list_remove_head (list_t * listP)
{
//-----------------------------------------------------------------------------
// access optimisation
mem_block_t *head;
head = listP->head;
// almost one element
if (head != NULL) {
listP->head = head->next;
listP->nb_elements = listP->nb_elements - 1;
// if only one element, update tail
if (listP->head == NULL) {
listP->tail = NULL;
} else {
head->next = NULL;
}
} else {
//msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name);
}
return head;
}
//-----------------------------------------------------------------------------
mem_block_t *
list_remove_element (mem_block_t * elementP, list_t * listP)
{
//-----------------------------------------------------------------------------
// access optimisation;
mem_block_t *head;
if (elementP != NULL) {
// test head
head = listP->head;
if (listP->head == elementP) {
// almost one element
if (head != NULL) {
listP->head = head->next;
listP->nb_elements = listP->nb_elements - 1;
// if only one element, update tail
if (listP->head == NULL) {
listP->tail = NULL;
} else {
head->next = NULL;
}
}
} else {
while (head) {
if (head->next == elementP) {
head->next = elementP->next;
listP->nb_elements = listP->nb_elements - 1;
if (listP->tail == elementP) {
listP->tail = head;
}
return elementP;
} else {
head = head->next;
}
}
}
}
return elementP;
}
//-----------------------------------------------------------------------------
/*
* add an element to the beginning of a list
* @param pointer on targeted list
* @return pointer on removed mem_block_t
*/
void
list_add_head (mem_block_t * elementP, list_t * listP)
{
//-----------------------------------------------------------------------------
// access optimisation;
mem_block_t *head;
if (elementP != NULL) {
head = listP->head;
listP->nb_elements = listP->nb_elements + 1;
// almost one element
if (head == NULL) {
listP->head = elementP;
listP->tail = elementP;
} else {
elementP->next = head;
listP->head = elementP;
}
}
}
//-----------------------------------------------------------------------------
/*
* add an element to the end of a list
* @param pointer on targeted list
* @return pointer on removed mem_block_t
*/
void
list_add_tail_eurecom (mem_block_t * elementP, list_t * listP)
{
mem_block_t *tail;
//-----------------------------------------------------------------------------
if (elementP != NULL) {
// access optimisation
listP->nb_elements = listP->nb_elements + 1;
elementP->next = NULL;
tail = listP->tail;
// almost one element
if (tail == NULL) {
listP->head = elementP;
} else {
tail->next = elementP;
}
listP->tail = elementP;
} else {
//msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n");
}
}
//-----------------------------------------------------------------------------
void
list_add_list (list_t * sublistP, list_t * listP)
{
//-----------------------------------------------------------------------------
if (sublistP) {
if (sublistP->head) {
// access optimisation
mem_block_t *tail;
tail = listP->tail;
// almost one element
if (tail == NULL) {
listP->head = sublistP->head;
} else {
tail->next = sublistP->head;
}
listP->tail = sublistP->tail;
// clear sublist
sublistP->head = NULL;
sublistP->tail = NULL;
listP->nb_elements = listP->nb_elements + sublistP->nb_elements;
sublistP->nb_elements = 0;
}
}
}
//-----------------------------------------------------------------------------
void
list_display (list_t * listP)
{
//-----------------------------------------------------------------------------
mem_block_t *cursor;
// unsigned short nb_elements = 0;
// test lists
if (listP) {
cursor = listP->head;
if (cursor) {
// almost one element
//msg ("Display list %s %p", listP->name, listP);
// while (cursor != NULL) {
// msg ("%d:", cursor->pool_id);
// msg ("\n");
// cursor = cursor->next;
// nb_elements++;
//}
// msg (" found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
}
} else {
//msg ("[SDU_MNGT][WARNING] display_cnt_list() : list is NULL\n");
}
}