1*e4b17023SJohn Marino /* Generic single linked list to keep various information
2*e4b17023SJohn Marino Copyright (C) 1993, 1994, 1996, 2009, 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino Contributed by Kresten Krab Thorup.
4*e4b17023SJohn Marino
5*e4b17023SJohn Marino This file is part of GCC.
6*e4b17023SJohn Marino
7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify
8*e4b17023SJohn Marino it under the terms of the GNU General Public License as published by
9*e4b17023SJohn Marino the Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino any later version.
11*e4b17023SJohn Marino
12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*e4b17023SJohn Marino GNU General Public License for more details.
16*e4b17023SJohn Marino
17*e4b17023SJohn Marino Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino
21*e4b17023SJohn Marino You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
25*e4b17023SJohn Marino
26*e4b17023SJohn Marino #ifndef __GNU_OBJC_LIST_H
27*e4b17023SJohn Marino #define __GNU_OBJC_LIST_H
28*e4b17023SJohn Marino
29*e4b17023SJohn Marino struct objc_list
30*e4b17023SJohn Marino {
31*e4b17023SJohn Marino void *head;
32*e4b17023SJohn Marino struct objc_list *tail;
33*e4b17023SJohn Marino };
34*e4b17023SJohn Marino
35*e4b17023SJohn Marino /* Return a cons cell produced from (head . tail). */
36*e4b17023SJohn Marino static inline struct objc_list*
list_cons(void * head,struct objc_list * tail)37*e4b17023SJohn Marino list_cons (void* head, struct objc_list* tail)
38*e4b17023SJohn Marino {
39*e4b17023SJohn Marino struct objc_list* cell;
40*e4b17023SJohn Marino
41*e4b17023SJohn Marino cell = (struct objc_list*)objc_malloc (sizeof (struct objc_list));
42*e4b17023SJohn Marino cell->head = head;
43*e4b17023SJohn Marino cell->tail = tail;
44*e4b17023SJohn Marino return cell;
45*e4b17023SJohn Marino }
46*e4b17023SJohn Marino
47*e4b17023SJohn Marino /* Remove the element at the head by replacing it by its
48*e4b17023SJohn Marino successor. */
49*e4b17023SJohn Marino static inline void
list_remove_head(struct objc_list ** list)50*e4b17023SJohn Marino list_remove_head (struct objc_list** list)
51*e4b17023SJohn Marino {
52*e4b17023SJohn Marino if ((*list)->tail)
53*e4b17023SJohn Marino {
54*e4b17023SJohn Marino /* Fetch next. */
55*e4b17023SJohn Marino struct objc_list* tail = (*list)->tail;
56*e4b17023SJohn Marino
57*e4b17023SJohn Marino /* Copy next to list head. */
58*e4b17023SJohn Marino *(*list) = *tail;
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino /* Free next. */
61*e4b17023SJohn Marino objc_free (tail);
62*e4b17023SJohn Marino }
63*e4b17023SJohn Marino else
64*e4b17023SJohn Marino {
65*e4b17023SJohn Marino /* Inly one element in list. */
66*e4b17023SJohn Marino objc_free (*list);
67*e4b17023SJohn Marino (*list) = 0;
68*e4b17023SJohn Marino }
69*e4b17023SJohn Marino }
70*e4b17023SJohn Marino
71*e4b17023SJohn Marino
72*e4b17023SJohn Marino /* Map FUNCTION over all elements in LIST. */
73*e4b17023SJohn Marino static inline void
list_mapcar(struct objc_list * list,void (* function)(void *))74*e4b17023SJohn Marino list_mapcar (struct objc_list* list, void(*function)(void*))
75*e4b17023SJohn Marino {
76*e4b17023SJohn Marino while (list)
77*e4b17023SJohn Marino {
78*e4b17023SJohn Marino (*function) (list->head);
79*e4b17023SJohn Marino list = list->tail;
80*e4b17023SJohn Marino }
81*e4b17023SJohn Marino }
82*e4b17023SJohn Marino
83*e4b17023SJohn Marino /* Free list (backwards recursive). */
84*e4b17023SJohn Marino static inline void
list_free(struct objc_list * list)85*e4b17023SJohn Marino list_free (struct objc_list* list)
86*e4b17023SJohn Marino {
87*e4b17023SJohn Marino if(list)
88*e4b17023SJohn Marino {
89*e4b17023SJohn Marino list_free (list->tail);
90*e4b17023SJohn Marino objc_free (list);
91*e4b17023SJohn Marino }
92*e4b17023SJohn Marino }
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino #endif /* not __GNU_OBJC_LIST_H */
95