* src/LR0.c: Use them.
* src/output.c (free_itemsets, free_reductions, free_shifts):
Remove, replaced by LIST_FREE.
+2001-11-19 Akim Demaille <akim@epita.fr>
+
+ * src/system.h (LIST_FREE, shortcpy): New.
+ * src/LR0.c: Use them.
+ * src/output.c (free_itemsets, free_reductions, free_shifts):
+ Remove, replaced by LIST_FREE.
+
+
2001-11-19 Akim Demaille <akim@epita.fr>
* src/state.h (CORE_ALLOC, SHIFTS_ALLOC, ERRS_ALLOC)
{
int n;
core *p;
- short *isp1;
- short *isp2;
- short *iend;
#if TRACE
fprintf (stderr, "Entering new_state, symbol = %d, state = %d\n",
if (nstates >= MAXSHORT)
fatal (_("too many states (max %d)"), MAXSHORT);
- isp1 = kernel_base[symbol];
- iend = kernel_end[symbol];
- n = iend - isp1;
+ n = kernel_end[symbol] - kernel_base[symbol];
p = CORE_ALLOC (n);
p->accessing_symbol = symbol;
p->number = nstates;
p->nitems = n;
- isp2 = p->items;
- while (isp1 < iend)
- *isp2++ = *isp1++;
+ shortcpy (p->items, kernel_base[symbol], n);
last_state->next = p;
last_state = p;
save_shifts (void)
{
shifts *p;
- short *sp1;
- short *sp2;
- short *send;
p = SHIFTS_ALLOC (nshifts);
p->number = this_state->number;
p->nshifts = nshifts;
- sp1 = shiftset;
- sp2 = p->shifts;
- send = shiftset + nshifts;
-
- while (sp1 < send)
- *sp2++ = *sp1++;
+ shortcpy (p->shifts, shiftset, nshifts);
if (last_shift)
{
save_reductions (void)
{
short *isp;
- short *rp1;
- short *rp2;
int item;
int count;
reductions *p;
p->number = this_state->number;
p->nreds = count;
- rp1 = redset;
- rp2 = p->rules;
- rend = rp1 + count;
-
- for (/* nothing */; rp1 < rend; ++rp1, ++rp2)
- *rp2 = *rp1;
+ shortcpy (p->rules, redset, count);
if (last_reduction)
{
/* Free LOOKBACK. */
for (i = 0; i < state_table[nstates].lookaheads; i++)
- {
- shorts *sptmp;
- for (sp = lookback[i]; sp; sp = sptmp)
- {
- sptmp = sp->next;
- XFREE (sp);
- }
- }
+ LIST_FREE (shorts, lookback[i]);
XFREE (lookback);
XFREE (F);
}
-static void
-free_shifts (void)
-{
- shifts *sp, *sptmp; /* JF derefrenced freed ptr */
-
- for (sp = first_shift; sp; sp = sptmp)
- {
- sptmp = sp->next;
- XFREE (sp);
- }
-}
-
-
-static void
-free_reductions (void)
-{
- reductions *rp, *rptmp; /* JF fixed freed ptr */
-
- for (rp = first_reduction; rp; rp = rptmp)
- {
- rptmp = rp->next;
- XFREE (rp);
- }
-}
-
-
-
static void
save_column (int symbol, int default_state)
{
width = XCALLOC (short, nvectors);
token_actions ();
- free_shifts ();
- free_reductions ();
+ LIST_FREE (shifts, first_shift);
+ LIST_FREE (reductions, first_reduction);
XFREE (LA);
XFREE (LAruleno);
}
-static void
-free_itemsets (void)
-{
- core *cp, *cptmp;
- for (cp = first_state; cp; cp = cptmp)
- {
- cptmp = cp->next;
- XFREE (cp);
- }
-}
-
/* FIXME. */
#define MUSCLE_INSERT_INT(Key, Value) \
{
obstack_init (&output_obstack);
- free_itemsets ();
+ LIST_FREE (core, first_state);
output_token_translations ();
output_gram ();
#endif
+/* As memcpy, but for shorts. */
+#define shortcpy(Dest, Src, Num) \
+ memcpy (Dest, Src, Num * sizeof (short))
+
+/* Free a linked list. */
+#define LIST_FREE(Type, List) \
+do { \
+ Type *_node, *_next; \
+ for (_node = List; _node; _node = _next) \
+ { \
+ _next = _node->next; \
+ XFREE (_node); \
+ } \
+} while (0)
+
/*---------------------------------.
| Debugging the memory allocator. |
`---------------------------------*/