/* Copyright 2015-2023 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include "counter.h" #include "parser.h" void counter_push (COUNTER *c, ELEMENT *elt, int num) { if (c->nvalues >= c->space - 1) { c->space += 5; c->values = realloc (c->values, c->space * sizeof (int)); c->elts = realloc (c->elts, c->space * sizeof (ELEMENT *)); if (!c->values) fatal ("could not realloc"); } c->values[c->nvalues] = num; c->elts[c->nvalues] = elt; c->nvalues++; c->values[c->nvalues] = 0; c->elts[c->nvalues] = 0; } void counter_pop (COUNTER *c) { if (!c->nvalues) fatal ("could not realloc"); c->nvalues--; c->values[c->nvalues] = 0; c->elts[c->nvalues] = 0; } void counter_inc (COUNTER *c) { c->values[c->nvalues - 1]++; } void counter_dec (COUNTER *c) { c->values[c->nvalues - 1]--; } /* Return value of counter if the top counter is for element ELT, otherwise return -1. */ int counter_value (COUNTER *c, ELEMENT *elt) { if (c->nvalues > 0 && c->elts[c->nvalues - 1] == elt) return c->values[c->nvalues - 1]; else return -1; }