aboutsummaryrefslogtreecommitdiff
path: root/lib/io/src/get_line.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/io/src/get_line.c')
-rw-r--r--lib/io/src/get_line.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/lib/io/src/get_line.c b/lib/io/src/get_line.c
index f7e0b59..19af208 100644
--- a/lib/io/src/get_line.c
+++ b/lib/io/src/get_line.c
@@ -41,8 +41,8 @@ static size_t trim(char *buffer, int flags)
int istream_get_line(istream_t *strm, char **out,
size_t *line_num, int flags)
{
+ size_t i, count, line_len = 0;
char *line = NULL, *new;
- size_t i, line_len = 0;
bool have_line = false;
*out = NULL;
@@ -70,24 +70,28 @@ int istream_get_line(istream_t *strm, char **out,
}
if (i < strm->buffer_used) {
- have_line = true;
- strm->buffer_offset = i + 1;
+ count = i++;
+
+ if (count > 0 && strm->buffer[count - 1] == '\r')
+ --count;
- if (i > 0 && strm->buffer[i - 1] == '\r')
- --i;
+ have_line = true;
} else {
- strm->buffer_offset = i;
+ count = i;
}
- new = realloc(line, line_len + i + 1);
+ new = realloc(line, line_len + count + 1);
if (new == NULL)
goto fail_errno;
line = new;
- memcpy(line + line_len, strm->buffer, i);
- line_len += i;
+ memcpy(line + line_len, strm->buffer, count);
+ line_len += count;
line[line_len] = '\0';
+ strm->buffer += i;
+ strm->buffer_used -= i;
+
if (have_line) {
line_len = trim(line, flags);