1 /* list.h - header for grub list */
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 Free Software Foundation, Inc.
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.
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.
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/>.
20 #ifndef GRUB_LIST_HEADER
21 #define GRUB_LIST_HEADER 1
23 #include <grub/symbol.h>
24 #include <grub/types.h>
25 #include <grub/misc.h>
29 struct grub_list
*next
;
30 struct grub_list
**prev
;
32 typedef struct grub_list
*grub_list_t
;
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
);
37 #define FOR_LIST_ELEMENTS(var, list) for ((var) = (list); (var); (var) = (var)->next)
40 grub_bad_type_cast_real (int line
, const char *file
)
41 ATTRIBUTE_ERROR ("bad type cast between incompatible grub types");
44 grub_bad_type_cast_real (int line
, const char *file
)
46 grub_fatal ("error:%s:%u: bad type cast between incompatible grub types",
50 #define grub_bad_type_cast() grub_bad_type_cast_real(__LINE__, GRUB_FILE)
52 #define GRUB_FIELD_MATCH(ptr, type, field) \
53 ((char *) &(ptr)->field == (char *) &((type) (ptr))->field)
55 #define GRUB_AS_LIST(ptr) \
56 (GRUB_FIELD_MATCH (ptr, grub_list_t, next) && GRUB_FIELD_MATCH (ptr, grub_list_t, prev) ? \
57 (grub_list_t) ptr : (grub_list_t) grub_bad_type_cast ())
59 #define GRUB_AS_LIST_P(pptr) \
60 (GRUB_FIELD_MATCH (*pptr, grub_list_t, next) && GRUB_FIELD_MATCH (*pptr, grub_list_t, prev) ? \
61 (grub_list_t *) (void *) pptr : (grub_list_t *) grub_bad_type_cast ())
63 struct grub_named_list
65 struct grub_named_list
*next
;
66 struct grub_named_list
**prev
;
69 typedef struct grub_named_list
*grub_named_list_t
;
71 void * EXPORT_FUNC(grub_named_list_find
) (grub_named_list_t head
,
74 #define GRUB_AS_NAMED_LIST(ptr) \
75 ((GRUB_FIELD_MATCH (ptr, grub_named_list_t, next) \
76 && GRUB_FIELD_MATCH (ptr, grub_named_list_t, prev) \
77 && GRUB_FIELD_MATCH (ptr, grub_named_list_t, name))? \
78 (grub_named_list_t) ptr : (grub_named_list_t) grub_bad_type_cast ())
80 #define GRUB_AS_NAMED_LIST_P(pptr) \
81 ((GRUB_FIELD_MATCH (*pptr, grub_named_list_t, next) \
82 && GRUB_FIELD_MATCH (*pptr, grub_named_list_t, prev) \
83 && GRUB_FIELD_MATCH (*pptr, grub_named_list_t, name))? \
84 (grub_named_list_t *) (void *) pptr : (grub_named_list_t *) grub_bad_type_cast ())
86 #endif /* ! GRUB_LIST_HEADER */