]> git.saurik.com Git - bison.git/blame - src/symlist.c
symtab: fix some leaks
[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);
ae9c90ba
TR
122 if (node->content_type == SYMLIST_TYPE)
123 free (node->content.sem_type);
13cdf208
AR
124 free (node);
125 }
56c47203
AD
126}
127
128
dafdc66f
AD
129/*--------------------.
130| Return its length. |
131`--------------------*/
132
b37acfe1
PE
133int
134symbol_list_length (symbol_list const *l)
dafdc66f
AD
135{
136 int res = 0;
3be03b13
JD
137 for (/* Nothing. */;
138 l && !(l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL);
139 l = l->next)
dafdc66f
AD
140 ++res;
141 return res;
142}
143
144
3be03b13
JD
145/*------------------------------.
146| Get item N in symbol list L. |
147`------------------------------*/
affac613
AD
148
149symbol_list *
150symbol_list_n_get (symbol_list *l, int n)
151{
152 int i;
153
154 if (n < 0)
155 return NULL;
156
157 for (i = 0; i < n; ++i)
158 {
159 l = l->next;
3be03b13
JD
160 if (l == NULL
161 || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL))
e9690142 162 return NULL;
affac613
AD
163 }
164
165 return l;
166}
167
168
56c47203
AD
169/*--------------------------------------------------------------.
170| Get the data type (alternative in the union) of the value for |
affac613 171| symbol N in symbol list L. |
56c47203
AD
172`--------------------------------------------------------------*/
173
17ee7397 174uniqstr
affac613 175symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
56c47203 176{
affac613
AD
177 l = symbol_list_n_get (l, n);
178 if (!l)
56c47203 179 {
bb8e56ff 180 complain (&loc, complaint, _("invalid $ value: $%d"), n);
56c47203
AD
181 return NULL;
182 }
4f82b42a 183 aver (l->content_type == SYMLIST_SYMBOL);
3be03b13 184 return l->content.sym->type_name;
affac613 185}
56c47203 186
872b52bc 187bool
676997e5 188symbol_list_null (symbol_list *node)
872b52bc
AR
189{
190 return !node ||
191 (node->content_type == SYMLIST_SYMBOL && !(node->content.sym));
192}
56c47203 193
3be03b13 194void
71da68b3 195symbol_list_code_props_set (symbol_list *node, code_props_type kind,
4323e0da 196 code_props const *cprops)
3be03b13
JD
197{
198 switch (node->content_type)
199 {
3edfae04
AD
200 case SYMLIST_SYMBOL:
201 symbol_code_props_set (node->content.sym, kind, cprops);
202 if (node->content.sym->status == undeclared)
203 node->content.sym->status = used;
204 break;
205 case SYMLIST_TYPE:
206 semantic_type_code_props_set
207 (semantic_type_get (node->content.sem_type->tag,
208 &node->content.sem_type->location),
209 kind, cprops);
210 if (node->content.sem_type->status == undeclared)
211 node->content.sem_type->status = used;
212 break;
3be03b13
JD
213 }
214}