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