From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1KZ9sD-00021e-NR for mharc-grub-devel@gnu.org; Fri, 29 Aug 2008 15:43:09 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KZ9sC-00021M-Sq for grub-devel@gnu.org; Fri, 29 Aug 2008 15:43:08 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KZ9sB-000212-FF for grub-devel@gnu.org; Fri, 29 Aug 2008 15:43:08 -0400 Received: from [199.232.76.173] (port=44596 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KZ9sB-00020z-Ab for grub-devel@gnu.org; Fri, 29 Aug 2008 15:43:07 -0400 Received: from mta-out.inet.fi ([195.156.147.13]:41181 helo=jenni2.inet.fi) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KZ9sA-0001of-Km for grub-devel@gnu.org; Fri, 29 Aug 2008 15:43:07 -0400 Received: from [127.0.0.1] (88.193.32.97) by jenni2.inet.fi (8.5.014) id 489066C5016132D3 for grub-devel@gnu.org; Fri, 29 Aug 2008 22:43:05 +0300 Message-ID: <48B85151.3030408@nic.fi> Date: Fri, 29 Aug 2008 22:43:13 +0300 From: =?ISO-8859-1?Q?Vesa_J=E4=E4skel=E4inen?= User-Agent: Thunderbird 2.0.0.16 (Windows/20080708) MIME-Version: 1.0 To: The development of GRUB 2 References: <87d4jsgfpz.fsf@xs4all.nl> <48B80E7E.1070300@nic.fi> <878wufj1qm.fsf@xs4all.nl> In-Reply-To: <878wufj1qm.fsf@xs4all.nl> X-Enigmail-Version: 0.95.7 Content-Type: multipart/mixed; boundary="------------060005020604090002000006" X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Subject: Re: Handlers X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 29 Aug 2008 19:43:09 -0000 This is a multi-part message in MIME format. --------------060005020604090002000006 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-Printable Marco Gerards wrote: > If I knew a better way, I would have used it. I think the > alternatives will all end up in either code duplication or a loss of > type safety that now is at least present through warnings. But please > understand that you only have to use the macros, not change them :-) >=20 > Suggestions are welcome. Hi, Well... How about something like this? It only requires one cast and no macros at all. Thanks, Vesa J=E4=E4skel=E4inen --------------060005020604090002000006 Content-Type: text/plain; name="list.c" Content-Disposition: inline; filename="list.c" Content-Transfer-Encoding: 7Bit #include #include #include typedef struct grub_list { struct grub_list *next; } grub_list_t; typedef struct { /* Has to be first */ grub_list_t entry; /* Just some data */ char name[32]; } grub_fs_t; void grub_list_add(grub_list_t **list, grub_list_t *item) { item->next = *list; *list = item; } void grub_list_remove(grub_list_t **list, grub_list_t *item) { grub_list_t *prev = 0; grub_list_t *tmp = *list; while (tmp) { if (tmp == item) { if (! prev) { *list = tmp->next; tmp->next = 0; return; } else { prev->next = tmp->next; tmp->next = 0; return; } } prev = tmp; tmp = tmp->next; } } int grub_list_iterate(grub_list_t *list, int (*hook) (const grub_list_t *item)) { while (list) { if (hook(list)) return 1; list = list->next; } return 0; } int grub_fs_print (const grub_list_t *list_item) { grub_fs_t *item = (grub_fs_t *)list_item; printf("'%s'\n", item->name); return 0; } int main() { grub_fs_t item1; grub_fs_t item2; grub_fs_t item3; grub_list_t *fs_list = 0; memset(&item1, 0, sizeof(item1)); memset(&item2, 0, sizeof(item2)); memset(&item3, 0, sizeof(item3)); strcpy(item1.name, "item 1"); strcpy(item2.name, "item 2"); strcpy(item3.name, "item 3"); grub_list_add(&fs_list, &item1.entry); grub_list_add(&fs_list, &item2.entry); grub_list_add(&fs_list, &item3.entry); printf("---\n"); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); grub_list_remove(&fs_list, &item2.entry); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); grub_list_remove(&fs_list, &item2.entry); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); grub_list_remove(&fs_list, &item1.entry); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); grub_list_remove(&fs_list, &item3.entry); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); grub_list_remove(&fs_list, &item3.entry); grub_list_iterate(fs_list, grub_fs_print); printf("---\n"); return 0; } --------------060005020604090002000006--