summaryrefslogtreecommitdiff
path: root/tools/br_ips/br_ips.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/br_ips/br_ips.c')
-rw-r--r--tools/br_ips/br_ips.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/tools/br_ips/br_ips.c b/tools/br_ips/br_ips.c
index 8e4469b5a..10d9a37c0 100644
--- a/tools/br_ips/br_ips.c
+++ b/tools/br_ips/br_ips.c
@@ -24,29 +24,33 @@ static int getline(char ** lineptr, size_t * n, FILE * stream) {
// Static implementation of GNU getline
int i = 0;
int c;
+ if (n == NULL || lineptr == NULL || stream == NULL) return -1;
size_t size = *n;
char * buf = *lineptr;
- if (size == 0) {
- size = BUFSIZ;
- buf = realloc(buf, BUFSIZ);
+ if (buf == NULL || size < 4) {
+ size = 128;
+ *lineptr = buf = realloc(buf, 128);
}
if (buf == NULL) return -1;
- do {
- if (feof(stream)) return -1;
+ while (1) {
c = getc(stream);
+ if (c == EOF) break;
buf[i++] = c;
- if (i == size -1) {
+ if (c == '\n') break;
+ if (i == size - 1) {
size <<= 1;
buf = realloc(buf, size);
if (buf == NULL) return -1;
+ *lineptr = buf;
+ *n = size;
}
- } while (c != '\n');
+ }
+ if (i == 0) return -1;
buf[i] = 0;
- *lineptr = buf;
- *n = size;
return i;
}
+
static void getIncbinsFromFile(hunk_t ** hunks, size_t * num, size_t * maxnum, const char * fname, char ** strbuf, size_t * buffersize) {
// Recursively find incbinned segments and encode them as hunks.
FILE * file = fopen(fname, "r");