diff options
author | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2016-10-15 00:16:25 +0100 |
---|---|---|
committer | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2016-11-01 22:37:52 +0000 |
commit | 74c4c84482b9659805ef3d796fba81815e70ed28 (patch) | |
tree | 194e51b8c7516a952e68c5a8cc4b60579fbdcdfb | |
parent | c8806eeefc63e70e7c454f4c85d2a8b4426c34b9 (diff) |
intel: aubinator: load fields values from xml data
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Sirisha Gandikota<sirisha.gandikota@intel.com>
-rw-r--r-- | src/intel/tools/decoder.c | 31 | ||||
-rw-r--r-- | src/intel/tools/decoder.h | 9 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/intel/tools/decoder.c b/src/intel/tools/decoder.c index cab527143b..88ba5c0f5f 100644 --- a/src/intel/tools/decoder.c +++ b/src/intel/tools/decoder.c @@ -303,6 +303,21 @@ create_field(struct parser_context *ctx, const char **atts) return field; } +static struct gen_value * +create_value(struct parser_context *ctx, const char **atts) +{ + struct gen_value *value = xzalloc(sizeof(*value)); + + for (int i = 0; atts[i]; i += 2) { + if (strcmp(atts[i], "name") == 0) + value->name = xstrdup(atts[i + 1]); + else if (strcmp(atts[i], "value") == 0) + value->value = strtoul(atts[i + 1], NULL, 0); + } + + return value; +} + static void start_element(void *data, const char *element_name, const char **atts) { @@ -352,6 +367,22 @@ start_element(void *data, const char *element_name, const char **atts) } while (ctx->group->group_count > 0); } else if (strcmp(element_name, "enum") == 0) { } else if (strcmp(element_name, "value") == 0) { + if (ctx->nfields > 0) { + struct gen_field *field = ctx->fields[ctx->nfields - 1]; + if (field->n_allocated_values <= field->n_values) { + if (field->n_allocated_values == 0) { + field->n_allocated_values = 2; + field->values = + xzalloc(sizeof(field->values[0]) * field->n_allocated_values); + } else { + field->n_allocated_values *= 2; + field->values = + realloc(field->values, + sizeof(field->values[0]) * field->n_allocated_values); + } + } + field->values[field->n_values++] = create_value(ctx, atts); + } } } diff --git a/src/intel/tools/decoder.h b/src/intel/tools/decoder.h index 9a677beab5..ecc9ff116b 100644 --- a/src/intel/tools/decoder.h +++ b/src/intel/tools/decoder.h @@ -99,6 +99,15 @@ struct gen_field { struct gen_type type; bool has_default; uint32_t default_value; + + struct gen_value **values; + uint32_t n_values; + uint32_t n_allocated_values; +}; + +struct gen_value { + char *name; + uint64_t value; }; void gen_field_iterator_init(struct gen_field_iterator *iter, |