]> git.proxmox.com Git - grub2.git/blob - include/grub/list.h
Import grub2_2.02+dfsg1.orig.tar.xz
[grub2.git] / include / grub / list.h
1 /* list.h - header for grub list */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 Free Software Foundation, Inc.
5 *
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef GRUB_LIST_HEADER
21 #define GRUB_LIST_HEADER 1
22
23 #include <grub/symbol.h>
24 #include <grub/err.h>
25 #include <grub/compiler.h>
26
27 struct grub_list
28 {
29 struct grub_list *next;
30 struct grub_list **prev;
31 };
32 typedef struct grub_list *grub_list_t;
33
34 void EXPORT_FUNC(grub_list_push) (grub_list_t *head, grub_list_t item);
35 void EXPORT_FUNC(grub_list_remove) (grub_list_t item);
36
37 #define FOR_LIST_ELEMENTS(var, list) for ((var) = (list); (var); (var) = (var)->next)
38 #define FOR_LIST_ELEMENTS_SAFE(var, nxt, list) for ((var) = (list), (nxt) = ((var) ? (var)->next : 0); (var); (var) = (nxt), ((nxt) = (var) ? (var)->next : 0))
39
40 static inline void *
41 grub_bad_type_cast_real (int line, const char *file)
42 ATTRIBUTE_ERROR ("bad type cast between incompatible grub types");
43
44 static inline void *
45 grub_bad_type_cast_real (int line, const char *file)
46 {
47 grub_fatal ("error:%s:%u: bad type cast between incompatible grub types",
48 file, line);
49 }
50
51 #define grub_bad_type_cast() grub_bad_type_cast_real(__LINE__, GRUB_FILE)
52
53 #define GRUB_FIELD_MATCH(ptr, type, field) \
54 ((char *) &(ptr)->field == (char *) &((type) (ptr))->field)
55
56 #define GRUB_AS_LIST(ptr) \
57 (GRUB_FIELD_MATCH (ptr, grub_list_t, next) && GRUB_FIELD_MATCH (ptr, grub_list_t, prev) ? \
58 (grub_list_t) ptr : (grub_list_t) grub_bad_type_cast ())
59
60 #define GRUB_AS_LIST_P(pptr) \
61 (GRUB_FIELD_MATCH (*pptr, grub_list_t, next) && GRUB_FIELD_MATCH (*pptr, grub_list_t, prev) ? \
62 (grub_list_t *) (void *) pptr : (grub_list_t *) grub_bad_type_cast ())
63
64 struct grub_named_list
65 {
66 struct grub_named_list *next;
67 struct grub_named_list **prev;
68 char *name;
69 };
70 typedef struct grub_named_list *grub_named_list_t;
71
72 void * EXPORT_FUNC(grub_named_list_find) (grub_named_list_t head,
73 const char *name);
74
75 #define GRUB_AS_NAMED_LIST(ptr) \
76 ((GRUB_FIELD_MATCH (ptr, grub_named_list_t, next) \
77 && GRUB_FIELD_MATCH (ptr, grub_named_list_t, prev) \
78 && GRUB_FIELD_MATCH (ptr, grub_named_list_t, name))? \
79 (grub_named_list_t) ptr : (grub_named_list_t) grub_bad_type_cast ())
80
81 #define GRUB_AS_NAMED_LIST_P(pptr) \
82 ((GRUB_FIELD_MATCH (*pptr, grub_named_list_t, next) \
83 && GRUB_FIELD_MATCH (*pptr, grub_named_list_t, prev) \
84 && GRUB_FIELD_MATCH (*pptr, grub_named_list_t, name))? \
85 (grub_named_list_t *) (void *) pptr : (grub_named_list_t *) grub_bad_type_cast ())
86
87 #endif /* ! GRUB_LIST_HEADER */