1 /* Lists of symbols for Bison 2 3 Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. 4 5 This file is part of Bison, the GNU Compiler Compiler. 6 7 Bison 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 2, or (at your option) 10 any later version. 11 12 Bison 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 Bison; see the file COPYING. If not, write to 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20 Boston, MA 02110-1301, USA. */ 21 22 #include <config.h> 23 #include "system.h" 24 25 #include "complain.h" 26 #include "symlist.h" 27 28 29 /*--------------------------------------. 30 | Create a list containing SYM at LOC. | 31 `--------------------------------------*/ 32 33 symbol_list * 34 symbol_list_new (symbol *sym, location loc) 35 { 36 symbol_list *res = xmalloc (sizeof *res); 37 38 res->sym = sym; 39 res->location = loc; 40 41 res->midrule = NULL; 42 43 res->action = NULL; 44 res->used = false; 45 46 res->ruleprec = NULL; 47 res->dprec = 0; 48 res->merger = 0; 49 50 res->next = NULL; 51 52 return res; 53 } 54 55 56 /*------------------. 57 | Print this list. | 58 `------------------*/ 59 60 void 61 symbol_list_print (const symbol_list *l, FILE *f) 62 { 63 for (/* Nothing. */; l && l->sym; l = l->next) 64 { 65 symbol_print (l->sym, f); 66 fprintf (stderr, l->used ? " used" : " unused"); 67 if (l && l->sym) 68 fprintf (f, ", "); 69 } 70 } 71 72 73 /*---------------------------------. 74 | Prepend SYM at LOC to the LIST. | 75 `---------------------------------*/ 76 77 symbol_list * 78 symbol_list_prepend (symbol_list *list, symbol *sym, location loc) 79 { 80 symbol_list *res = symbol_list_new (sym, loc); 81 res->next = list; 82 return res; 83 } 84 85 86 /*-------------------------------------------------. 87 | Free the LIST, but not the symbols it contains. | 88 `-------------------------------------------------*/ 89 90 void 91 symbol_list_free (symbol_list *list) 92 { 93 LIST_FREE (symbol_list, list); 94 } 95 96 97 /*--------------------. 98 | Return its length. | 99 `--------------------*/ 100 101 unsigned int 102 symbol_list_length (const symbol_list *l) 103 { 104 int res = 0; 105 for (/* Nothing. */; l; l = l->next) 106 ++res; 107 return res; 108 } 109 110 111 /*--------------------------------. 112 | Get symbol N in symbol list L. | 113 `--------------------------------*/ 114 115 symbol_list * 116 symbol_list_n_get (symbol_list *l, int n) 117 { 118 int i; 119 120 if (n < 0) 121 return NULL; 122 123 for (i = 0; i < n; ++i) 124 { 125 l = l->next; 126 if (l == NULL || l->sym == NULL) 127 return NULL; 128 } 129 130 return l; 131 } 132 133 134 /*--------------------------------------------------------------. 135 | Get the data type (alternative in the union) of the value for | 136 | symbol N in symbol list L. | 137 `--------------------------------------------------------------*/ 138 139 uniqstr 140 symbol_list_n_type_name_get (symbol_list *l, location loc, int n) 141 { 142 l = symbol_list_n_get (l, n); 143 if (!l) 144 { 145 complain_at (loc, _("invalid $ value: $%d"), n); 146 return NULL; 147 } 148 return l->sym->type_name; 149 } 150 151 152 /*----------------------------------------. 153 | The symbol N in symbol list L is USED. | 154 `----------------------------------------*/ 155 156 void 157 symbol_list_n_used_set (symbol_list *l, int n, bool used) 158 { 159 l = symbol_list_n_get (l, n); 160 if (l) 161 l->used = used; 162 } 163