]>
Commit | Line | Data |
---|---|---|
ea863ec6 DS |
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 | }; | |
29 | ||
30 | #define FIFO_INIT(F) \ | |
31 | do { \ | |
32 | struct fifo *Xfifo = (struct fifo *)(F); \ | |
33 | Xfifo->next = Xfifo->prev = Xfifo; \ | |
34 | } while (0) | |
35 | ||
36 | #define FIFO_ADD(F,N) \ | |
37 | do { \ | |
38 | struct fifo *Xfifo = (struct fifo *)(F); \ | |
39 | struct fifo *Xnode = (struct fifo *)(N); \ | |
40 | Xnode->next = Xfifo; \ | |
41 | Xnode->prev = Xfifo->prev; \ | |
42 | Xfifo->prev = Xfifo->prev->next = Xnode; \ | |
43 | } while (0) | |
44 | ||
45 | #define FIFO_DEL(N) \ | |
46 | do { \ | |
47 | struct fifo *Xnode = (struct fifo *)(N); \ | |
48 | Xnode->prev->next = Xnode->next; \ | |
49 | Xnode->next->prev = Xnode->prev; \ | |
50 | } while (0) | |
51 | ||
52 | #define FIFO_HEAD(F) \ | |
53 | ((((struct fifo *)(F))->next == (struct fifo *)(F)) \ | |
54 | ? NULL : (F)->next) | |
55 | ||
56 | #define FIFO_EMPTY(F) \ | |
57 | (((struct fifo *)(F))->next == (struct fifo *)(F)) | |
58 | ||
59 | #define FIFO_TOP(F) \ | |
60 | (FIFO_EMPTY(F) ? NULL : ((struct fifo *)(F))->next) | |
61 | ||
62 | #endif /* __LIB_FIFO_H__ */ |