]> git.saurik.com Git - bison.git/blob - src/symlist.c
* data/m4sugar/m4sugar.m4 (m4_map): Recognize when the list of
[bison.git] / src / symlist.c
1 /* Lists of symbols for Bison
2 Copyright (C) 2002 Free Software Foundation, Inc.
3
4 This file is part of Bison, the GNU Compiler Compiler.
5
6 Bison is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 Bison is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Bison; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "system.h"
22 #include "complain.h"
23 #include "symlist.h"
24
25
26 /*----------------------------------------------.
27 | Create a list containing SYMBOL at LOCATION. |
28 `----------------------------------------------*/
29
30 symbol_list_t *
31 symbol_list_new (symbol_t *sym, location_t location)
32 {
33 symbol_list_t *res = XMALLOC (symbol_list_t, 1);
34 res->next = NULL;
35 res->sym = sym;
36 res->location = location;
37 res->action = NULL;
38 res->ruleprec = NULL;
39 return res;
40 }
41
42
43 /*-----------------------------------------.
44 | Prepend SYMBOL at LOCATION to the LIST. |
45 `-----------------------------------------*/
46
47 symbol_list_t *
48 symbol_list_prepend (symbol_list_t *list,
49 symbol_t *symbol, location_t location)
50 {
51 symbol_list_t *res = symbol_list_new (symbol, location);
52 res->next = list;
53 return res;
54 }
55
56
57 /*-------------------------------------------------.
58 | Free the LIST, but not the symbols it contains. |
59 `-------------------------------------------------*/
60
61 void
62 symbol_list_free (symbol_list_t *list)
63 {
64 LIST_FREE (symbol_list_t, list);
65 }
66
67
68 /*--------------------.
69 | Return its length. |
70 `--------------------*/
71
72 unsigned int
73 symbol_list_length (symbol_list_t *list)
74 {
75 int res = 0;
76 for (/* Nothing. */; list; list = list->next)
77 ++res;
78 return res;
79 }
80
81
82 /*--------------------------------------------------------------.
83 | Get the data type (alternative in the union) of the value for |
84 | symbol N in rule RULE. |
85 `--------------------------------------------------------------*/
86
87 char *
88 symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
89 {
90 int i;
91 symbol_list_t *rp;
92
93 if (n < 0)
94 {
95 complain_at (location, _("invalid $ value"));
96 return NULL;
97 }
98
99 rp = rule;
100 i = 0;
101
102 while (i < n)
103 {
104 rp = rp->next;
105 if (rp == NULL || rp->sym == NULL)
106 {
107 complain_at (location, _("invalid $ value"));
108 return NULL;
109 }
110 ++i;
111 }
112
113 return rp->sym->type_name;
114 }