+2004-12-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ * src/system.h (CALLOC, MALLOC, REALLOC): Remove. All callers
+ changed to use xcalloc, xnmalloc, xnrealloc, respectively,
+ unless otherwise specified below.
+
+ * src/LR0.c (allocate_itemsets): Use xnmalloc, not xcalloc,
+ to allocate kernel_base, kernel_items, kernel_size, since
+ they needn't be initialized to 0.
+ (allocate_storgae): Likewise, for shiftset, redset, shift_symbol.
+ * src/closure.c (new_closure): Likewise, for itemset.
+ * src/derives.c (derives_compute): Likewise, for delts, derives, q.
+ * src/lalr.c (set_goto_map): Likewise, for temp_map.
+ (initialize_F): Likewise, for reads, edge, reads[i], includes[i].
+ (build_relations): Likewise for edge, states1, includes.
+ * src/nullable.c (nullable_compute): Likewise, for squeue, relts.
+ * src/reader.c (packgram): Likewise, for ritem, rules.
+ * src/reduce.c (nonterminals_reduce): Likewise for nontermmap.
+ * src/relation.c (relation_digraph): Likewise for VERTICES.
+ (relation_transpose): Likewise for new_R, end_R.
+ * src/symtab.c (symbols_token_translations_init): Likewise for
+ token_translations.
+ * src/tables.c (save_row): Likewise for froms, tos, conflict_tos.
+ (token_actions): Likewise for yydefact, actrow, conflrow,
+ conflict_list.
+ (save_column): Likewise for froms[symno], tos[symno].
+ (goto_actions): Likewise for state_count.
+ (pack_table): Likewise for base, pos, check.
+ (tables_generate): Likewise for width.
+
+ * src/LR0.c (set_states): Don't reuse kernel_size and kernel_base
+ for initial core. Just have a separate core, so we needn't worry
+ about whether kernel_size and kernel_base are initialized.
+
+ * src/LR0.c (shift_symbol, redset, shiftset, kernel_base,
+ kernel_size, kernel_items): Remove unnecessary initialization.
+ * src/conflicts.c (conflicts): Likewise.
+ * src/derives.c (derives): Likewise.
+ * src/muscle_tablc (muscle_insert): Likewise.
+ * src/relation.c (relation_digraph): Likewise.
+ * src/tables.c (froms, tos, conflict_tos, tally, width, actrow, order,
+ conflrow, conflict_table, conflict_list, table, check):
+ Likewise.
+
+ * src/closure.c (new_closure): Arg is of type unsigned int, not int.
+ This is because all callers pass unsigned int.
+ * src/closure.h (new_closure): Likewise.
+
+ * src/lalr.c (initialize_F): Initialize reads[i] in all cases.
+ (build_relations): Initialize includes[i] in all cases.
+ * src/reader.c (packgram): Always initialize rules[ruleno].prec
+ and rules[ruleno].precsym. Initialize members in order.
+ * src/relation.c (relation_transpose): Always initialize new_R[i]
+ and end_R[i].
+ * src/table.c (conflict_row): Initialize 0 at end of conflict_list.
+
+ * src/output.c (prepare_actions): Pass 0 instead of conflict_list[0];
+ conflict_list[0] was always 0, but now it isn't initialized.
+
+ * src/table.c (table_grow): When conflict_table grew, the grown
+ area wasn't cleared. Fix this.
+
+ * lib/.cvsignore: Add strdup.c, strdup.h.
+ * m4/.cvsignore: Add strdup.m4.
+
2004-12-07 Paul Eggert <eggert@cs.ucla.edu>
* src/lalr.h (GOTO_NUMBER_MAXIMUM): New macro.
/* Closures for Bison
- Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004 Free Software
+ Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
\f
void
-new_closure (int n)
+new_closure (unsigned int n)
{
- CALLOC (itemset, n);
+ itemset = xnmalloc (n, sizeof *itemset);
ruleset = bitset_create (nrules, BITSET_FIXED);
data so that closure can be called. n is the number of elements to
allocate for itemset. */
-void new_closure (int n);
+void new_closure (unsigned int n);
/* Given the kernel (aka core) of a state (a vector of item numbers
/* -1 stands for not specified. */
int expected_sr_conflicts = -1;
int expected_rr_conflicts = -1;
-static char *conflicts = NULL;
+static char *conflicts;
struct obstack solved_conflicts_obstack;
static bitset shift_set;
{
state_number i;
/* List of look-ahead tokens on which we explicitly raise a syntax error. */
- symbol **errors = MALLOC (errors, ntokens + 1);
+ symbol **errors = xnmalloc (ntokens + 1, sizeof *errors);
- CALLOC (conflicts, nstates);
+ conflicts = xcalloc (nstates, sizeof *conflicts);
shift_set = bitset_create (ntokens, BITSET_FIXED);
look_ahead_set = bitset_create (ntokens, BITSET_FIXED);
obstack_init (&solved_conflicts_obstack);
rule *value;
} rule_list;
-rule ***derives = NULL;
+rule ***derives;
static void
print_derives (void)
/* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
whose LHS is NTERM. */
- rule_list **dset = CALLOC (dset, nvars);
+ rule_list **dset = xcalloc (nvars, sizeof *dset);
/* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
Instead of performing NRULES allocations for each, have an array
indexed by rule numbers. */
- rule_list *delts = CALLOC (delts, nrules);
+ rule_list *delts = xnmalloc (nrules, sizeof *delts);
for (r = nrules - 1; r >= 0; --r)
{
/* DSET contains what we need under the form of a linked list. Make
it a single array. */
- CALLOC (derives, nvars);
- CALLOC (q, nvars + nrules);
+ derives = xnmalloc (nvars, sizeof *derives);
+ q = xnmalloc (nvars + nrules, sizeof *q);
for (i = ntokens; i < nsyms; i++)
{
state_number s;
goto_number *temp_map;
- CALLOC (goto_map, nvars + 1);
- CALLOC (temp_map, nvars + 1);
+ goto_map = xcalloc (nvars + 1, sizeof *goto_map);
+ temp_map = xnmalloc (nvars + 1, sizeof *temp_map);
ngotos = 0;
for (s = 0; s < nstates; ++s)
temp_map[nsyms - ntokens] = ngotos;
}
- CALLOC (from_state, ngotos);
- CALLOC (to_state, ngotos);
+ from_state = xcalloc (ngotos, sizeof *from_state);
+ to_state = xcalloc (ngotos, sizeof *to_state);
for (s = 0; s < nstates; ++s)
{
static void
initialize_F (void)
{
- goto_number **reads = CALLOC (reads, ngotos);
- goto_number *edge = CALLOC (edge, ngotos + 1);
+ goto_number **reads = xnmalloc (ngotos, sizeof *reads);
+ goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
goto_number nedges = 0;
goto_number i;
edge[nedges++] = map_goto (stateno, sym);
}
- if (nedges)
+ if (nedges == 0)
+ reads[i] = NULL;
+ else
{
- CALLOC (reads[i], nedges + 1);
- memcpy (reads[i], edge, nedges * sizeof (edge[0]));
+ reads[i] = xnmalloc (nedges + 1, sizeof reads[i][0]);
+ memcpy (reads[i], edge, nedges * sizeof edge[0]);
reads[i][nedges] = END_NODE;
nedges = 0;
}
add_lookback_edge (state *s, rule *r, goto_number gotono)
{
int ri = state_reduction_find (s, r);
- goto_list *sp = MALLOC (sp, 1);
+ goto_list *sp = xmalloc (sizeof *sp);
sp->next = lookback[(s->reductions->look_ahead_tokens - LA) + ri];
sp->value = gotono;
lookback[(s->reductions->look_ahead_tokens - LA) + ri] = sp;
static void
build_relations (void)
{
- goto_number *edge = CALLOC (edge, ngotos + 1);
- state_number *states1 = CALLOC (states1, ritem_longest_rhs () + 1);
+ goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
+ state_number *states1 = xnmalloc (ritem_longest_rhs () + 1, sizeof *states1);
goto_number i;
- CALLOC (includes, ngotos);
+ includes = xnmalloc (ngotos, sizeof *includes);
for (i = 0; i < ngotos; i++)
{
}
}
- if (nedges)
+ if (nedges == 0)
+ includes[i] = NULL;
+ else
{
int j;
- CALLOC (includes[i], nedges + 1);
+ includes[i] = xnmalloc (nedges + 1, sizeof includes[i][0]);
for (j = 0; j < nedges; j++)
includes[i][j] = edge[j];
includes[i][nedges] = END_NODE;
nLA = 1;
pLA = LA = bitsetv_create (nLA, ntokens, BITSET_FIXED);
- CALLOC (lookback, nLA);
+ lookback = xcalloc (nLA, sizeof *lookback);
/* Initialize the members LOOK_AHEAD_TOKENS for each state whose reductions
require look-ahead tokens. */
muscle_insert (const char *key, char *value)
{
muscle_entry probe;
- muscle_entry *entry = NULL;
+ muscle_entry *entry;
probe.key = key;
entry = hash_lookup (muscle_table, &probe);
if (!entry)
{
/* First insertion in the hash. */
- MALLOC (entry, 1);
+ entry = xmalloc (sizeof *entry);
entry->key = key;
hash_insert (muscle_table, entry);
}
if (!entry)
{
/* First insertion in the hash. */
- MALLOC (entry, 1);
+ entry = xmalloc (sizeof *entry);
entry->key = key;
hash_insert (muscle_table, entry);
entry->value = xstrdup (val);
symbol_number *s2;
rule_list *p;
- symbol_number *squeue = CALLOC (squeue, nvars);
- short int *rcount = CALLOC (rcount, nrules);
+ symbol_number *squeue = xnmalloc (nvars, sizeof *squeue);
+ short int *rcount = xcalloc (nrules, sizeof *rcount);
/* RITEM contains all the rules, including useless productions.
Hence we must allocate room for useless nonterminals too. */
- rule_list **rsets = CALLOC (rsets, nvars);
+ rule_list **rsets = xcalloc (nvars, sizeof *rsets);
/* This is said to be more elements than we actually use.
Supposedly NRITEMS - NRULES is enough. But why take the risk? */
- rule_list *relts = CALLOC (relts, nritems + nvars + 1);
+ rule_list *relts = xnmalloc (nritems + nvars + 1, sizeof *relts);
- CALLOC (nullable, nvars);
+ nullable = xcalloc (nvars, sizeof *nullable);
s1 = s2 = squeue;
p = relts;
/* Output YYTOKNUM. */
{
int i;
- int *values = MALLOC (values, ntokens);
+ int *values = xnmalloc (ntokens, sizeof *values);
for (i = 0; i < ntokens; ++i)
values[i] = symbols[i]->user_token_number;
muscle_insert_int_table ("toknum", values,
{
rule_number r;
unsigned int i = 0;
- item_number *rhs = MALLOC (rhs, nritems);
- unsigned int *prhs = MALLOC (prhs, nrules);
- unsigned int *rline = MALLOC (rline, nrules);
- symbol_number *r1 = MALLOC (r1, nrules);
- unsigned int *r2 = MALLOC (r2, nrules);
- short int *dprec = MALLOC (dprec, nrules);
- short int *merger = MALLOC (merger, nrules);
+ item_number *rhs = xnmalloc (nritems, sizeof *rhs);
+ unsigned int *prhs = xnmalloc (nrules, sizeof *prhs);
+ unsigned int *rline = xnmalloc (nrules, sizeof *rline);
+ symbol_number *r1 = xnmalloc (nrules, sizeof *r1);
+ unsigned int *r2 = xnmalloc (nrules, sizeof *r2);
+ short int *dprec = xnmalloc (nrules, sizeof *dprec);
+ short int *merger = xnmalloc (nrules, sizeof *merger);
for (r = 0; r < nrules; ++r)
{
prepare_states (void)
{
state_number i;
- symbol_number *values = MALLOC (values, nstates);
+ symbol_number *values = xnmalloc (nstates, sizeof *values);
for (i = 0; i < nstates; ++i)
values[i] = states[i]->accessing_symbol;
muscle_insert_symbol_number_table ("stos", values,
muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
conflict_table[0], 1, high + 1);
muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
- conflict_list[0], 1, conflict_list_cnt);
+ 0, 1, conflict_list_cnt);
}
\f
break;
if (syms->next == NULL)
{
- MALLOC (syms->next, 1);
+ syms->next = xmalloc (sizeof syms->next[0]);
syms->next->name = uniqstr_new (name);
syms->next->type = uniqstr_new (type);
syms->next->next = NULL;
rule_number ruleno = 0;
symbol_list *p = grammar;
- CALLOC (ritem, nritems);
- CALLOC (rules, nrules);
+ ritem = xnmalloc (nritems, sizeof *ritem);
+ rules = xnmalloc (nrules, sizeof *rules);
while (p)
{
rules[ruleno].number = ruleno;
rules[ruleno].lhs = p->sym;
rules[ruleno].rhs = ritem + itemno;
+ rules[ruleno].prec = NULL;
+ rules[ruleno].dprec = p->dprec;
+ rules[ruleno].merger = p->merger;
+ rules[ruleno].precsym = NULL;
rules[ruleno].location = p->location;
rules[ruleno].useful = true;
rules[ruleno].action = p->action;
rules[ruleno].action_location = p->action_location;
- rules[ruleno].dprec = p->dprec;
- rules[ruleno].merger = p->merger;
p = p->next;
while (p && p->sym)
{
int useful = 0;
int useless = nrules - nuseless_productions;
- rule *rules_sorted = MALLOC (rules_sorted, nrules);
+ rule *rules_sorted = xnmalloc (nrules, sizeof *rules_sorted);
rule_number r;
for (r = 0; r < nrules; ++r)
rules_sorted[rules[r].useful ? useful++ : useless++] = rules[r];
/* Map the nonterminals to their new index: useful first, useless
afterwards. Kept for later report. */
- symbol_number *nontermmap = CALLOC (nontermmap, nvars);
+ symbol_number *nontermmap = xnmalloc (nvars, sizeof *nontermmap);
n = ntokens;
for (i = ntokens; i < nsyms; i++)
if (bitset_test (V, i))
/* Shuffle elements of tables indexed by symbol number. */
{
- symbol **symbols_sorted = MALLOC (symbols_sorted, nvars);
+ symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
for (i = ntokens; i < nsyms; i++)
symbols[i]->number = nontermmap[i - ntokens];
unsigned int i;
infinity = size + 2;
- CALLOC (INDEX, size + 1);
- CALLOC (VERTICES, size + 1);
+ INDEX = xcalloc (size + 1, sizeof *INDEX);
+ VERTICES = xnmalloc (size + 1, sizeof *VERTICES);
top = 0;
R = r;
F = *function;
- for (i = 0; i < size; i++)
- INDEX[i] = 0;
-
for (i = 0; i < size; i++)
if (INDEX[i] == 0 && R[i])
traverse (i);
relation_transpose (relation *R_arg, int n)
{
/* The result. */
- relation new_R = CALLOC (new_R, n);
+ relation new_R = xnmalloc (n, sizeof *new_R);
/* END_R[I] -- next entry of NEW_R[I]. */
- relation end_R = CALLOC (end_R, n);
+ relation end_R = xnmalloc (n, sizeof *end_R);
/* NEDGES[I] -- total size of NEW_R[I]. */
- int *nedges = CALLOC (nedges, n);
+ int *nedges = xcalloc (n, sizeof *nedges);
int i, j;
if (trace_flag & trace_sets)
/* Allocate. */
for (i = 0; i < n; i++)
- if (nedges[i] > 0)
- {
- relation_node *sp = CALLOC (sp, nedges[i] + 1);
- sp[nedges[i]] = END_NODE;
- new_R[i] = sp;
- end_R[i] = sp;
- }
+ {
+ relation_node *sp = NULL;
+ if (nedges[i] > 0)
+ {
+ sp = xnmalloc (nedges[i] + 1, sizeof *sp);
+ sp[nedges[i]] = END_NODE;
+ }
+ new_R[i] = sp;
+ end_R[i] = sp;
+ }
/* Store. */
for (i = 0; i < n; i++)
symbol_list *
symbol_list_new (symbol *sym, location loc)
{
- symbol_list *res = MALLOC (res, 1);
+ symbol_list *res = xmalloc (sizeof *res);
res->next = NULL;
res->sym = sym;
res->location = loc;
static symbol *
symbol_new (uniqstr tag, location loc)
{
- symbol *res = MALLOC (res, 1);
+ symbol *res = xmalloc (sizeof *res);
uniqstr_assert (tag);
res->tag = tag;
max_user_token_number = this->user_token_number;
}
- CALLOC (token_translations, max_user_token_number + 1);
+ token_translations = xnmalloc (max_user_token_number + 1,
+ sizeof *token_translations);
/* Initialize all entries for literal tokens to 2, the internal
token number for $undefined, which represents all invalid inputs.
void
symbols_pack (void)
{
- CALLOC (symbols, nsyms);
+ symbols = xcalloc (nsyms, sizeof *symbols);
symbols_do (symbol_check_alias_consistency_processor, NULL);
symbols_do (symbol_pack_processor, NULL);
#define BASE_MAXIMUM INT_MAX
#define BASE_MINIMUM INT_MIN
-static base_number **froms = NULL;
-static base_number **tos = NULL;
-static unsigned int **conflict_tos = NULL;
-static short int *tally = NULL;
-static base_number *width = NULL;
+static base_number **froms;
+static base_number **tos;
+static unsigned int **conflict_tos;
+static short int *tally;
+static base_number *width;
/* For a given state, N = ACTROW[SYMBOL]:
typedef short int action_number;
#define ACTION_NUMBER_MINIMUM SHRT_MIN
-static action_number *actrow = NULL;
+static action_number *actrow;
/* FROMS and TOS are reordered to be compressed. ORDER[VECTOR] is the
new vector number of VECTOR. We skip `empty' vectors (i.e.,
TALLY[VECTOR] = 0), and call these `entries'. */
-static vector_number *order = NULL;
+static vector_number *order;
static int nentries;
base_number *base = NULL;
base_number base_ninf = 0;
static base_number *pos = NULL;
-static unsigned int *conflrow = NULL;
-unsigned int *conflict_table = NULL;
-unsigned int *conflict_list = NULL;
+static unsigned int *conflrow;
+unsigned int *conflict_table;
+unsigned int *conflict_list;
int conflict_list_cnt;
static int conflict_list_free;
with more or less the original hard-coded value (which was
SHRT_MAX). */
static int table_size = 32768;
-base_number *table = NULL;
-base_number *check = NULL;
+base_number *table;
+base_number *check;
/* The value used in TABLE to denote explicit syntax errors
(%nonassoc), a negative infinite. First defaults to ACTION_NUMBER_MININUM,
but in order to keep small tables, renumbered as TABLE_ERROR, which
fprintf (stderr, "growing table and check from: %d to %d\n",
old_size, table_size);
- REALLOC (table, table_size);
- REALLOC (check, table_size);
- REALLOC (conflict_table, table_size);
+ table = xnrealloc (table, table_size, sizeof *table);
+ conflict_table = xnrealloc (conflict_table, table_size,
+ sizeof *conflict_table);
+ check = xnrealloc (check, table_size, sizeof *check);
for (/* Nothing. */; old_size < table_size; ++old_size)
{
table[old_size] = 0;
+ conflict_table[old_size] = 0;
check[old_size] = -1;
}
}
/* Leave a 0 at the end. */
if (conflict_list_free <= 0)
abort ();
+ conflict_list[conflict_list_cnt] = 0;
conflict_list_cnt += 1;
conflict_list_free -= 1;
}
base_number *sp;
base_number *sp1;
base_number *sp2;
- unsigned int *sp3 IF_LINT (= NULL);
+ unsigned int *sp3;
/* Number of non default actions in S. */
count = 0;
return;
/* Allocate non defaulted actions. */
- froms[s] = sp = CALLOC (sp1, count);
- tos[s] = CALLOC (sp2, count);
- conflict_tos[s] = nondeterministic_parser ? CALLOC (sp3, count) : NULL;
+ froms[s] = sp = sp1 = xnmalloc (count, sizeof *sp1);
+ tos[s] = sp2 = xnmalloc (count, sizeof *sp2);
+ conflict_tos[s] = sp3 =
+ nondeterministic_parser ? xnmalloc (count, sizeof *sp3) : NULL;
/* Store non defaulted actions. */
for (i = 0; i < ntokens; i++)
int nconflict = nondeterministic_parser ? conflicts_total_count () : 0;
- CALLOC (yydefact, nstates);
+ yydefact = xnmalloc (nstates, sizeof *yydefact);
- CALLOC (actrow, ntokens);
- CALLOC (conflrow, ntokens);
+ actrow = xnmalloc (ntokens, sizeof *actrow);
+ conflrow = xnmalloc (ntokens, sizeof *conflrow);
- CALLOC (conflict_list, 1 + 2 * nconflict);
+ conflict_list = xnmalloc (1 + 2 * nconflict, sizeof *conflict_list);
conflict_list_free = 2 * nconflict;
conflict_list_cnt = 1;
return;
/* Allocate room for non defaulted gotos. */
- froms[symno] = sp = CALLOC (sp1, count);
- tos[symno] = CALLOC (sp2, count);
+ froms[symno] = sp = sp1 = xnmalloc (count, sizeof *sp1);
+ tos[symno] = sp2 = xnmalloc (count, sizeof *sp2);
/* Store the state numbers of the non defaulted gotos. */
for (i = begin; i < end; i++)
goto_actions (void)
{
symbol_number i;
- short int *state_count = CALLOC (state_count, nstates);
- MALLOC (yydefgoto, nvars);
+ short int *state_count = xnmalloc (nstates, sizeof *state_count);
+ yydefgoto = xnmalloc (nvars, sizeof *yydefgoto);
/* For a given nterm I, STATE_COUNT[S] is the number of times there
is a GOTO to S on I. */
{
int i;
- CALLOC (base, nvectors);
- CALLOC (pos, nentries);
- CALLOC (table, table_size);
- CALLOC (conflict_table, table_size);
- CALLOC (check, table_size);
+ base = xnmalloc (nvectors, sizeof *base);
+ pos = xnmalloc (nentries, sizeof *pos);
+ table = xcalloc (table_size, sizeof *table);
+ conflict_table = xcalloc (table_size, sizeof *conflict_table);
+ check = xnmalloc (table_size, sizeof *check);
lowzero = 0;
high = 0;
nvectors = state_number_as_int (nstates) + nvars;
- CALLOC (froms, nvectors);
- CALLOC (tos, nvectors);
- CALLOC (conflict_tos, nvectors);
- CALLOC (tally, nvectors);
- CALLOC (width, nvectors);
+ froms = xcalloc (nvectors, sizeof *froms);
+ tos = xcalloc (nvectors, sizeof *tos);
+ conflict_tos = xcalloc (nvectors, sizeof *conflict_tos);
+ tally = xcalloc (nvectors, sizeof *tally);
+ width = xnmalloc (nvectors, sizeof *width);
token_actions ();
free (from_state);
free (to_state);
- CALLOC (order, nvectors);
+ order = xcalloc (nvectors, sizeof *order);
sort_actions ();
pack_table ();
free (order);
void
add_classname (graph *g, int val, const char *name)
{
- struct classname *classname;
-
- MALLOC (classname, 1);
+ struct classname *classname = xmalloc (sizeof *classname);
classname->no = val;
classname->name = name;
classname->next = g->classname;
void
add_infoname (graph *g, int integer, const char *str)
{
- struct infoname *infoname;
-
- MALLOC (infoname, 1);
+ struct infoname *infoname = xmalloc (sizeof *infoname);
infoname->integer = integer;
infoname->chars = str;
infoname->next = g->infoname;
add_colorentry (graph *g, int color_idx, int red_cp,
int green_cp, int blue_cp)
{
- struct colorentry *ce;
-
- MALLOC (ce, 1);
+ struct colorentry *ce = xmalloc (sizeof *ce);
ce->color_index = color_idx;
ce->red_cp = red_cp;
ce->green_cp = green_cp;