|
Packit Service |
4684c1 |
/*
|
|
Packit Service |
4684c1 |
* Copyright (C) 2001,2002 Paul Sheer
|
|
Packit Service |
4684c1 |
*
|
|
Packit Service |
4684c1 |
* This file is part of GnuTLS.
|
|
Packit Service |
4684c1 |
*
|
|
Packit Service |
4684c1 |
* GnuTLS is free software; you can redistribute it and/or modify
|
|
Packit Service |
4684c1 |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
4684c1 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit Service |
4684c1 |
* (at your option) any later version.
|
|
Packit Service |
4684c1 |
*
|
|
Packit Service |
4684c1 |
* GnuTLS is distributed in the hope that it will be useful,
|
|
Packit Service |
4684c1 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
4684c1 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
4684c1 |
* GNU General Public License for more details.
|
|
Packit Service |
4684c1 |
*
|
|
Packit Service |
4684c1 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
4684c1 |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
4684c1 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifndef GNUTLS_SRC_LIST_H
|
|
Packit Service |
4684c1 |
#define GNUTLS_SRC_LIST_H
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/*
|
|
Packit Service |
4684c1 |
SOAP:
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
Academics always want to implement hash tables (i.e. dictionaries),
|
|
Packit Service |
4684c1 |
singly or doubly linked lists, and queues, because ... well ... they
|
|
Packit Service |
4684c1 |
know how.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
These datatypes are nonsense for the following reasons:
|
|
Packit Service |
4684c1 |
hash tables: Hash tables are a mapping of some
|
|
Packit Service |
4684c1 |
string to some data, where that data is going to
|
|
Packit Service |
4684c1 |
be accessed COMPLETELY RANDOMLY. This is what it
|
|
Packit Service |
4684c1 |
is for. However it is extremely rare to have a
|
|
Packit Service |
4684c1 |
large number of data elements which really are
|
|
Packit Service |
4684c1 |
being accessed in a completely random way.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
lists: appending and searching through lists is always
|
|
Packit Service |
4684c1 |
slow because these operations search all the way
|
|
Packit Service |
4684c1 |
through the list.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
queues: whats the difference between a queue and a list?
|
|
Packit Service |
4684c1 |
very little really.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
The system implemented here is a doubly linked list with previous
|
|
Packit Service |
4684c1 |
search index that can be appended or prepended with no overhead,
|
|
Packit Service |
4684c1 |
implemented entirely in macros. It is hence as versatile as a
|
|
Packit Service |
4684c1 |
doubly/singly linked list or queue and blazingly fast. Hence doing
|
|
Packit Service |
4684c1 |
sequential searches where the next search result is likely to be
|
|
Packit Service |
4684c1 |
closely indexed to the previous (usual case), is efficient.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
Of course this doesn't mean you should use this as a hash table
|
|
Packit Service |
4684c1 |
where you REALLY need a hash table.
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/********** example usage **********/
|
|
Packit Service |
4684c1 |
/*
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#include "list.h"
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
extern void free (void *x);
|
|
Packit Service |
4684c1 |
extern char *strdup (char *s);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
// consider a list of elements containing an `int' and a `char *'
|
|
Packit Service |
4684c1 |
LIST_TYPE_DECLARE (names, char *s; int i;);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
// for sorting, to compare elements
|
|
Packit Service |
4684c1 |
static int cm (names **a, names **b)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
return strcmp ((*a)->s, (*b)->s);
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
// to free the contents of an element
|
|
Packit Service |
4684c1 |
static void free_item (names *a)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
free (a->s);
|
|
Packit Service |
4684c1 |
a->s = 0; // say
|
|
Packit Service |
4684c1 |
a->i = 0; // say
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
int main (int argc, char **argv)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
// you can separate these into LIST_TYPE_DECLARE(), LIST_DECLARE() and linit() if needed.
|
|
Packit Service |
4684c1 |
LIST_DECLARE_INIT (l, names, free_item);
|
|
Packit Service |
4684c1 |
names *j;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("hello");
|
|
Packit Service |
4684c1 |
l.tail->i = 1;
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("there");
|
|
Packit Service |
4684c1 |
l.tail->i = 2;
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("my");
|
|
Packit Service |
4684c1 |
l.tail->i = 3;
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("name");
|
|
Packit Service |
4684c1 |
l.tail->i = 4;
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("is");
|
|
Packit Service |
4684c1 |
l.tail->i = 5;
|
|
Packit Service |
4684c1 |
lappend (l);
|
|
Packit Service |
4684c1 |
l.tail->s = strdup ("fred");
|
|
Packit Service |
4684c1 |
l.tail->i = 6;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
printf ("%ld\n\n", lcount (l));
|
|
Packit Service |
4684c1 |
lloopforward (l, j, printf ("%d %s\n", j->i, j->s));
|
|
Packit Service |
4684c1 |
printf ("\n");
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
lsort (l, cm);
|
|
Packit Service |
4684c1 |
lloopforward (l, j, printf ("%d %s\n", j->i, j->s));
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
lloopreverse (l, j, if (j->i <= 3) ldeleteinc (l, j););
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
printf ("\n");
|
|
Packit Service |
4684c1 |
lloopforward (l, j, printf ("%d %s\n", j->i, j->s));
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
ldeleteall (l);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
printf ("\n");
|
|
Packit Service |
4684c1 |
lloopforward (l, j, printf ("%d %s\n", j->i, j->s));
|
|
Packit Service |
4684c1 |
return 0;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* the `search' member points to the last found.
|
|
Packit Service |
4684c1 |
this speeds up repeated searches on the same list-item,
|
|
Packit Service |
4684c1 |
the consecutive list-item, or the pre-consecutive list-item.
|
|
Packit Service |
4684c1 |
this obviates the need for a hash table for 99% of
|
|
Packit Service |
4684c1 |
cercumstances the time */
|
|
Packit Service |
4684c1 |
struct list {
|
|
Packit Service |
4684c1 |
long length;
|
|
Packit Service |
4684c1 |
long item_size;
|
|
Packit Service |
4684c1 |
struct list_item {
|
|
Packit Service |
4684c1 |
struct list_item *next;
|
|
Packit Service |
4684c1 |
struct list_item *prev;
|
|
Packit Service |
4684c1 |
char data[1];
|
|
Packit Service |
4684c1 |
} *head, *tail, *search;
|
|
Packit Service |
4684c1 |
void (*free_func) (struct list_item *);
|
|
Packit Service |
4684c1 |
};
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* declare a list of type `x', also called `x' having members `typelist' */
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define LIST_TYPE_DECLARE(type,typelist) \
|
|
Packit Service |
4684c1 |
typedef struct type { \
|
|
Packit Service |
4684c1 |
struct type *next; \
|
|
Packit Service |
4684c1 |
struct type *prev; \
|
|
Packit Service |
4684c1 |
typelist \
|
|
Packit Service |
4684c1 |
} type
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define LIST_DECLARE(l,type) \
|
|
Packit Service |
4684c1 |
struct { \
|
|
Packit Service |
4684c1 |
long length; \
|
|
Packit Service |
4684c1 |
long item_size; \
|
|
Packit Service |
4684c1 |
type *head, *tail, *search; \
|
|
Packit Service |
4684c1 |
void (*free_func) (type *); \
|
|
Packit Service |
4684c1 |
} l
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define LIST_DECLARE_INIT(l,type,free) \
|
|
Packit Service |
4684c1 |
struct { \
|
|
Packit Service |
4684c1 |
long length; \
|
|
Packit Service |
4684c1 |
long item_size; \
|
|
Packit Service |
4684c1 |
type *head, *tail, *search; \
|
|
Packit Service |
4684c1 |
void (*free_func) (type *); \
|
|
Packit Service |
4684c1 |
} l = {0, sizeof (type), 0, 0, 0, (void (*) (type *)) free}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define linit(l,type,free) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
memset (&(l), 0, sizeof (l)); \
|
|
Packit Service |
4684c1 |
(l).item_size = sizeof (type); \
|
|
Packit Service |
4684c1 |
(l).free_func = free; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* returns a pointer to the data of an item */
|
|
Packit Service |
4684c1 |
#define ldata(i) ((void *) &((i)->data[0]))
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* returns a pointer to the list head */
|
|
Packit Service |
4684c1 |
#define lhead(l) ((l).head)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* returns a pointer to the list tail */
|
|
Packit Service |
4684c1 |
#define ltail(l) ((l).tail)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lnewsearch(l) \
|
|
Packit Service |
4684c1 |
(l).search = 0;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* adds to the beginning of the list */
|
|
Packit Service |
4684c1 |
#define lprepend(l) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
__t = (struct list_item *) malloc ((l).item_size); \
|
|
Packit Service |
4684c1 |
memset (__t, 0, (l).item_size); \
|
|
Packit Service |
4684c1 |
__t->next = (l).head; \
|
|
Packit Service |
4684c1 |
if (__t->next) \
|
|
Packit Service |
4684c1 |
__t->next->prev = __t; \
|
|
Packit Service |
4684c1 |
__t->prev = 0; \
|
|
Packit Service |
4684c1 |
if (!(l).tail) \
|
|
Packit Service |
4684c1 |
(l).tail = __t; \
|
|
Packit Service |
4684c1 |
(l).head = __t; \
|
|
Packit Service |
4684c1 |
length++; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* adds to the end of the list */
|
|
Packit Service |
4684c1 |
#define lappend(l) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
__t = (struct list_item *) malloc ((l).item_size); \
|
|
Packit Service |
4684c1 |
memset (__t, 0, (l).item_size); \
|
|
Packit Service |
4684c1 |
__t->prev = (struct list_item *) (l).tail; \
|
|
Packit Service |
4684c1 |
if (__t->prev) \
|
|
Packit Service |
4684c1 |
__t->prev->next = __t; \
|
|
Packit Service |
4684c1 |
__t->next = 0; \
|
|
Packit Service |
4684c1 |
if (!(l).head) \
|
|
Packit Service |
4684c1 |
(l).head = (void *) __t; \
|
|
Packit Service |
4684c1 |
(l).tail = (void *) __t; \
|
|
Packit Service |
4684c1 |
(l).length++; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* you should free these manually */
|
|
Packit Service |
4684c1 |
#define lunlink(l,e) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
(l).search = 0; \
|
|
Packit Service |
4684c1 |
__t = (void *) e; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).head == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).head = (l).head->next; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).tail == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).tail = (l).tail->prev; \
|
|
Packit Service |
4684c1 |
if (__t->next) \
|
|
Packit Service |
4684c1 |
__t->next->prev = __t->prev; \
|
|
Packit Service |
4684c1 |
if (__t->prev) \
|
|
Packit Service |
4684c1 |
__t->prev->next = __t->next; \
|
|
Packit Service |
4684c1 |
(l).length--; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* deletes list entry at point e, and increments e to the following list entry */
|
|
Packit Service |
4684c1 |
#define ldeleteinc(l,e) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
(l).search = 0; \
|
|
Packit Service |
4684c1 |
__t = (void *) e; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).head == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).head = (l).head->next; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).tail == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).tail = (l).tail->prev; \
|
|
Packit Service |
4684c1 |
if (__t->next) \
|
|
Packit Service |
4684c1 |
__t->next->prev = __t->prev; \
|
|
Packit Service |
4684c1 |
if (__t->prev) \
|
|
Packit Service |
4684c1 |
__t->prev->next = __t->next; \
|
|
Packit Service |
4684c1 |
__t = __t->next; \
|
|
Packit Service |
4684c1 |
if ((l).free_func) \
|
|
Packit Service |
4684c1 |
(*(l).free_func) ((void *) e); \
|
|
Packit Service |
4684c1 |
free (e); \
|
|
Packit Service |
4684c1 |
e = (void *) __t; \
|
|
Packit Service |
4684c1 |
(l).length--; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* deletes list entry at point e, and deccrements e to the preceding list emtry */
|
|
Packit Service |
4684c1 |
#define ldeletedec(l,e) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
(l).search = 0; \
|
|
Packit Service |
4684c1 |
__t = (void *) e; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).head == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).head = (l).head->next; \
|
|
Packit Service |
4684c1 |
if ((void *) (l).tail == (void *) __t) \
|
|
Packit Service |
4684c1 |
(l).tail = (l).tail->prev; \
|
|
Packit Service |
4684c1 |
if (__t->next) \
|
|
Packit Service |
4684c1 |
__t->next->prev = __t->prev; \
|
|
Packit Service |
4684c1 |
if (__t->prev) \
|
|
Packit Service |
4684c1 |
__t->prev->next = __t->next; \
|
|
Packit Service |
4684c1 |
__t = __t->prev; \
|
|
Packit Service |
4684c1 |
if ((l).free_func) \
|
|
Packit Service |
4684c1 |
(*(l).free_func) ((void *) e); \
|
|
Packit Service |
4684c1 |
free (e); \
|
|
Packit Service |
4684c1 |
e = (void *) __t; \
|
|
Packit Service |
4684c1 |
(l).length--; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* p and q must be consecutive and neither must be zero */
|
|
Packit Service |
4684c1 |
#define linsert(l,p,q) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
__t = (struct list_item *) malloc ((l).item_size); \
|
|
Packit Service |
4684c1 |
memset (__t, 0, (l).item_size); \
|
|
Packit Service |
4684c1 |
__t->prev = (void *) p; \
|
|
Packit Service |
4684c1 |
__t->next = (void *) q; \
|
|
Packit Service |
4684c1 |
q->prev = (void *) __t; \
|
|
Packit Service |
4684c1 |
p->next = (void *) __t; \
|
|
Packit Service |
4684c1 |
(l).length++; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* p and q must be consecutive and neither must be zero */
|
|
Packit Service |
4684c1 |
#define ldeleteall(l) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
(l).search = 0; \
|
|
Packit Service |
4684c1 |
while ((l).head) { \
|
|
Packit Service |
4684c1 |
struct list_item *__p; \
|
|
Packit Service |
4684c1 |
__p = (struct list_item *) (l).head; \
|
|
Packit Service |
4684c1 |
lunlink(l, __p); \
|
|
Packit Service |
4684c1 |
if ((l).free_func) \
|
|
Packit Service |
4684c1 |
(*(l).free_func) ((void *) __p); \
|
|
Packit Service |
4684c1 |
free (__p); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lloopstart(l,i) \
|
|
Packit Service |
4684c1 |
for (i = (void *) (l).head; i;) { \
|
|
Packit Service |
4684c1 |
struct list_item *__tl; \
|
|
Packit Service |
4684c1 |
__tl = (void *) i->next; \
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lloopend(l,i) \
|
|
Packit Service |
4684c1 |
i = (void *) __tl; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lloopforward(l,i,op) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
for (i = (void *) (l).head; i;) { \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
__t = (void *) i->next; \
|
|
Packit Service |
4684c1 |
op; \
|
|
Packit Service |
4684c1 |
i = (void *) __t; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lloopreverse(l,i,op) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
for (i = (void *) (l).tail; i;) { \
|
|
Packit Service |
4684c1 |
struct list_item *__t; \
|
|
Packit Service |
4684c1 |
__t = (void *) i->prev; \
|
|
Packit Service |
4684c1 |
op; \
|
|
Packit Service |
4684c1 |
i = (void *) __t; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lindex(l,i,n) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
int __k; \
|
|
Packit Service |
4684c1 |
for (__k = 0, i = (void *) (l).head; i && __k != n; i = i->next, __k++); \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lsearchforward(l,i,op) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
int __found = 0; \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search)) { \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search->next)) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search->prev)) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
for (i = (void *) (l).head; i; i = i->next) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
break; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lsearchreverse(l,i,op) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
int __found = 0; \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search)) { \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search->prev)) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
if ((i = (void *) (l).search->next)) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (!__found) \
|
|
Packit Service |
4684c1 |
for (i = (void *) (l).tail; i; i = i->prev) \
|
|
Packit Service |
4684c1 |
if (op) { \
|
|
Packit Service |
4684c1 |
__found = 1; \
|
|
Packit Service |
4684c1 |
(l).search = (void *) i; \
|
|
Packit Service |
4684c1 |
break; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define lcount(l) ((l).length)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* sort with comparison function see qsort(3) */
|
|
Packit Service |
4684c1 |
#define larray(l,a) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
long __i; \
|
|
Packit Service |
4684c1 |
struct list_item *__p; \
|
|
Packit Service |
4684c1 |
a = (void *) malloc (((l).length + 1) * sizeof (void *)); \
|
|
Packit Service |
4684c1 |
for (__i = 0, __p = (void *) (l).head; __p; __p = __p->next, __i++) \
|
|
Packit Service |
4684c1 |
a[__i] = (void *) __p; \
|
|
Packit Service |
4684c1 |
a[__i] = 0; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* sort with comparison function see qsort(3) */
|
|
Packit Service |
4684c1 |
#define llist(l,a) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
struct list_item *__p; \
|
|
Packit Service |
4684c1 |
(l).head = (void *) a[0]; \
|
|
Packit Service |
4684c1 |
(l).search = 0; \
|
|
Packit Service |
4684c1 |
__p = (void *) a[0]; \
|
|
Packit Service |
4684c1 |
__p->prev = 0; \
|
|
Packit Service |
4684c1 |
for (__j = 1; a[__j]; __j++, __p = __p->next) { \
|
|
Packit Service |
4684c1 |
__p->next = (void *) a[__j]; \
|
|
Packit Service |
4684c1 |
__p->next->prev = __p; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
(l).tail = (void *) __p; \
|
|
Packit Service |
4684c1 |
__p->next = 0; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* sort with comparison function see qsort(3) */
|
|
Packit Service |
4684c1 |
#define lsort(l,compare) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
void **__t; \
|
|
Packit Service |
4684c1 |
long __j; \
|
|
Packit Service |
4684c1 |
larray (l,__t); \
|
|
Packit Service |
4684c1 |
qsort (__t, (l).length, sizeof (void *), (int (*) (const void *, const void *)) compare); \
|
|
Packit Service |
4684c1 |
llist (l,__t); \
|
|
Packit Service |
4684c1 |
free (__t); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#endif /* GNUTLS_SRC_LIST_H */
|