From ec42486055fa317e84232115c9b83c1414f48b20 Mon Sep 17 00:00:00 2001 From: Sol Boucher Date: Thu, 7 May 2015 21:00:05 -0700 Subject: cbfstool: Factor out compression algorithm list Parse compression algorithm arguments using a single list. Change-Id: Idc5b14a53377b29964f24221e42db6e09a497d48 Signed-off-by: Sol Boucher Signed-off-by: Patrick Georgi Original-Change-Id: I1a117a9473e895feaf455bb30d0f945f57de51eb Original-Signed-off-by: Sol Boucher Reviewed-on: http://review.coreboot.org/10931 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- util/cbfstool/cbfs_image.c | 12 ++++++++++++ util/cbfstool/cbfs_image.h | 4 ++++ util/cbfstool/cbfstool.c | 14 +++++++------- 3 files changed, 23 insertions(+), 7 deletions(-) (limited to 'util/cbfstool') diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c index 783999ce9b..f5fddcbe43 100644 --- a/util/cbfstool/cbfs_image.c +++ b/util/cbfstool/cbfs_image.c @@ -96,11 +96,23 @@ static const char *lookup_name_by_type(const struct typedesc_t *desc, uint32_t t return default_value; } +static int lookup_type_by_name(const struct typedesc_t *desc, const char *name) +{ + int i; + for (i = 0; desc[i].name && strcasecmp(name, desc[i].name); ++i); + return desc[i].name ? (int)desc[i].type : -1; +} + static const char *get_cbfs_entry_type_name(uint32_t type) { return lookup_name_by_type(types_cbfs_entry, type, "(unknown)"); } +int cbfs_parse_comp_algo(const char *name) +{ + return lookup_type_by_name(types_cbfs_compression, name); +} + /* CBFS image */ static size_t cbfs_calculate_file_header_size(const char *name) diff --git a/util/cbfstool/cbfs_image.h b/util/cbfstool/cbfs_image.h index 5df5dd271a..cb2935b754 100644 --- a/util/cbfstool/cbfs_image.h +++ b/util/cbfstool/cbfs_image.h @@ -32,6 +32,10 @@ struct cbfs_image { struct cbfs_header header; }; +/* Given the string name of a compression algorithm, return the corresponding + * enum comp_algo if it's supported, or a number < 0 otherwise. */ +int cbfs_parse_comp_algo(const char *name); + /* Given a pointer, serialize the header from host-native byte format * to cbfs format, i.e. big-endian. */ void cbfs_put_header(void *dest, const struct cbfs_header *header); diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index cae1227200..b6a486fd37 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -973,15 +973,15 @@ int main(int argc, char **argv) WARN("Unknown type '%s' ignored\n", optarg); break; - case 'c': - if (!strncasecmp(optarg, "lzma", 5)) - param.compression = CBFS_COMPRESS_LZMA; - else if (!strncasecmp(optarg, "none", 5)) - param.compression = CBFS_COMPRESS_NONE; + case 'c': { + int algo = cbfs_parse_comp_algo(optarg); + if (algo >= 0) + param.compression = algo; else - WARN("Unknown compression '%s'" - " ignored.\n", optarg); + WARN("Unknown compression '%s' ignored.\n", + optarg); break; + } case 'M': param.fmap = optarg; break; -- cgit v1.2.3