|
|
1.1 ! root 1: /* Generic single linked list to keep various information ! 2: Copyright (C) 1993 Free Software Foundation, Inc. ! 3: ! 4: Author: Kresten Krab Thorup ! 5: ! 6: This file is part of GNU CC. ! 7: ! 8: GNU CC is free software; you can redistribute it and/or modify it under the ! 9: terms of the GNU General Public License as published by the Free Software ! 10: Foundation; either version 2, or (at your option) any later version. ! 11: ! 12: GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY ! 13: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ! 14: FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ! 15: details. ! 16: ! 17: You should have received a copy of the GNU General Public License along with ! 18: GNU CC; see the file COPYING. If not, write to the Free Software ! 19: Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 20: ! 21: /* As a special exception, if you link this library with files compiled with ! 22: GCC to produce an executable, this does not cause the resulting executable ! 23: to be covered by the GNU General Public License. This exception does not ! 24: however invalidate any other reasons why the executable file might be ! 25: covered by the GNU General Public License. */ ! 26: ! 27: void * __objc_xrealloc (void *optr, size_t size); ! 28: void * __objc_xmalloc (size_t size); ! 29: ! 30: struct objc_list { ! 31: void *head; ! 32: struct objc_list *tail; ! 33: }; ! 34: ! 35: /* Return a cons cell produced from (head . tail) */ ! 36: ! 37: static inline struct objc_list* ! 38: list_cons(void* head, struct objc_list* tail) ! 39: { ! 40: struct objc_list* cell; ! 41: ! 42: cell = (struct objc_list*)__objc_xmalloc(sizeof(struct objc_list)); ! 43: cell->head = head; ! 44: cell->tail = tail; ! 45: return cell; ! 46: } ! 47: ! 48: /* Return the length of a list, list_length(NULL) returns zero */ ! 49: ! 50: static inline int ! 51: list_length(struct objc_list* list) ! 52: { ! 53: int i = 0; ! 54: while(list) ! 55: { ! 56: i += 1; ! 57: list = list->tail; ! 58: } ! 59: return i; ! 60: } ! 61: ! 62: /* Return the Nth element of LIST, where N count from zero. If N ! 63: larger than the list length, NULL is returned */ ! 64: ! 65: static inline void* ! 66: list_nth(int index, struct objc_list* list) ! 67: { ! 68: while(index-- != 0) ! 69: { ! 70: if(list->tail) ! 71: list = list->tail; ! 72: else ! 73: return 0; ! 74: } ! 75: return list->head; ! 76: } ! 77: ! 78: /* Remove the element at the head by replacing it by its successor */ ! 79: ! 80: static inline void ! 81: list_remove_head(struct objc_list** list) ! 82: { ! 83: if ((*list)->tail) ! 84: { ! 85: struct objc_list* tail = (*list)->tail; /* fetch next */ ! 86: *(*list) = *tail; /* copy next to list head */ ! 87: free(tail); /* free next */ ! 88: } ! 89: else /* only one element in list */ ! 90: { ! 91: free (*list); ! 92: (*list) = 0; ! 93: } ! 94: } ! 95: ! 96: ! 97: /* Remove the element with `car' set to ELEMENT */ ! 98: ! 99: static inline void ! 100: list_remove_elem(struct objc_list** list, void* elem) ! 101: { ! 102: while (*list) { ! 103: if ((*list)->head == elem) ! 104: list_remove_head(list); ! 105: list = &((*list)->tail); ! 106: } ! 107: } ! 108: ! 109: /* Map FUNCTION over all elements in LIST */ ! 110: ! 111: static inline void ! 112: list_mapcar(struct objc_list* list, void(*function)(void*)) ! 113: { ! 114: while(list) ! 115: { ! 116: (*function)(list->head); ! 117: list = list->tail; ! 118: } ! 119: } ! 120: ! 121: /* Return element that has ELEM as car */ ! 122: ! 123: static inline struct objc_list** ! 124: list_find(struct objc_list** list, void* elem) ! 125: { ! 126: while(*list) ! 127: { ! 128: if ((*list)->head == elem) ! 129: return list; ! 130: list = &((*list)->tail); ! 131: } ! 132: return NULL; ! 133: } ! 134: ! 135: /* Free list (backwards recursive) */ ! 136: ! 137: static void ! 138: list_free(struct objc_list* list) ! 139: { ! 140: if(list) ! 141: { ! 142: list_free(list->tail); ! 143: free(list); ! 144: } ! 145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.