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 33symbol_list * 34symbol_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 60void 61symbol_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 77symbol_list * 78symbol_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 90void 91symbol_list_free (symbol_list *list) 92{ 93 LIST_FREE (symbol_list, list); 94} 95 96 97/*--------------------. 98| Return its length. | 99`--------------------*/ 100 101unsigned int 102symbol_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 115symbol_list * 116symbol_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 139uniqstr 140symbol_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 156void 157symbol_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