diff options
| author | Russ White <russ@riw.us> | 2017-07-14 08:00:43 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-14 08:00:43 -0400 |
| commit | 28bd1c1158c10268655878d12e5d8f17737de1bb (patch) | |
| tree | 576ef3527922cd2a0fec59fadf1cff947e8f2079 /lib/buffer.c | |
| parent | eef83e96f7141c8b016462195e01b824c600c89e (diff) | |
| parent | 28b672fcd33f328964c91f0a3d06cd904bddad42 (diff) | |
Merge pull request #813 from opensourcerouting/newline-redux
newline redux
Diffstat (limited to 'lib/buffer.c')
| -rw-r--r-- | lib/buffer.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/buffer.c b/lib/buffer.c index 649677fc93..5d458901ee 100644 --- a/lib/buffer.c +++ b/lib/buffer.c @@ -199,6 +199,50 @@ buffer_putstr (struct buffer *b, const char *c) buffer_put(b, c, strlen(c)); } +/* Expand \n to \r\n */ +void +buffer_put_crlf(struct buffer *b, const void *origp, size_t origsize) +{ + struct buffer_data *data = b->tail; + const char *p = origp, *end = p + origsize, *lf; + size_t size; + + lf = memchr(p, '\n', end - p); + + /* We use even last one byte of data buffer. */ + while (p < end) + { + size_t avail, chunk; + + /* If there is no data buffer add it. */ + if (data == NULL || data->cp == b->size) + data = buffer_add (b); + + size = (lf ? lf : end) - p; + avail = b->size - data->cp; + + chunk = (size <= avail) ? size : avail; + memcpy (data->data + data->cp, p, chunk); + + p += chunk; + data->cp += chunk; + + if (lf && size <= avail) + { + /* we just copied up to (including) a '\n' */ + if (data->cp == b->size) + data = buffer_add (b); + data->data[data->cp++] = '\r'; + if (data->cp == b->size) + data = buffer_add (b); + data->data[data->cp++] = '\n'; + + p++; + lf = memchr(p, '\n', end - p); + } + } +} + /* Keep flushing data to the fd until the buffer is empty or an error is encountered or the operation would block. */ buffer_status_t |
