Patrick Georgi (pgeorgi@google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/11362
-gerrit
commit 24d810208857f3cc27a69c9986b5bd9f9775f328 Author: Patrick Georgi patrick@georgi-clan.de Date: Wed Aug 26 12:53:41 2015 +0200
cbfstool: add decompression wrappers
... and document the interface.
Change-Id: I86a071a61fd6c1ef842f8ffe51f12f0cefdaf2fe Signed-off-by: Patrick Georgi patrick@georgi-clan.de --- util/cbfstool/common.h | 16 +++++++++++++++- util/cbfstool/compress.c | 27 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h index 5fb1906..4a97fed 100644 --- a/util/cbfstool/common.h +++ b/util/cbfstool/common.h @@ -146,10 +146,24 @@ void buffer_delete(struct buffer *buffer); const char *arch_to_string(uint32_t a); uint32_t string_to_arch(const char *arch_string);
-typedef int (*comp_func_ptr) (char *, int, char *, int *); +/* Compress in_len bytes from in, storing the result at out, returning the + * resulting length in out_len. + * Returns 0 on error, + * != 0 otherwise, depending on the compressing function. + */ +typedef int (*comp_func_ptr) (char *in, int in_len, char *out, int *out_len); + +/* Decompress in_len bytes from in, storing the result at out, up to out_len + * bytes. + * Returns 0 on error, + * != 0 otherwise, depending on the decompressing function. + */ +typedef int (*decomp_func_ptr) (char *in, int in_len, char *out, int out_len); + enum comp_algo { CBFS_COMPRESS_NONE = 0, CBFS_COMPRESS_LZMA = 1 };
comp_func_ptr compression_function(enum comp_algo algo); +decomp_func_ptr decompression_function(enum comp_algo algo);
uint64_t intfiletype(const char *name);
diff --git a/util/cbfstool/compress.c b/util/cbfstool/compress.c index ab94b35..2bde7df 100644 --- a/util/cbfstool/compress.c +++ b/util/cbfstool/compress.c @@ -31,6 +31,10 @@ static int lzma_compress(char *in, int in_len, char *out, int *out_len) return do_lzma_compress(in, in_len, out, out_len); }
+static int lzma_decompress(char *in, int in_len, char *out, unused int out_len) +{ + return do_lzma_uncompress(out, out_len, in, in_len); +} static int none_compress(char *in, int in_len, char *out, int *out_len) { memcpy(out, in, in_len); @@ -38,6 +42,12 @@ static int none_compress(char *in, int in_len, char *out, int *out_len) return 0; }
+static int none_decompress(char *in, int in_len, char *out, unused int out_len) +{ + memcpy(out, in, in_len); + return 0; +} + comp_func_ptr compression_function(enum comp_algo algo) { comp_func_ptr compress; @@ -54,3 +64,20 @@ comp_func_ptr compression_function(enum comp_algo algo) } return compress; } + +decomp_func_ptr decompression_function(enum comp_algo algo) +{ + decomp_func_ptr decompress; + switch (algo) { + case CBFS_COMPRESS_NONE: + decompress = none_decompress; + break; + case CBFS_COMPRESS_LZMA: + decompress = lzma_decompress; + break; + default: + ERROR("Unknown compression algorithm %d!\n", algo); + return NULL; + } + return decompress; +}