diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2017-07-14 08:24:46 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2017-07-14 08:24:46 -0400 |
| commit | 1ea6b3f237295a7e7dae3a46a4d07b41a6453c04 (patch) | |
| tree | a8803b2d31a56e6d5296c1d1880205525a015c45 /lib/buffer.c | |
| parent | da571b7a6c5326447399ff78439c87639fa51e19 (diff) | |
| parent | 28bd1c1158c10268655878d12e5d8f17737de1bb (diff) | |
Merge remote-tracking branch 'origin/master' into evpn_plus_struct_attr
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 |
