summaryrefslogtreecommitdiff
path: root/ext/syck/emitter.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/syck/emitter.c')
-rw-r--r--ext/syck/emitter.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c
index 1cc0ea5075..4dcc8b3fc5 100644
--- a/ext/syck/emitter.c
+++ b/ext/syck/emitter.c
@@ -232,9 +232,18 @@ syck_emitter_write( SyckEmitter *e, char *str, long len )
* Flush if at end of buffer
*/
at = e->marker - e->buffer;
- if ( len + at > e->bufsize )
+ if ( len + at >= e->bufsize )
{
syck_emitter_flush( e, 0 );
+ for (;;) {
+ long rest = e->bufsize - (e->marker - e->buffer);
+ if (len <= rest) break;
+ S_MEMCPY( e->marker, str, char, rest );
+ e->marker += len;
+ str += rest;
+ len -= rest;
+ syck_emitter_flush( e, 0 );
+ }
}
/*