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