Line data Source code
1 : /* list.c - Functions for manipulating linked lists of objects. */ 2 : 3 : /* Copyright (C) 1996-2009 Free Software Foundation, Inc. 4 : 5 : This file is part of GNU Bash, the Bourne Again SHell. 6 : 7 : Bash is free software: you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation, either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : Bash is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with Bash. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include "config.h" 22 : 23 : #if defined (HAVE_UNISTD_H) 24 : # ifdef _MINIX 25 : # include <sys/types.h> 26 : # endif 27 : # include <unistd.h> 28 : #endif 29 : 30 : #include "shell.h" 31 : 32 : /* A global variable which acts as a sentinel for an `error' list return. */ 33 : GENERIC_LIST global_error_list; 34 : 35 : #ifdef INCLUDE_UNUSED 36 : /* Call FUNCTION on every member of LIST, a generic list. */ 37 : void 38 : list_walk (list, function) 39 : GENERIC_LIST *list; 40 : sh_glist_func_t *function; 41 : { 42 : for ( ; list; list = list->next) 43 : if ((*function) (list) < 0) 44 : return; 45 : } 46 : 47 : /* Call FUNCTION on every string in WORDS. */ 48 : void 49 : wlist_walk (words, function) 50 : WORD_LIST *words; 51 : sh_icpfunc_t *function; 52 : { 53 : for ( ; words; words = words->next) 54 : if ((*function) (words->word->word) < 0) 55 : return; 56 : } 57 : #endif /* INCLUDE_UNUSED */ 58 : 59 : /* Reverse the chain of structures in LIST. Output the new head 60 : of the chain. You should always assign the output value of this 61 : function to something, or you will lose the chain. */ 62 : GENERIC_LIST * 63 470040056 : list_reverse (list) 64 : GENERIC_LIST *list; 65 : { 66 470040056 : register GENERIC_LIST *next, *prev; 67 : 68 1957319659 : for (prev = (GENERIC_LIST *)NULL; list; ) 69 : { 70 1487279603 : next = list->next; 71 1487279603 : list->next = prev; 72 1487279603 : prev = list; 73 1487279603 : list = next; 74 : } 75 470040056 : return (prev); 76 : } 77 : 78 : /* Return the number of elements in LIST, a generic list. */ 79 : int 80 25677799 : list_length (list) 81 : GENERIC_LIST *list; 82 : { 83 25677799 : register int i; 84 : 85 102792881 : for (i = 0; list; list = list->next, i++); 86 25677799 : return (i); 87 : } 88 : 89 : /* Append TAIL to HEAD. Return the header of the list. */ 90 : GENERIC_LIST * 91 163700420 : list_append (head, tail) 92 : GENERIC_LIST *head, *tail; 93 : { 94 163700420 : register GENERIC_LIST *t_head; 95 : 96 163700420 : if (head == 0) 97 : return (tail); 98 : 99 164195859 : for (t_head = head; t_head->next; t_head = t_head->next) 100 : ; 101 163664767 : t_head->next = tail; 102 163664767 : return (head); 103 : } 104 : 105 : #ifdef INCLUDE_UNUSED 106 : /* Delete the element of LIST which satisfies the predicate function COMPARER. 107 : Returns the element that was deleted, so you can dispose of it, or -1 if 108 : the element wasn't found. COMPARER is called with the list element and 109 : then ARG. Note that LIST contains the address of a variable which points 110 : to the list. You might call this function like this: 111 : 112 : SHELL_VAR *elt = list_remove (&variable_list, check_var_has_name, "foo"); 113 : dispose_variable (elt); 114 : */ 115 : GENERIC_LIST * 116 : list_remove (list, comparer, arg) 117 : GENERIC_LIST **list; 118 : Function *comparer; 119 : char *arg; 120 : { 121 : register GENERIC_LIST *prev, *temp; 122 : 123 : for (prev = (GENERIC_LIST *)NULL, temp = *list; temp; prev = temp, temp = temp->next) 124 : { 125 : if ((*comparer) (temp, arg)) 126 : { 127 : if (prev) 128 : prev->next = temp->next; 129 : else 130 : *list = temp->next; 131 : return (temp); 132 : } 133 : } 134 : return ((GENERIC_LIST *)&global_error_list); 135 : } 136 : #endif