diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2012-05-19 13:53:13 +0200 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2012-05-19 16:10:52 +0200 |
commit | b62ec2ba809f093f299111cf263ce51ca4d4a665 (patch) | |
tree | 2441ca6d9bb45faa2a9c8b3d542524edb98b9355 /utils | |
parent | b422be9bd0ddf517c6e7b804cb161f843939b1e0 (diff) | |
download | rockbox-b62ec2ba809f093f299111cf263ce51ca4d4a665.tar.gz rockbox-b62ec2ba809f093f299111cf263ce51ca4d4a665.zip |
imxtools: make sb api work with in-memory files
Change-Id: I517244802efb118be214437bbaea2ef811e87aea
Diffstat (limited to 'utils')
-rw-r--r-- | utils/imxtools/sb.c | 46 | ||||
-rw-r--r-- | utils/imxtools/sb.h | 5 |
2 files changed, 39 insertions, 12 deletions
diff --git a/utils/imxtools/sb.c b/utils/imxtools/sb.c index 8e4b98b1a9..db6763c400 100644 --- a/utils/imxtools/sb.c +++ b/utils/imxtools/sb.c | |||
@@ -630,32 +630,55 @@ static uint32_t guess_alignment(uint32_t off) | |||
630 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, | 630 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, |
631 | sb_color_printf cprintf, enum sb_error_t *err) | 631 | sb_color_printf cprintf, enum sb_error_t *err) |
632 | { | 632 | { |
633 | uint8_t *buf = NULL; | 633 | return sb_read_file_ex(filename, 0, -1, raw_mode, u, cprintf, err); |
634 | struct sb_file_t *sb_file = NULL; | 634 | } |
635 | 635 | ||
636 | #define printf(c, ...) cprintf(u, false, c, __VA_ARGS__) | 636 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, |
637 | sb_color_printf cprintf, enum sb_error_t *err) | ||
638 | { | ||
637 | #define fatal(e, ...) \ | 639 | #define fatal(e, ...) \ |
638 | do { if(err) *err = e; \ | 640 | do { if(err) *err = e; \ |
639 | cprintf(u, true, GREY, __VA_ARGS__); \ | 641 | cprintf(u, true, GREY, __VA_ARGS__); \ |
640 | free(buf); \ | 642 | free(buf); \ |
641 | sb_free(sb_file); \ | ||
642 | return NULL; } while(0) | 643 | return NULL; } while(0) |
643 | #define print_hex(c, p, len, nl) \ | ||
644 | do { printf(c, ""); print_hex(p, len, nl); } while(0) | ||
645 | 644 | ||
646 | FILE *f = fopen(filename, "rb"); | 645 | FILE *f = fopen(filename, "rb"); |
646 | void *buf = NULL; | ||
647 | if(f == NULL) | 647 | if(f == NULL) |
648 | fatal(SB_OPEN_ERROR, "Cannot open file for reading\n"); | 648 | fatal(SB_OPEN_ERROR, "Cannot open file for reading\n"); |
649 | fseek(f, 0, SEEK_END); | 649 | fseek(f, 0, SEEK_END); |
650 | long filesize = ftell(f); | 650 | size_t read_size = ftell(f); |
651 | fseek(f, 0, SEEK_SET); | 651 | fseek(f, offset, SEEK_SET); |
652 | buf = xmalloc(filesize); | 652 | if(size != (size_t)-1) |
653 | if(fread(buf, filesize, 1, f) != 1) | 653 | read_size = size; |
654 | buf = xmalloc(read_size); | ||
655 | if(fread(buf, read_size, 1, f) != 1) | ||
654 | { | 656 | { |
655 | fclose(f); | 657 | fclose(f); |
656 | fatal(SB_READ_ERROR, "Cannot read file\n"); | 658 | fatal(SB_READ_ERROR, "Cannot read file\n"); |
657 | } | 659 | } |
658 | fclose(f); | 660 | fclose(f); |
661 | |||
662 | struct sb_file_t *ret = sb_read_memory(buf, read_size, raw_mode, u, cprintf, err); | ||
663 | free(buf); | ||
664 | return ret; | ||
665 | |||
666 | #undef fatal | ||
667 | } | ||
668 | |||
669 | struct sb_file_t *sb_read_memory(void *buf, size_t filesize, bool raw_mode, void *u, | ||
670 | sb_color_printf cprintf, enum sb_error_t *err) | ||
671 | { | ||
672 | struct sb_file_t *sb_file = NULL; | ||
673 | |||
674 | #define printf(c, ...) cprintf(u, false, c, __VA_ARGS__) | ||
675 | #define fatal(e, ...) \ | ||
676 | do { if(err) *err = e; \ | ||
677 | cprintf(u, true, GREY, __VA_ARGS__); \ | ||
678 | sb_free(sb_file); \ | ||
679 | return NULL; } while(0) | ||
680 | #define print_hex(c, p, len, nl) \ | ||
681 | do { printf(c, ""); print_hex(p, len, nl); } while(0) | ||
659 | 682 | ||
660 | struct sha_1_params_t sha_1_params; | 683 | struct sha_1_params_t sha_1_params; |
661 | sb_file = xmalloc(sizeof(struct sb_file_t)); | 684 | sb_file = xmalloc(sizeof(struct sb_file_t)); |
@@ -1048,7 +1071,6 @@ struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, | |||
1048 | printf(RED, " Failed\n"); | 1071 | printf(RED, " Failed\n"); |
1049 | fatal(SB_CHECKSUM_ERROR, "File SHA-1 error\n"); | 1072 | fatal(SB_CHECKSUM_ERROR, "File SHA-1 error\n"); |
1050 | } | 1073 | } |
1051 | free(buf); | ||
1052 | 1074 | ||
1053 | return sb_file; | 1075 | return sb_file; |
1054 | #undef printf | 1076 | #undef printf |
diff --git a/utils/imxtools/sb.h b/utils/imxtools/sb.h index e0f25b68a4..74d86f303a 100644 --- a/utils/imxtools/sb.h +++ b/utils/imxtools/sb.h | |||
@@ -228,6 +228,11 @@ enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename); | |||
228 | typedef void (*sb_color_printf)(void *u, bool err, color_t c, const char *f, ...); | 228 | typedef void (*sb_color_printf)(void *u, bool err, color_t c, const char *f, ...); |
229 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, | 229 | struct sb_file_t *sb_read_file(const char *filename, bool raw_mode, void *u, |
230 | sb_color_printf printf, enum sb_error_t *err); | 230 | sb_color_printf printf, enum sb_error_t *err); |
231 | /* use size_t(-1) to use maximum size */ | ||
232 | struct sb_file_t *sb_read_file_ex(const char *filename, size_t offset, size_t size, bool raw_mode, void *u, | ||
233 | sb_color_printf printf, enum sb_error_t *err); | ||
234 | struct sb_file_t *sb_read_memory(void *buffer, size_t size, bool raw_mode, void *u, | ||
235 | sb_color_printf printf, enum sb_error_t *err); | ||
231 | 236 | ||
232 | void sb_fill_section_name(char name[5], uint32_t identifier); | 237 | void sb_fill_section_name(char name[5], uint32_t identifier); |
233 | void sb_dump(struct sb_file_t *file, void *u, sb_color_printf printf); | 238 | void sb_dump(struct sb_file_t *file, void *u, sb_color_printf printf); |