]> git.saurik.com Git - bison.git/blame - src/symlist.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / symlist.c
CommitLineData
56c47203 1/* Lists of symbols for Bison
17ee7397 2
34136e65 3 Copyright (C) 2002, 2005-2007, 2009-2012 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;
affac613 39
6ec2c0f2 40 res->midrule = NULL;
ffa4ba3a
JD
41 res->midrule_parent_rule = NULL;
42 res->midrule_parent_rhs_index = 0;
84866159 43
f6857bbf 44 code_props_none_init (&res->action_props);
affac613 45
56c47203 46 res->ruleprec = NULL;
676385e2
PH
47 res->dprec = 0;
48 res->merger = 0;
affac613 49
b9f1d9a4
AR
50 res->named_ref = NULL;
51
affac613
AD
52 res->next = NULL;
53
56c47203
AD
54 return res;
55}
56
57
3be03b13
JD
58/*--------------------------------------------.
59| Create a list containing TYPE_NAME at LOC. |
60`--------------------------------------------*/
61
62symbol_list *
63symbol_list_type_new (uniqstr type_name, location loc)
64{
65 symbol_list *res = xmalloc (sizeof *res);
66
67 res->content_type = SYMLIST_TYPE;
9641b918
VS
68 res->content.sem_type = xmalloc (sizeof (semantic_type));
69 res->content.sem_type->tag = type_name;
70 res->content.sem_type->location = loc;
71 res->content.sem_type->status = undeclared;
72
b9f1d9a4
AR
73 res->location = res->sym_loc = loc;
74 res->named_ref = NULL;
3be03b13
JD
75 res->next = NULL;
76
77 return res;
78}
79
80
3be03b13
JD
81/*-----------------------------------------------------------------------.
82| Print this list, for which every content_type must be SYMLIST_SYMBOL. |
83`-----------------------------------------------------------------------*/
867a3e00
AD
84
85void
3be03b13 86symbol_list_syms_print (const symbol_list *l, FILE *f)
867a3e00 87{
3be03b13 88 for (/* Nothing. */; l && l->content.sym; l = l->next)
22dda0f0 89 {
3be03b13 90 symbol_print (l->content.sym, f);
f6857bbf 91 fprintf (stderr, l->action_props.is_value_used ? " used" : " unused");
3be03b13 92 if (l && l->content.sym)
e9690142 93 fprintf (f, ", ");
22dda0f0 94 }
867a3e00
AD
95}
96
97
3be03b13
JD
98/*---------------------------.
99| Prepend NODE to the LIST. |
100`---------------------------*/
56c47203 101
17ee7397 102symbol_list *
3be03b13 103symbol_list_prepend (symbol_list *list, symbol_list *node)
56c47203 104{
3be03b13
JD
105 node->next = list;
106 return node;
56c47203
AD
107}
108
109
3be03b13
JD
110/*-----------------------------------------------.
111| Free the LIST, but not the items it contains. |
112`-----------------------------------------------*/
56c47203
AD
113
114void
17ee7397 115symbol_list_free (symbol_list *list)
56c47203 116{
13cdf208
AR
117 symbol_list *node, *next;
118 for (node = list; node; node = next)
119 {
120 next = node->next;
a4d1bf6a 121 named_ref_free (node->named_ref);
13cdf208
AR
122 free (node);
123 }
56c47203
AD
124}
125
126
dafdc66f
AD
127/*--------------------.
128| Return its length. |
129`--------------------*/
130
b37acfe1
PE
131int
132symbol_list_length (symbol_list const *l)
dafdc66f
AD
133{
134 int res = 0;
3be03b13
JD
135 for (/* Nothing. */;
136 l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL);
137 l = l->next)
dafdc66f
AD
138 ++res;
139 return res;
140}
141
142
3be03b13
JD
143/*------------------------------.
144| Get item N in symbol list L. |
145`------------------------------*/
affac613
AD
146
147symbol_list *
148symbol_list_n_get (symbol_list *l, int n)
149{
150 int i;
151
152 if (n < 0)
153 return NULL;
154
155 for (i = 0; i < n; ++i)
156 {
157 l = l->next;
3be03b13
JD
158 if (l == NULL
159 || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL))
e9690142 160 return NULL;
affac613
AD
161 }
162
163 return l;
164}
165
166
56c47203
AD
167/*--------------------------------------------------------------.
168| Get the data type (alternative in the union) of the value for |
affac613 169| symbol N in symbol list L. |
56c47203
AD
170`--------------------------------------------------------------*/
171
17ee7397 172uniqstr
affac613 173symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
56c47203 174{
affac613
AD
175 l = symbol_list_n_get (l, n);
176 if (!l)
56c47203 177 {
bb8e56ff 178 complain (&loc, complaint, _("invalid $ value: $%d"), n);
56c47203
AD
179 return NULL;
180 }
4f82b42a 181 aver (l->content_type == SYMLIST_SYMBOL);
3be03b13 182 return l->content.sym->type_name;
affac613 183}
56c47203 184
872b52bc 185bool
676997e5 186symbol_list_null (symbol_list *node)
872b52bc
AR
187{
188 return !node ||
189 (node->content_type == SYMLIST_SYMBOL && !(node->content.sym));
190}
56c47203 191
3be03b13 192void
71da68b3 193symbol_list_code_props_set (symbol_list *node, code_props_type kind,
4323e0da 194 code_props const *cprops)
3be03b13
JD
195{
196 switch (node->content_type)
197 {
3edfae04
AD
198 case SYMLIST_SYMBOL:
199 symbol_code_props_set (node->content.sym, kind, cprops);
200 if (node->content.sym->status == undeclared)
201 node->content.sym->status = used;
202 break;
203 case SYMLIST_TYPE:
204 semantic_type_code_props_set
205 (semantic_type_get (node->content.sem_type->tag,
206 &node->content.sem_type->location),
207 kind, cprops);
208 if (node->content.sem_type->status == undeclared)
209 node->content.sem_type->status = used;
210 break;
3be03b13
JD
211 }
212}