variant: produce stable results

Improve the output by ensuring a well defined order for type switches.

* src/uniqstr.h: Style changes for macro arguments.
(UNIQSTR_CMP): Replace by...
(uniqstr_cmp): this.
* src/uniqstr.c (uniqstr_cmp): New.
Produce well defined results.
* src/output.c: Use it.
This commit is contained in:
Akim Demaille
2012-12-22 10:16:49 +01:00
parent e38106582f
commit 55439a1cea
3 changed files with 17 additions and 6 deletions

View File

@@ -284,10 +284,10 @@ prepare_states (void)
static int
symbol_type_name_cmp (const symbol **lhs, const symbol **rhs)
{
int res = UNIQSTR_CMP((*lhs)->type_name, (*rhs)->type_name);
if (res)
return res;
return (*lhs)->number - (*rhs)->number;
int res = uniqstr_cmp ((*lhs)->type_name, (*rhs)->type_name);
if (!res)
res = (*lhs)->number - (*rhs)->number;
return res;
}

View File

@@ -103,7 +103,17 @@ uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED)
return uniqstr_print (ustr);
}
int
uniqstr_cmp(uniqstr l, uniqstr r)
{
return (l == r ? 0
: !l ? -1
: !r ? +1
: strcmp (l, r));
}
/*-----------------------.
| A uniqstr hash table. |
`-----------------------*/
@@ -120,6 +130,7 @@ hash_uniqstr (void const *m, size_t tablesize)
return hash_string (m, tablesize);
}
/*----------------------------.
| Create the uniqstrs table. |
`----------------------------*/

View File

@@ -40,7 +40,7 @@ uniqstr uniqstr_vsprintf (char const *format, ...)
/* Compare two uniqstr a la strcmp: negative for <, nul for =, and
positive for >. Undefined order, relies on addresses. */
# define UNIQSTR_CMP(USTR1, USTR2) ((USTR1) - (USTR2))
int uniqstr_cmp(uniqstr u1, uniqstr u2);
/* Die if STR is not a uniqstr. */
void uniqstr_assert (char const *str);