summaryrefslogtreecommitdiff
path: root/tools/br_ips/br_ips.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-06-25 09:07:46 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-06-25 09:07:46 -0400
commitfd543fd799caf59cabf55721e561fcfb0f59315d (patch)
treed90c9273f31c184340d4e24084251ffd01fbbb97 /tools/br_ips/br_ips.c
parent631d5af665f8de63db7940fe7bdb82960686db2f (diff)
Refactor br_ips getline; Update INSTALL.md notes
Diffstat (limited to 'tools/br_ips/br_ips.c')
-rw-r--r--tools/br_ips/br_ips.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/tools/br_ips/br_ips.c b/tools/br_ips/br_ips.c
index 8e4469b5a..64c454a3e 100644
--- a/tools/br_ips/br_ips.c
+++ b/tools/br_ips/br_ips.c
@@ -24,26 +24,29 @@ 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;
}