From cc6926c559bda00830fcc0f57f4aea9cf0d458e7 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr> Date: Sun, 25 Sep 2016 16:13:58 +0200 Subject: [PATCH] removing duplicate files --- openair2/UTIL/queue.h | 592 ----------------------- openair3/UTILS/HASHTABLE/COPYING | 0 openair3/UTILS/HASHTABLE/Makefile.am | 10 - openair3/UTILS/HASHTABLE/Makefile.eNB | 35 -- openair3/UTILS/HASHTABLE/hashtable.c | 332 ------------- openair3/UTILS/HASHTABLE/hashtable.h | 51 -- openair3/UTILS/HASHTABLE/obj_hashtable.c | 291 ----------- openair3/UTILS/HASHTABLE/obj_hashtable.h | 40 -- 8 files changed, 1351 deletions(-) delete mode 100644 openair2/UTIL/queue.h delete mode 100644 openair3/UTILS/HASHTABLE/COPYING delete mode 100755 openair3/UTILS/HASHTABLE/Makefile.am delete mode 100755 openair3/UTILS/HASHTABLE/Makefile.eNB delete mode 100755 openair3/UTILS/HASHTABLE/hashtable.c delete mode 100755 openair3/UTILS/HASHTABLE/hashtable.h delete mode 100644 openair3/UTILS/HASHTABLE/obj_hashtable.c delete mode 100644 openair3/UTILS/HASHTABLE/obj_hashtable.h diff --git a/openair2/UTIL/queue.h b/openair2/UTIL/queue.h deleted file mode 100644 index f8665c0f1a..0000000000 --- a/openair2/UTIL/queue.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines five types of data structures: singly-linked lists, - * lists, simple queues, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The - * elements are singly linked for minimum space and pointer manipulation - * overhead at the expense of O(n) removal for arbitrary elements. New - * elements can be added to the list after an existing element or at the - * head of the list. Elements being removed from the head of the list - * should use the explicit macro for this purpose for optimum - * efficiency. A singly-linked list may only be traversed in the forward - * direction. Singly-linked lists are ideal for applications with large - * datasets and few or no removals or for implementing a LIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A simple queue is headed by a pair of pointers, one the head of the - * list and the other to the tail of the list. The elements are singly - * linked to save space, so elements can only be removed from the - * head of the list. New elements can be added to the list after - * an existing element, at the head of the list, or at the end of the - * list. A simple queue may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - * SLIST LIST STAILQ TAILQ CIRCLEQ - * _HEAD + + + + + - * _HEAD_INITIALIZER + + + + + - * _ENTRY + + + + + - * _INIT + + + + + - * _EMPTY + + + + + - * _FIRST + + + + + - * _NEXT + + + + + - * _PREV - - - + + - * _LAST - - + + + - * _FOREACH + + + + + - * _FOREACH_REVERSE - - - + + - * _INSERT_HEAD + + + + + - * _INSERT_BEFORE - + - + + - * _INSERT_AFTER + + + + + - * _INSERT_TAIL - - + + + - * _REMOVE_HEAD + - + - - - * _REMOVE + + + + + - */ - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ -#define LIST_INIT(head) do { \ - (head)->lh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} while (/*CONSTCOND*/0) - -#define LIST_REMOVE(elm, field) do { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = ((head)->lh_first); \ - (var); \ - (var) = ((var)->field.le_next)) - -/* - * List access methods. - */ -#define LIST_EMPTY(head) ((head)->lh_first == NULL) -#define LIST_FIRST(head) ((head)->lh_first) -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - - -/* - * Singly-linked List definitions. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) do { \ - (head)->slh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) - -/* - * Singly-linked List access methods. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define SLIST_FIRST(head) ((head)->slh_first) -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first; /* first element */ \ - struct type **stqh_last; /* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) do { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (listelm)->field.stqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->stqh_first; \ - while (curelm->field.stqe_next != (elm)) \ - curelm = curelm->field.stqe_next; \ - if ((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define STAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->stqh_first); \ - (var); \ - (var) = ((var)->field.stqe_next)) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Singly-linked Tail queue access methods. - */ -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) -#define STAILQ_FIRST(head) ((head)->stqh_first) -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - - -/* - * Simple queue definitions. - */ -#define SIMPLEQ_HEAD(name, type) \ -struct name { \ - struct type *sqh_first; /* first element */ \ - struct type **sqh_last; /* addr of last next element */ \ -} - -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).sqh_first } - -#define SIMPLEQ_ENTRY(type) \ -struct { \ - struct type *sqe_next; /* next element */ \ -} - -/* - * Simple queue functions. - */ -#define SIMPLEQ_INIT(head) do { \ - (head)->sqh_first = NULL; \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (head)->sqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.sqe_next = NULL; \ - *(head)->sqh_last = (elm); \ - (head)->sqh_last = &(elm)->field.sqe_next; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (listelm)->field.sqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ - if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ - if ((head)->sqh_first == (elm)) { \ - SIMPLEQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->sqh_first; \ - while (curelm->field.sqe_next != (elm)) \ - curelm = curelm->field.sqe_next; \ - if ((curelm->field.sqe_next = \ - curelm->field.sqe_next->field.sqe_next) == NULL) \ - (head)->sqh_last = &(curelm)->field.sqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->sqh_first); \ - (var); \ - (var) = ((var)->field.sqe_next)) - -/* - * Simple queue access methods. - */ -#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) -#define SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) - - -/* - * Tail queue definitions. - */ -#define _TAILQ_HEAD(name, type, qual) \ -struct name { \ - qual type *tqh_first; /* first element */ \ - qual type *qual *tqh_last; /* addr of last next element */ \ -} -#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define _TAILQ_ENTRY(type, qual) \ -struct { \ - qual type *tqe_next; /* next element */ \ - qual type *qual *tqe_prev; /* address of previous next element */\ -} -#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->tqh_first); \ - (var); \ - (var) = ((var)->field.tqe_next)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ - (var); \ - (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Tail queue access methods. - */ -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&head, (void *)&head } - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) do { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_REMOVE(head, elm, field) do { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->cqh_first); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_next)) - -#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = ((head)->cqh_last); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_prev)) - -/* - * Circular queue access methods. - */ -#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) -#define CIRCLEQ_FIRST(head) ((head)->cqh_first) -#define CIRCLEQ_LAST(head) ((head)->cqh_last) -#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) -#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) - -#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ - (((elm)->field.cqe_next == (void *)(head)) \ - ? ((head)->cqh_first) \ - : (elm->field.cqe_next)) -#define CIRCLEQ_LOOP_PREV(head, elm, field) \ - (((elm)->field.cqe_prev == (void *)(head)) \ - ? ((head)->cqh_last) \ - : (elm->field.cqe_prev)) - -#endif /* sys/queue.h */ diff --git a/openair3/UTILS/HASHTABLE/COPYING b/openair3/UTILS/HASHTABLE/COPYING deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair3/UTILS/HASHTABLE/Makefile.am b/openair3/UTILS/HASHTABLE/Makefile.am deleted file mode 100755 index d6bdbbc3c8..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ - -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON - -noinst_LTLIBRARIES = libhashtable.la -libhashtable_la_LDFLAGS = -all-static -libhashtable_la_SOURCES = \ - hashtable.c hashtable.h \ - obj_hashtable.c obj_hashtable.h - \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/Makefile.eNB b/openair3/UTILS/HASHTABLE/Makefile.eNB deleted file mode 100755 index 2cde7da837..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.eNB +++ /dev/null @@ -1,35 +0,0 @@ - -all: libhashtable.a - -libhashtable_OBJECTS = \ - hashtable.o \ - obj_hashtable.o \ - - -CFLAGS = \ - -DUSER_MODE \ - -DENABLE_USE_MME \ - -g \ - -O2 \ - -Wall \ - -Werror=implicit-function-declaration - --include .deps/*.d - -$(libhashtable_OBJECTS): %.o : %.c - $(CC) -c $(CFLAGS) -o $@ $< - @if ! test -d ".deps" ; then mkdir -p .deps/; fi - @$(CC) -MM $(CFLAGS) $*.c > .deps/$*.d - @mv -f .deps/$*.d .deps/$*.d.tmp - @sed -e 's|.*:|$*.o:|' < .deps/$*.d.tmp > .deps/$*.d - @sed -e 's/.*://' -e 's/\\$$//' < .deps/$*.d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> .deps/$*.d - @rm -f .deps/$*.d.tmp - -libhashtable.a: $(libhashtable_OBJECTS) - $(AR) rcvs $@ $(libhashtable_OBJECTS) - -clean: - rm -f libhashtable.a - rm -rf .deps/ - rm -f $(libhashtable_OBJECTS) \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/hashtable.c b/openair3/UTILS/HASHTABLE/hashtable.c deleted file mode 100755 index 279eaebae8..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.c +++ /dev/null @@ -1,332 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver. - */ -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include "hashtable.h" - - -//------------------------------------------------------------------------------------------------------------------------------- -char* hashtable_rc_code2string(hashtable_rc_t rcP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - switch (rcP) { - case HASH_TABLE_OK: - return "HASH_TABLE_OK"; - break; - - case HASH_TABLE_INSERT_OVERWRITTEN_DATA: - return "HASH_TABLE_INSERT_OVERWRITTEN_DATA"; - break; - - case HASH_TABLE_KEY_NOT_EXISTS: - return "HASH_TABLE_KEY_NOT_EXISTS"; - break; - - case HASH_TABLE_KEY_ALREADY_EXISTS: - return "HASH_TABLE_KEY_ALREADY_EXISTS"; - break; - - case HASH_TABLE_BAD_PARAMETER_HASHTABLE: - return "HASH_TABLE_BAD_PARAMETER_HASHTABLE"; - break; - - default: - return "UNKNOWN hashtable_rc_t"; - } -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * free int function - * hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value). - */ - -void hash_free_int_func(void* memoryP) {} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const uint64_t keyP) -{ - return (hash_size_t)keyP; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned hash_table_t pointer should be released with hashtable_destroy(). - */ -hash_table_t *hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const uint64_t ), void (*freefuncP)(void*)) -{ - hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freefuncP) hashtbl->freefunc=freefuncP; - else hashtbl->freefunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t. - */ -hashtable_rc_t hashtable_destroy(hash_table_t *hashtblP) -{ - hash_size_t n; - hash_node_t *node, *oldnode; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - for(n=0; n<hashtblP->size; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - - if (oldnode->data) { - hashtblP->freefunc(oldnode->data); - } - - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtblP, const uint64_t keyP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void functP(uint64_t keyP, void* dataP, void* parameterP), void* parameterP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node = NULL; - unsigned int i = 0; - unsigned int num_elements = 0; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - while ((num_elements < hashtblP->num_elements) && (i < hashtblP->size)) { - if (hashtblP->nodes[i] != NULL) { - node=hashtblP->nodes[i]; - - while(node) { - num_elements += 1; - functP(node->key, node->data, parameterP); - node=node->next; - } - } - - i += 1; - } - - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t hashtable_insert(hash_table_t *hashtblP, const uint64_t keyP, void *dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freefunc(node->data); - } - - node->data=dataP; - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - hashtblP->num_elements += 1; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t hashtable_remove(hash_table_t *hashtblP, const uint64_t keyP) -{ - hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if(prevnode) prevnode->next=node->next; - else hashtblP->nodes[hash]=node->next; - - if (node->data) { - hashtblP->freefunc(node->data); - } - - free(node); - hashtblP->num_elements -= 1; - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t hashtable_get(hash_table_t *hashtblP, const uint64_t keyP, void** dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - /* fprintf(stderr, "hashtable_get() key=%s, hash=%d\n", key, hash);*/ - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ - -hashtable_rc_t hashtable_resize(hash_table_t *hashtblP, hash_size_t sizeP) -{ - hash_table_t newtbl; - hash_size_t n; - hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(hash_node_t*)))) return -1; - - for(n=0; n<hashtblP->size; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - hashtable_insert(&newtbl, node->key, node->data); - // Lionel GAUTHIER: BAD CODE TO BE REWRITTEN - hashtable_remove(hashtblP, node->key); - - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/hashtable.h b/openair3/UTILS/HASHTABLE/hashtable.h deleted file mode 100755 index fc9b368724..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.h +++ /dev/null @@ -1,51 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver.(http://creativecommons.org/publicdomain/zero/1.0/) - */ -#ifndef _UTILS_COLLECTION_HASH_TABLE_H_ -#define _UTILS_COLLECTION_HASH_TABLE_H_ -#include<stdlib.h> -#include <stdint.h> -#include <stddef.h> - -typedef size_t hash_size_t; - -typedef enum hashtable_return_code_e { - HASH_TABLE_OK = 0, - HASH_TABLE_INSERT_OVERWRITTEN_DATA = 1, - HASH_TABLE_KEY_NOT_EXISTS = 2, - HASH_TABLE_KEY_ALREADY_EXISTS = 3, - HASH_TABLE_BAD_PARAMETER_HASHTABLE = 4, - HASH_TABLE_SYSTEM_ERROR = 5, - HASH_TABLE_CODE_MAX -} hashtable_rc_t; - - -typedef struct hash_node_s { - uint64_t key; - void *data; - struct hash_node_s *next; -} hash_node_t; - -typedef struct hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct hash_node_s **nodes; - hash_size_t (*hashfunc)(const uint64_t); - void (*freefunc)(void*); -} hash_table_t; - -char* hashtable_rc_code2string(hashtable_rc_t rcP); -void hash_free_int_func(void* memoryP); -hash_table_t *hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const uint64_t ), void (*freefunc)(void*)); -hashtable_rc_t hashtable_destroy(hash_table_t *hashtbl); -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void funct(uint64_t keyP, void* dataP, void* parameterP), void* parameterP); -hashtable_rc_t hashtable_insert (hash_table_t *hashtbl, const uint64_t key, void *data); -hashtable_rc_t hashtable_remove (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_get (hash_table_t *hashtbl, const uint64_t key, void **dataP); -hashtable_rc_t hashtable_resize (hash_table_t *hashtbl, hash_size_t size); - - - -#endif - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.c b/openair3/UTILS/HASHTABLE/obj_hashtable.c deleted file mode 100644 index 81abfe03b7..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.c +++ /dev/null @@ -1,291 +0,0 @@ -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include "obj_hashtable.h" -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const void *keyP, int key_sizeP) -{ - hash_size_t hash=0; - - while(key_sizeP) hash^=((unsigned char*)keyP)[key_sizeP --]; - - return hash; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy(). - */ -obj_hash_table_t *obj_hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const void*, int ), void (*freekeyfuncP)(void*), void (*freedatafuncP)(void*)) -{ - obj_hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(obj_hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freekeyfuncP) hashtbl->freekeyfunc=freekeyfuncP; - else hashtbl->freekeyfunc=free; - - if(freedatafuncP) hashtbl->freedatafunc=freedatafuncP; - else hashtbl->freedatafunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t. - */ -hashtable_rc_t obj_hashtable_destroy(obj_hash_table_t *hashtblP) -{ - hash_size_t n; - obj_hash_node_t *node, *oldnode; - - for(n=0; n<hashtblP->size; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - hashtblP->freekeyfunc(oldnode->key); - hashtblP->freedatafunc(oldnode->data); - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t obj_hashtable_insert(obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freedatafunc(node->data); - } - - node->data=dataP; - // waste of memory here (keyP is lost) we should free it now - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(obj_hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t obj_hashtable_remove(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP) -{ - obj_hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if ((node->key == keyP) || ((node->key_size == key_sizeP) && (memcmp(node->key, keyP, key_sizeP) == 0))) { - if(prevnode) { - prevnode->next=node->next; - } else { - hashtblP->nodes[hash]=node->next; - } - - hashtblP->freekeyfunc(node->key); - hashtblP->freedatafunc(node->data); - free(node); - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t obj_hashtable_get(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void** dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - *dataP = node->data; - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Function to return all keys of an object hash table - */ -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP) -{ - size_t n = 0; - obj_hash_node_t *node = NULL; - obj_hash_node_t *next = NULL; - - *sizeP = 0; - keysP = calloc(hashtblP->num_elements, sizeof(void *)); - - if (keysP) { - for(n=0; n<hashtblP->size; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - keysP[*sizeP++] = node->key; - next = node->next; - } - } - - return HASH_TABLE_OK; - } - - return HASH_TABLE_SYSTEM_ERROR; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary obj_hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ -hashtable_rc_t obj_hashtable_resize(obj_hash_table_t *hashtblP, hash_size_t sizeP) -{ - obj_hash_table_t newtbl; - hash_size_t n; - obj_hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) return HASH_TABLE_SYSTEM_ERROR; - - for(n=0; n<hashtblP->size; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - obj_hashtable_insert(&newtbl, node->key, node->key_size, node->data); - obj_hashtable_remove(hashtblP, node->key, node->key_size); - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.h b/openair3/UTILS/HASHTABLE/obj_hashtable.h deleted file mode 100644 index d11a67e264..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _OBJ_HASH_TABLE_H_ -#define _OBJ_HASH_TABLE_H_ -#include<stdlib.h> -#include <stdint.h> -#include <stddef.h> - -#include "hashtable.h" - -typedef size_t hash_size_t; - - -typedef struct obj_hash_node_s { - int key_size; - void *key; - void *data; - struct obj_hash_node_s *next; -} obj_hash_node_t; - -typedef struct obj_hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct obj_hash_node_s **nodes; - hash_size_t (*hashfunc)(const void*, int); - void (*freekeyfunc)(void*); - void (*freedatafunc)(void*); -} obj_hash_table_t; - -obj_hash_table_t *obj_hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const void*, int ), void (*freekeyfunc)(void*), void (*freedatafunc)(void*)); -hashtable_rc_t obj_hashtable_destroy (obj_hash_table_t *hashtblP); -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_insert (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP); -hashtable_rc_t obj_hashtable_remove (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_get (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void ** dataP); -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP); -hashtable_rc_t obj_hashtable_resize (obj_hash_table_t *hashtblP, hash_size_t sizeP); - - - -#endif - -- GitLab