From 47e237688bdb53e8648b9f16ed2753f7f21d5199 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 27 Jan 2019 16:41:20 +0100 Subject: [PATCH] pack cmd: seperate file line reader from file list parser Signed-off-by: David Oberhollenzer --- Makefile.am | 1 + main/cmd/pack/filelist_read.c | 59 +------------------------------ main/cmd/pack/input_file.c | 65 +++++++++++++++++++++++++++++++++++ main/cmd/pack/pack.h | 6 ++++ 4 files changed, 73 insertions(+), 58 deletions(-) create mode 100644 main/cmd/pack/input_file.c diff --git a/Makefile.am b/Makefile.am index 8a842c4..e8856ab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,6 +25,7 @@ EXTRA_DIST = autogen.sh pkg_SOURCES += main/cmd/pack/filelist.c main/cmd/pack/filelist_read.c pkg_SOURCES += main/cmd/pack/write_toc.c main/cmd/pack/write_files.c pkg_SOURCES += main/cmd/pack/pack.h main/cmd/pack/pack.c +pkg_SOURCES += main/cmd/pack/input_file.c # dump command pkg_SOURCES += main/cmd/dump/dump.c main/cmd/dump/dump.h main/cmd/dump/dump_toc.c diff --git a/main/cmd/pack/filelist_read.c b/main/cmd/pack/filelist_read.c index edd88af..350af13 100644 --- a/main/cmd/pack/filelist_read.c +++ b/main/cmd/pack/filelist_read.c @@ -11,59 +11,6 @@ static const struct { #define NUM_LINE_HOOKS (sizeof(line_hooks) / sizeof(line_hooks[0])) -static int prefetch_line(input_file_t *f) -{ - char *line = NULL; - size_t n = 0; - ssize_t ret; - - free(f->line); - f->line = NULL; - - errno = 0; - ret = getline(&line, &n, f->f); - - if (ret < 0) { - if (errno != 0) { - perror(f->filename); - free(line); - return -1; - } - free(line); - return 1; - } - - n = strlen(line); - while (n >0 && isspace(line[n - 1])) - --n; - line[n] = '\0'; - - f->line = line; - f->linenum += 1; - return 0; -} - -static void cleanup_file(input_file_t *f) -{ - fclose(f->f); - free(f->line); -} - -static int open_file(input_file_t *f, const char *filename) -{ - memset(f, 0, sizeof(*f)); - - f->filename = filename; - f->f = fopen(filename, "r"); - - if (f->f == NULL) { - perror(f->filename); - return -1; - } - - return 0; -} - image_entry_t *filelist_read(const char *filename) { image_entry_t *ent, *list = NULL; @@ -82,11 +29,7 @@ image_entry_t *filelist_read(const char *filename) if (ret > 0) break; - for (ptr = f.line; isspace(*ptr); ++ptr) - ; - - if (*ptr == '\0' || *ptr == '#') - continue; + ptr = f.line; for (i = 0; i < NUM_LINE_HOOKS; ++i) { len = strlen(line_hooks[i].name); diff --git a/main/cmd/pack/input_file.c b/main/cmd/pack/input_file.c new file mode 100644 index 0000000..3e88d92 --- /dev/null +++ b/main/cmd/pack/input_file.c @@ -0,0 +1,65 @@ +#include "pack.h" + +int prefetch_line(input_file_t *f) +{ + char *line, *ptr; + ssize_t ret; + size_t n; +retry: + free(f->line); + f->line = NULL; + + errno = 0; + line = NULL; + n = 0; + ret = getline(&line, &n, f->f); + + if (ret < 0) { + if (errno != 0) { + perror(f->filename); + free(line); + return -1; + } + free(line); + return 1; + } + + n = strlen(line); + while (n >0 && isspace(line[n - 1])) + --n; + line[n] = '\0'; + + f->line = line; + f->linenum += 1; + + for (ptr = f->line; isspace(*ptr); ++ptr) + ; + + if (*ptr == '\0' || *ptr == '#') + goto retry; + + if (ptr != f->line) + memmove(f->line, ptr, strlen(ptr) + 1); + return 0; +} + +void cleanup_file(input_file_t *f) +{ + fclose(f->f); + free(f->line); +} + +int open_file(input_file_t *f, const char *filename) +{ + memset(f, 0, sizeof(*f)); + + f->filename = filename; + f->f = fopen(filename, "r"); + + if (f->f == NULL) { + perror(f->filename); + return -1; + } + + return 0; +} diff --git a/main/cmd/pack/pack.h b/main/cmd/pack/pack.h index 6fc3023..813271a 100644 --- a/main/cmd/pack/pack.h +++ b/main/cmd/pack/pack.h @@ -40,4 +40,10 @@ int write_toc(pkg_writer_t *wr, image_entry_t *list, compressor_t *cmp); int write_files(pkg_writer_t *wr, image_entry_t *list, compressor_t *cmp); +int prefetch_line(input_file_t *f); + +void cleanup_file(input_file_t *f); + +int open_file(input_file_t *f, const char *filename); + #endif /* PACK_H */