Upgraded GRUB2 to 2.00 release.
[AROS.git] / arch / all-pc / boot / grub2-aros / include / grub / list.h
blobcadb2d9f9d8470d6ec9977aa45419dd8ea054147
1 /* list.h - header for grub list */
2 /*
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>
27 struct grub_list
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)
39 static inline void *
40 grub_bad_type_cast_real (int line, const char *file)
41 ATTRIBUTE_ERROR ("bad type cast between incompatible grub types");
43 static inline void *
44 grub_bad_type_cast_real (int line, const char *file)
46 grub_fatal ("error:%s:%u: bad type cast between incompatible grub types",
47 file, line);
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;
67 char *name;
69 typedef struct grub_named_list *grub_named_list_t;
71 void * EXPORT_FUNC(grub_named_list_find) (grub_named_list_t head,
72 const char *name);
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 */