Initial commit, not tested
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4849 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Executable
+30
@@ -0,0 +1,30 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Eurecom OpenAirInterface 2
|
||||
Copyright(c) 2013 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, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
|
||||
|
||||
*******************************************************************************/
|
||||
#define L2_C
|
||||
#include "l2.h"
|
||||
Executable
+188
@@ -0,0 +1,188 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Eurecom OpenAirInterface
|
||||
Copyright(c) 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, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
|
||||
|
||||
*******************************************************************************/
|
||||
#ifndef __L2_H__
|
||||
# define __L2_H__
|
||||
|
||||
#ifdef L2_C
|
||||
# define TYPEDEF_LIST2(DATA_TYPE_NAME) typedef struct DATA_TYPE_NAME ## _lst2_s {DATA_TYPE_NAME *head;DATA_TYPE_NAME *tail; int nb_elements;} DATA_TYPE_NAME ## _lst2_t;\
|
||||
void DATA_TYPE_NAME ## _lst2_init ( DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
void DATA_TYPE_NAME ## _lst2_free (DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_element (DATA_TYPE_NAME * element_pP, DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_head (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_tail (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_head (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_tail (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
void DATA_TYPE_NAME ## _lst2_add_head (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
void DATA_TYPE_NAME ## _lst2_add_tail (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
void DATA_TYPE_NAME ## _lst2_add_lst2 (DATA_TYPE_NAME ## _lst2_t* sublist_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
inline void DATA_TYPE_NAME ## _lst2_init ( DATA_TYPE_NAME ## _lst2_t * list_pP) {\
|
||||
list_pP->tail = NULL;\
|
||||
list_pP->head = NULL;\
|
||||
list_pP->nb_elements = 0;\
|
||||
}\
|
||||
inline void DATA_TYPE_NAME ## _lst2_free (DATA_TYPE_NAME ## _lst2_t * list_pP) {\
|
||||
DATA_TYPE_NAME *le;\
|
||||
while ((le = DATA_TYPE_NAME ## _lst2_remove_head (list_pP))) {\
|
||||
free_mem_block (le);\
|
||||
}\
|
||||
}\
|
||||
inline DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_element (DATA_TYPE_NAME * element_pP, DATA_TYPE_NAME ## _lst2_t * list_pP) {\
|
||||
if (element_pP != NULL) {\
|
||||
/* head of list*/\
|
||||
if (element_pP == list_pP->head) {\
|
||||
list_pP->head = element_pP->next;\
|
||||
if (list_pP->head == NULL) {\
|
||||
list_pP->tail = NULL;\
|
||||
} else {\
|
||||
element_pP->next->previous = NULL;\
|
||||
element_pP->next = NULL;\
|
||||
}\
|
||||
/* tail of the list*/\
|
||||
/* note : case of 1 remaining element in the list has been treated above*/\
|
||||
} else if (element_pP == list_pP->tail) {\
|
||||
/* so several elements in the list*/\
|
||||
list_pP->tail = element_pP->previous;\
|
||||
list_pP->tail->next = NULL;\
|
||||
element_pP->previous = NULL;\
|
||||
/* in the middle of the list, after a head element and before the tail element*/\
|
||||
} else {\
|
||||
/* link element n-1 with element n+1*/\
|
||||
element_pP->previous->next = element_pP->next;\
|
||||
element_pP->next->previous = element_pP->previous;\
|
||||
element_pP->next = NULL;\
|
||||
element_pP->previous = NULL;\
|
||||
}\
|
||||
list_pP->nb_elements = list_pP->nb_elements - 1;\
|
||||
}\
|
||||
return element_pP;\
|
||||
}\
|
||||
inline DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_head (DATA_TYPE_NAME ## _lst2_t* list_pP) {return list_pP->head;}\
|
||||
inline DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_tail (DATA_TYPE_NAME ## _lst2_t* list_pP) {return list_pP->tail;}\
|
||||
inline DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_head (DATA_TYPE_NAME ## _lst2_t* list_pP) {\
|
||||
DATA_TYPE_NAME *head;\
|
||||
head = list_pP->head;\
|
||||
if (head != NULL) {\
|
||||
list_pP->head = head->next;\
|
||||
list_pP->nb_elements = list_pP->nb_elements - 1;\
|
||||
if (list_pP->head == NULL) {\
|
||||
list_pP->tail = NULL;\
|
||||
} else {\
|
||||
list_pP->head->previous = NULL;\
|
||||
head->next = NULL;\
|
||||
}\
|
||||
}\
|
||||
return head;\
|
||||
}\
|
||||
inline DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_tail (DATA_TYPE_NAME ## _lst2_t* list_pP){\
|
||||
DATA_TYPE_NAME *tail;\
|
||||
tail = list_pP->tail;\
|
||||
if (tail != NULL) {\
|
||||
list_pP->nb_elements = list_pP->nb_elements - 1;\
|
||||
if (list_pP->head == tail) {\
|
||||
list_pP->head = NULL;\
|
||||
list_pP->tail = NULL;\
|
||||
} else {\
|
||||
list_pP->tail = tail->previous;\
|
||||
tail->previous->next = NULL;\
|
||||
}\
|
||||
tail->previous = NULL;\
|
||||
}\
|
||||
return tail;\
|
||||
}\
|
||||
inline void DATA_TYPE_NAME ## _lst2_add_head (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP) {\
|
||||
DATA_TYPE_NAME *head;\
|
||||
if (element_pP != NULL) {\
|
||||
head = list_pP->head;\
|
||||
list_pP->nb_elements = list_pP->nb_elements + 1;\
|
||||
if (head == NULL) {\
|
||||
list_pP->head = element_pP;\
|
||||
list_pP->tail = element_pP;\
|
||||
} else {\
|
||||
element_pP->next = head;\
|
||||
head->previous = element_pP;\
|
||||
element_pP->previous = NULL;\
|
||||
list_pP->head = element_pP;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
inline void DATA_TYPE_NAME ## _lst2_add_tail (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP) {\
|
||||
DATA_TYPE_NAME *tail;\
|
||||
if (element_pP != NULL) {\
|
||||
list_pP->nb_elements = list_pP->nb_elements + 1;\
|
||||
element_pP->next = NULL;\
|
||||
tail = list_pP->tail;\
|
||||
if (tail == NULL) {\
|
||||
element_pP->previous = NULL;\
|
||||
list_pP->head = element_pP;\
|
||||
} else {\
|
||||
tail->next = element_pP;\
|
||||
element_pP->previous = tail;\
|
||||
}\
|
||||
list_pP->tail = element_pP;\
|
||||
}\
|
||||
}\
|
||||
inline void DATA_TYPE_NAME ## _lst2_add_lst2 (DATA_TYPE_NAME ## _lst2_t* sublist_pP, DATA_TYPE_NAME ## _lst2_t* list_pP){ \
|
||||
if (sublist_pP) {\
|
||||
if (sublist_pP->head) {\
|
||||
DATA_TYPE_NAME *tail;\
|
||||
tail = list_pP->tail;\
|
||||
if (tail == NULL) {\
|
||||
list_pP->head = sublist_pP->head;\
|
||||
} else {\
|
||||
tail->next = sublist_pP->head;\
|
||||
sublist_pP->head->previous = tail;\
|
||||
}\
|
||||
list_pP->tail = sublist_pP->tail;\
|
||||
sublist_pP->head = NULL;\
|
||||
sublist_pP->tail = NULL;\
|
||||
}\
|
||||
list_pP->nb_elements = list_pP->nb_elements + sublist_pP->nb_elements;\
|
||||
}\
|
||||
}
|
||||
#else
|
||||
#define TYPEDEF_LIST2(DATA_TYPE_NAME) typedef struct DATA_TYPE_NAME ## _lst2_s {DATA_TYPE_NAME *head;DATA_TYPE_NAME *tail; int nb_elements;} DATA_TYPE_NAME ## _lst2_t;\
|
||||
extern void DATA_TYPE_NAME ## _lst2_init ( DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
extern void DATA_TYPE_NAME ## _lst2_free (DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
extern DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_element (DATA_TYPE_NAME * element_pP, DATA_TYPE_NAME ## _lst2_t * list_pP);\
|
||||
extern DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_head (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_get_tail (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_head (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern DATA_TYPE_NAME* DATA_TYPE_NAME ## _lst2_remove_tail (DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern void DATA_TYPE_NAME ## _lst2_add_head (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern void DATA_TYPE_NAME ## _lst2_add_tail (DATA_TYPE_NAME* element_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);\
|
||||
extern void DATA_TYPE_NAME ## _lst2_add_lst2 (DATA_TYPE_NAME ## _lst2_t* sublist_pP, DATA_TYPE_NAME ## _lst2_t* list_pP);
|
||||
#endif
|
||||
#define LIST2(DATA_TYPE_NAME, VAR_NAME) DATA_TYPE_NAME ## _lst2_t VAR_NAME ## _list;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user