2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
8 * Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program (see the file COPYING included with this
21 * distribution); if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #define CIRC_LIST(name, type) \
38 type x_list[EMPTY_ARRAY_SIZE]; \
41 #define CIRC_LIST_PUSH(obj, item) \
43 (obj)->x_head = modulo_add ((obj)->x_head, -1, (obj)->x_cap); \
44 (obj)->x_list[(obj)->x_head] = (item); \
45 (obj)->x_size = min_int ((obj)->x_size + 1, (obj)->x_cap); \
48 #define CIRC_LIST_SIZE(obj) \
51 #define CIRC_LIST_INDEX(obj, index) \
52 modulo_add ((obj)->x_head, \
53 index_verify ((index), (obj)->x_size, __FILE__, __LINE__), \
56 #define CIRC_LIST_ITEM(obj, index) \
57 ((obj)->x_list[CIRC_LIST_INDEX((obj), (index))])
59 #define CIRC_LIST_RESET(obj) \
65 #define CIRC_LIST_ALLOC(dest, list_type, size) \
67 const int so = sizeof (list_type) + sizeof ((dest)->x_list[0]) * (size); \
68 (dest) = (list_type *) malloc (so); \
69 check_malloc_return (dest); \
70 memset ((dest), 0, so); \
71 (dest)->x_cap = size; \
72 (dest)->x_sizeof = so; \
75 #define CIRC_LIST_FREE(dest) \