From d81411896f140981400e4fbf4aafacdbabad96cd Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 20 Oct 2018 21:56:03 +0300 Subject: Split region reading to util.h --- src/util.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/util.h (limited to 'src/util.h') diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..d62186c --- /dev/null +++ b/src/util.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +struct region { + size_t start, end, offset; +}; + +static inline bool +region_parse(struct region *region, const char *line) +{ + *region = (struct region){0}; + if (sscanf(line, "%zx-%zx %*s %zx", ®ion->start, ®ion->end, ®ion->offset) < 3 || region->start > region->end) { + warnx("failed to parse mapping:\n%s", line); + return false; + } + return true; +} + +static inline void +for_each_line_in_file(FILE *f, void (*cb)(const char *line, void *data), void *data) +{ + char *buffer = NULL; + size_t step = 1024, allocated = 0, written = 0, read = 0; + do { + if (written + read >= allocated && !(buffer = realloc(buffer, (allocated += step) + 1))) + err(EXIT_FAILURE, "realloc"); + + buffer[(written += read)] = 0; + + size_t ate = 0; + for (char *line = buffer, *nl; (nl = strchr(line, '\n')); line = nl + 1) { + *nl = 0; + cb(line, data); + ate += nl + 1 - line; + } + + memmove(buffer, buffer + ate, (written = written - ate)); + } while ((read = fread(buffer + written, 1, allocated - written, f))); + free(buffer); +} -- cgit v1.2.3