1 /* IELR's inadequacy list.
2 
3    Copyright (C) 2009-2012 Free Software Foundation, Inc.
4 
5    This file is part of Bison, the GNU Compiler Compiler.
6 
7    This program 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 3 of the License, or
10    (at your option) any later version.
11 
12    This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include <config.h>
21 #include "system.h"
22 
23 #include "InadequacyList.h"
24 
25 ContributionIndex const ContributionIndex__none = -1;
26 ContributionIndex const ContributionIndex__error_action = -2;
27 
28 InadequacyList *
InadequacyList__new_conflict(state * manifesting_state,symbol * token,bitset actions,InadequacyListNodeCount * node_count)29 InadequacyList__new_conflict (state *manifesting_state, symbol *token,
30                               bitset actions,
31                               InadequacyListNodeCount *node_count)
32 {
33   InadequacyList *result = xmalloc (sizeof *result);
34   result->id = (*node_count)++;
35   aver (*node_count != 0);
36   result->next = NULL;
37   result->manifestingState = manifesting_state;
38   result->contributionCount = bitset_count (actions);
39   result->inadequacy.conflict.token = token;
40   result->inadequacy.conflict.actions = actions;
41   return result;
42 }
43 
44 void
InadequacyList__delete(InadequacyList * self)45 InadequacyList__delete (InadequacyList *self)
46 {
47   while (self)
48     {
49       InadequacyList *node = self;
50       self = self->next;
51       bitset_free (node->inadequacy.conflict.actions);
52       free (node);
53     }
54 }
55 
56 ContributionIndex
InadequacyList__getShiftContributionIndex(InadequacyList const * self)57 InadequacyList__getShiftContributionIndex (InadequacyList const *self)
58 {
59   if (!bitset_test (self->inadequacy.conflict.actions,
60                     self->manifestingState->reductions->num))
61     return ContributionIndex__none;
62   return self->contributionCount - 1;
63 }
64 
65 symbol *
InadequacyList__getContributionToken(InadequacyList const * self,ContributionIndex i)66 InadequacyList__getContributionToken (InadequacyList const *self,
67                                       ContributionIndex i)
68 {
69   aver (0 <= i && i < self->contributionCount);
70   return self->inadequacy.conflict.token;
71 }
72 
73 void
InadequacyList__prependTo(InadequacyList * self,InadequacyList ** list)74 InadequacyList__prependTo (InadequacyList *self, InadequacyList **list)
75 {
76   InadequacyList *head_old = *list;
77   *list = self;
78   self->next = head_old;
79 }
80