aubinator: Store enum textual name in iter->value.

gen_field_iterator_next() produces a string representing the value of
the field.  For enum values, it also produced a separate "description"
string containing the textual name of the enum.

The only caller of this function combines the two, printing enums as
"<numeric value> (<texture enum name>)".  We may as well just store
that in item->value directly, eliminating the description field, and
a layer of wrapping.

v2: Use non-overlapping source and destination strings in snprintf.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Kenneth Graunke 2017-03-19 20:59:08 -07:00
parent a6e2124402
commit 2c6c760a4b
3 changed files with 15 additions and 19 deletions

View File

@ -116,12 +116,7 @@ print_iterator_values(struct gen_field_iterator *iter, int *idx)
{
char *token = NULL;
if (strstr(iter->value, "struct") == NULL) {
if (strlen(iter->description) > 0) {
fprintf(outfile, " %s: %s (%s)\n",
iter->name, iter->value, iter->description);
} else {
fprintf(outfile, " %s: %s\n", iter->name, iter->value);
}
fprintf(outfile, " %s: %s\n", iter->name, iter->value);
} else {
token = strtok(iter->value, " ");
if (token != NULL) {

View File

@ -726,16 +726,15 @@ gen_field_iterator_init(struct gen_field_iterator *iter,
iter->print_colors = print_colors;
}
static void
gen_enum_write_value(char *str, size_t max_length,
struct gen_enum *e, uint64_t value)
static const char *
gen_get_enum_name(struct gen_enum *e, uint64_t value)
{
for (int i = 0; i < e->nvalues; i++) {
if (e->values[i]->value == value) {
strncpy(str, e->values[i]->name, max_length);
return;
return e->values[i]->name;
}
}
return NULL;
}
bool
@ -759,7 +758,7 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
else
v.qw = iter->p[index];
iter->description[0] = '\0';
const char *enum_name = NULL;
switch (f->type.kind) {
case GEN_TYPE_UNKNOWN:
@ -767,16 +766,14 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
uint64_t value = field(v.qw, f->start, f->end);
snprintf(iter->value, sizeof(iter->value),
"%"PRId64, value);
gen_enum_write_value(iter->description, sizeof(iter->description),
&f->inline_enum, value);
enum_name = gen_get_enum_name(&f->inline_enum, value);
break;
}
case GEN_TYPE_UINT: {
uint64_t value = field(v.qw, f->start, f->end);
snprintf(iter->value, sizeof(iter->value),
"%"PRIu64, value);
gen_enum_write_value(iter->description, sizeof(iter->description),
&f->inline_enum, value);
enum_name = gen_get_enum_name(&f->inline_enum, value);
break;
}
case GEN_TYPE_BOOL: {
@ -812,11 +809,16 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
uint64_t value = field(v.qw, f->start, f->end);
snprintf(iter->value, sizeof(iter->value),
"%"PRId64, value);
gen_enum_write_value(iter->description, sizeof(iter->description),
f->type.gen_enum, value);
enum_name = gen_get_enum_name(f->type.gen_enum, value);
break;
}
}
if (enum_name) {
int length = strlen(iter->value);
snprintf(iter->value + length, sizeof(iter->value) - length,
" (%s)", enum_name);
}
return true;
}

View File

@ -54,7 +54,6 @@ struct gen_field_iterator {
struct gen_group *group;
const char *name;
char value[128];
char description[128];
const uint32_t *p;
int i;
bool print_colors;