Import Upstream version 1.2.2
[quagga-debian.git] / lib / fifo.h
1 /* FIFO common header.
2    Copyright (C) 2015 Kunihiro Ishiguro
3
4 This file is part of Quagga.
5
6 Quagga is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 Quagga is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Zebra; see the file COPYING.  If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.  */
20 #ifndef __LIB_FIFO_H__
21 #define __LIB_FIFO_H__
22
23 /* FIFO -- first in first out structure and macros.  */
24 struct fifo
25 {
26   struct fifo *next;
27   struct fifo *prev;
28   u_int32_t count;
29 };
30
31 #define FIFO_INIT(F)                                  \
32   do {                                                \
33     struct fifo *Xfifo = (struct fifo *)(F);          \
34     Xfifo->next = Xfifo->prev = Xfifo;                \
35   } while (0)
36
37 #define FIFO_ADD(F,N)                                 \
38   do {                                                \
39     struct fifo *Xfifo = (struct fifo *)(F);          \
40     struct fifo *Xnode = (struct fifo *)(N);          \
41     Xnode->next = Xfifo;                              \
42     Xnode->prev = Xfifo->prev;                        \
43     Xfifo->prev = Xfifo->prev->next = Xnode;          \
44   } while (0)
45
46 #define FIFO_DEL(N)                                   \
47   do {                                                \
48     struct fifo *Xnode = (struct fifo *)(N);          \
49     Xnode->prev->next = Xnode->next;                  \
50     Xnode->next->prev = Xnode->prev;                  \
51   } while (0)
52
53 #define FIFO_HEAD(F)                                  \
54   ((((struct fifo *)(F))->next == (struct fifo *)(F)) \
55   ? NULL : (F)->next)
56
57 #define FIFO_EMPTY(F)                                 \
58   (((struct fifo *)(F))->next == (struct fifo *)(F))
59
60 #define FIFO_TOP(F)                                   \
61   (FIFO_EMPTY(F) ? NULL : ((struct fifo *)(F))->next)
62
63 #endif /* __LIB_FIFO_H__ */