gnulib: update
[bison.git] / src / InadequacyList.c
blobc958f8226dd0a44c6f8dbdafdab2849eedddebfe
1 /* IELR's inadequacy list.
3 Copyright (C) 2009-2015, 2018-2021 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
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.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <https://www.gnu.org/licenses/>. */
20 #include <config.h>
21 #include "system.h"
23 #include "InadequacyList.h"
25 #include <intprops.h>
27 ContributionIndex const ContributionIndex__none = -1;
28 ContributionIndex const ContributionIndex__error_action = -2;
30 InadequacyList *
31 InadequacyList__new_conflict (state *manifesting_state, symbol *token,
32 bitset actions,
33 InadequacyListNodeCount *node_count)
35 InadequacyList *result = xmalloc (sizeof *result);
36 result->id = *node_count;
37 IGNORE_TYPE_LIMITS_BEGIN
38 if (INT_ADD_WRAPV (*node_count, 1, node_count))
39 aver (false);
40 IGNORE_TYPE_LIMITS_END
41 result->next = NULL;
42 result->manifestingState = manifesting_state;
43 result->contributionCount = bitset_count (actions);
44 result->inadequacy.conflict.token = token;
45 result->inadequacy.conflict.actions = actions;
46 return result;
49 void
50 InadequacyList__delete (InadequacyList *self)
52 while (self)
54 InadequacyList *node = self;
55 self = self->next;
56 bitset_free (node->inadequacy.conflict.actions);
57 free (node);
61 ContributionIndex
62 InadequacyList__getShiftContributionIndex (InadequacyList const *self)
64 if (!bitset_test (self->inadequacy.conflict.actions,
65 self->manifestingState->reductions->num))
66 return ContributionIndex__none;
67 return self->contributionCount - 1;
70 symbol *
71 InadequacyList__getContributionToken (InadequacyList const *self,
72 ContributionIndex i)
74 aver (0 <= i && i < self->contributionCount); (void) i;
75 return self->inadequacy.conflict.token;
78 void
79 InadequacyList__prependTo (InadequacyList *self, InadequacyList **list)
81 InadequacyList *head_old = *list;
82 *list = self;
83 self->next = head_old;