Blame src/list.h

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 */