mirror of https://github.com/thesofproject/sof.git
toml: Keep available manifest parsers in list
This approach allows to easily expand parsers list in future, without harming code readability. Signed-off-by: Karol Trzcinski <karolx.trzcinski@linux.intel.com>
This commit is contained in:
parent
c98a29da14
commit
8249abfa11
|
@ -1562,13 +1562,35 @@ static int parse_version(toml_table_t *toml, int64_t version[2])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool check_config_version(int major, int minor, const int64_t *version)
|
struct config_parser {
|
||||||
|
int major;
|
||||||
|
int minor;
|
||||||
|
int (*parse)(const toml_table_t *toml, struct adsp *out, bool verbose);
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct config_parser *find_config_parser(int64_t version[2])
|
||||||
{
|
{
|
||||||
return version[0] == major && version[1] == minor;
|
/* list of supported configuration version with handler to parser */
|
||||||
|
static const struct config_parser parsers[] = {
|
||||||
|
{1, 0, parse_adsp_config_v1_0},
|
||||||
|
{1, 5, parse_adsp_config_v1_5},
|
||||||
|
{1, 8, parse_adsp_config_v1_8},
|
||||||
|
{2, 5, parse_adsp_config_v2_5},
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(parsers); ++i) {
|
||||||
|
if (parsers[i].major == version[0] &&
|
||||||
|
parsers[i].minor == version[1]) {
|
||||||
|
return &parsers[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adsp_parse_config_fd(FILE *fd, struct adsp *out, bool verbose)
|
static int adsp_parse_config_fd(FILE *fd, struct adsp *out, bool verbose)
|
||||||
{
|
{
|
||||||
|
const struct config_parser *parser;
|
||||||
int64_t manifest_version[2];
|
int64_t manifest_version[2];
|
||||||
toml_table_t *toml;
|
toml_table_t *toml;
|
||||||
char errbuf[256];
|
char errbuf[256];
|
||||||
|
@ -1584,21 +1606,16 @@ static int adsp_parse_config_fd(FILE *fd, struct adsp *out, bool verbose)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* parsing function depends on manifest_version */
|
/* find parser compatible with manifest version */
|
||||||
if (check_config_version(1, 0, manifest_version)) {
|
parser = find_config_parser(manifest_version);
|
||||||
ret = parse_adsp_config_v1_0(toml, out, verbose);
|
if (!parser) {
|
||||||
} else if (check_config_version(1, 5, manifest_version)) {
|
|
||||||
ret = parse_adsp_config_v1_5(toml, out, verbose);
|
|
||||||
} else if (check_config_version(1, 8, manifest_version)) {
|
|
||||||
ret = parse_adsp_config_v1_8(toml, out, verbose);
|
|
||||||
} else if (check_config_version(2, 5, manifest_version)) {
|
|
||||||
ret = parse_adsp_config_v2_5(toml, out, verbose);
|
|
||||||
} else {
|
|
||||||
ret = log_err(-EINVAL, "error: Unsupported config version %d.%d\n",
|
ret = log_err(-EINVAL, "error: Unsupported config version %d.%d\n",
|
||||||
manifest_version[0], manifest_version[1]);
|
manifest_version[0], manifest_version[1]);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* run dedicated parser */
|
||||||
|
ret = parser->parse(toml, out, verbose);
|
||||||
error:
|
error:
|
||||||
toml_free(toml);
|
toml_free(toml);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue