Imported Upstream version 2.6
[platform/upstream/bison.git] / src / InadequacyList.c
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 *
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
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
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 *
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
74 InadequacyList__prependTo (InadequacyList *self, InadequacyList **list)
75 {
76   InadequacyList *head_old = *list;
77   *list = self;
78   self->next = head_old;
79 }