]> git.saurik.com Git - bison.git/blame - src/symlist.c
muscle: minor refactoring
[bison.git] / src / symlist.c
CommitLineData
56c47203 1/* Lists of symbols for Bison
17ee7397 2
7d6bad19 3 Copyright (C) 2002, 2005-2007, 2009-2013 Free Software Foundation,
575619af 4 Inc.
56c47203
AD
5
6 This file is part of Bison, the GNU Compiler Compiler.
7
f16b0819 8 This program is free software: you can redistribute it and/or modify
56c47203 9 it under the terms of the GNU General Public License as published by
f16b0819
PE
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
56c47203 12
f16b0819 13 This program is distributed in the hope that it will be useful,
56c47203
AD
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
56c47203 20
2cec9080 21#include <config.h>
56c47203 22#include "system.h"
17ee7397 23
9280d3ef 24#include "complain.h"
56c47203
AD
25#include "symlist.h"
26
17ee7397
PE
27/*--------------------------------------.
28| Create a list containing SYM at LOC. |
29`--------------------------------------*/
56c47203 30
17ee7397 31symbol_list *
3be03b13 32symbol_list_sym_new (symbol *sym, location loc)
56c47203 33{
da2a7671 34 symbol_list *res = xmalloc (sizeof *res);
affac613 35
3be03b13
JD
36 res->content_type = SYMLIST_SYMBOL;
37 res->content.sym = sym;
b9f1d9a4 38 res->location = res->sym_loc = loc;
ec6dc437 39 res->named_ref = NULL;
affac613 40
6ec2c0f2 41 res->midrule = NULL;
ffa4ba3a
JD
42 res->midrule_parent_rule = NULL;
43 res->midrule_parent_rhs_index = 0;
84866159 44
ec6dc437 45 /* Members used for LHS only. */
56c47203 46 res->ruleprec = NULL;
ae2b48f5 47 res->percent_empty_loc = empty_location;
ec6dc437 48 code_props_none_init (&res->action_props);
676385e2 49 res->dprec = 0;
0fe5a72a 50 res->dprec_location = empty_location;
676385e2 51 res->merger = 0;
0fe5a72a 52 res->merger_declaration_location = empty_location;
affac613
AD
53
54 res->next = NULL;
55
56c47203
AD
56 return res;
57}
58
59
3be03b13
JD
60/*--------------------------------------------.
61| Create a list containing TYPE_NAME at LOC. |
62`--------------------------------------------*/
63
64symbol_list *
65symbol_list_type_new (uniqstr type_name, location loc)
66{
67 symbol_list *res = xmalloc (sizeof *res);
68
69 res->content_type = SYMLIST_TYPE;
9641b918
VS
70 res->content.sem_type = xmalloc (sizeof (semantic_type));
71 res->content.sem_type->tag = type_name;
72 res->content.sem_type->location = loc;
73 res->content.sem_type->status = undeclared;
74
b9f1d9a4
AR
75 res->location = res->sym_loc = loc;
76 res->named_ref = NULL;
3be03b13
JD
77 res->next = NULL;
78
79 return res;
80}
81
82
3be03b13
JD
83/*-----------------------------------------------------------------------.
84| Print this list, for which every content_type must be SYMLIST_SYMBOL. |
85`-----------------------------------------------------------------------*/
867a3e00
AD
86
87void
3be03b13 88symbol_list_syms_print (const symbol_list *l, FILE *f)
867a3e00 89{
848bcc28 90 char const *sep = "";
3be03b13 91 for (/* Nothing. */; l && l->content.sym; l = l->next)
22dda0f0 92 {
848bcc28
AD
93 fputs (sep, f);
94 fputs (l->content_type == SYMLIST_SYMBOL ? "symbol: "
95 : l->content_type == SYMLIST_TYPE ? "type: "
96 : "invalid content_type: ",
97 f);
3be03b13 98 symbol_print (l->content.sym, f);
848bcc28
AD
99 fputs (l->action_props.is_value_used ? " used" : " unused", f);
100 sep = ", ";
22dda0f0 101 }
867a3e00
AD
102}
103
104
3be03b13
JD
105/*---------------------------.
106| Prepend NODE to the LIST. |
107`---------------------------*/
56c47203 108
17ee7397 109symbol_list *
3be03b13 110symbol_list_prepend (symbol_list *list, symbol_list *node)
56c47203 111{
3be03b13
JD
112 node->next = list;
113 return node;
56c47203
AD
114}
115
116
93561c21
VT
117/*-------------------------.
118| Append NODE to the LIST. |
119`-------------------------*/
120
121symbol_list *
122symbol_list_append (symbol_list *list, symbol_list *node)
123{
124 if (!list)
125 return node;
126 symbol_list *next = list;
127 while (next->next)
128 next = next->next;
129 next->next = node;
130 return list;
131}
132
133
3be03b13
JD
134/*-----------------------------------------------.
135| Free the LIST, but not the items it contains. |
136`-----------------------------------------------*/
56c47203
AD
137
138void
17ee7397 139symbol_list_free (symbol_list *list)
56c47203 140{
13cdf208
AR
141 symbol_list *node, *next;
142 for (node = list; node; node = next)
143 {
144 next = node->next;
a4d1bf6a 145 named_ref_free (node->named_ref);
ae9c90ba
TR
146 if (node->content_type == SYMLIST_TYPE)
147 free (node->content.sem_type);
13cdf208
AR
148 free (node);
149 }
56c47203
AD
150}
151
152
dafdc66f
AD
153/*--------------------.
154| Return its length. |
155`--------------------*/
156
b37acfe1
PE
157int
158symbol_list_length (symbol_list const *l)
dafdc66f
AD
159{
160 int res = 0;
3be03b13
JD
161 for (/* Nothing. */;
162 l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL);
163 l = l->next)
dafdc66f
AD
164 ++res;
165 return res;
166}
167
168
3be03b13
JD
169/*------------------------------.
170| Get item N in symbol list L. |
171`------------------------------*/
affac613
AD
172
173symbol_list *
174symbol_list_n_get (symbol_list *l, int n)
175{
176 int i;
177
178 if (n < 0)
179 return NULL;
180
181 for (i = 0; i < n; ++i)
182 {
183 l = l->next;
3be03b13
JD
184 if (l == NULL
185 || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL))
e9690142 186 return NULL;
affac613
AD
187 }
188
189 return l;
190}
191
192
56c47203
AD
193/*--------------------------------------------------------------.
194| Get the data type (alternative in the union) of the value for |
affac613 195| symbol N in symbol list L. |
56c47203
AD
196`--------------------------------------------------------------*/
197
17ee7397 198uniqstr
affac613 199symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
56c47203 200{
affac613
AD
201 l = symbol_list_n_get (l, n);
202 if (!l)
56c47203 203 {
bb8e56ff 204 complain (&loc, complaint, _("invalid $ value: $%d"), n);
56c47203
AD
205 return NULL;
206 }
4f82b42a 207 aver (l->content_type == SYMLIST_SYMBOL);
3be03b13 208 return l->content.sym->type_name;
affac613 209}
56c47203 210
872b52bc 211bool
676997e5 212symbol_list_null (symbol_list *node)
872b52bc
AR
213{
214 return !node ||
215 (node->content_type == SYMLIST_SYMBOL && !(node->content.sym));
216}
56c47203 217
3be03b13 218void
71da68b3 219symbol_list_code_props_set (symbol_list *node, code_props_type kind,
4323e0da 220 code_props const *cprops)
3be03b13
JD
221{
222 switch (node->content_type)
223 {
3edfae04
AD
224 case SYMLIST_SYMBOL:
225 symbol_code_props_set (node->content.sym, kind, cprops);
226 if (node->content.sym->status == undeclared)
227 node->content.sym->status = used;
228 break;
229 case SYMLIST_TYPE:
230 semantic_type_code_props_set
231 (semantic_type_get (node->content.sem_type->tag,
232 &node->content.sem_type->location),
233 kind, cprops);
234 if (node->content.sem_type->status == undeclared)
235 node->content.sem_type->status = used;
236 break;
3be03b13
JD
237 }
238}