# HG changeset patch # User David Demelier # Date 1331198847 -3600 # Node ID 7e72d4008f6d0ac3f7e00d947ccb9cab6fa040de # Parent e00bc8f7eabf7fc18786e39683ec528d07f43bd3 Little changes in buffer diff -r e00bc8f7eabf -r 7e72d4008f6d buf.c --- a/buf.c Wed Mar 07 10:22:18 2012 +0100 +++ b/buf.c Thu Mar 08 10:27:27 2012 +0100 @@ -22,7 +22,7 @@ #include "buf.h" -#define BUF_AVAIL(buf) ((buf)->alsize - (buf)->length - 1) +#define BUF_AVAIL(buf) ((buf)->alsize - (buf)->length) #define BUF_SAFE(buf) (!((buf)->flags & BUF_UNSAFE)) #define BUF_FIXED(buf) ((buf)->flags & BUF_FIXED) #define BUF_AUTO(buf) (buf->flags == 0) @@ -59,7 +59,7 @@ for (tocopy = 0; str[tocopy] != '\0' && tocopy < max; ++tocopy) continue; - if (BUF_AVAIL(buf) < tocopy) { + if (BUF_AVAIL(buf) <= tocopy) { /* Can't add more */ if (BUF_SAFE(buf) && BUF_FIXED(buf)) return -1; @@ -69,7 +69,7 @@ return -1; } else { /* String is unsafe, truncate to the available size */ - tocopy = BUF_AVAIL(buf); + tocopy = BUF_AVAIL(buf) - 1; } } @@ -119,7 +119,7 @@ int buf_vprintf(struct buf *buf, const char *fmt, va_list ap) { - int copied, done = 0; + int copied, rv = 0, done = 0; if (BUF_FIXED(buf) && BUF_SAFE(buf)) return -1; @@ -128,8 +128,6 @@ copied = vsnprintf(&buf->text[buf->length], BUF_AVAIL(buf), fmt, ap); - buf->length = strlen(buf->text); - if (copied >= (signed int)BUF_AVAIL(buf) || copied == -1) { if (BUF_FIXED(buf)) done = 1; @@ -138,14 +136,18 @@ * vsnprintf returns -1 on windows, we need to grow * the buffer by block size. */ - if (grow(buf, buf->alsize + buf->bsize) < 0) - return -1; + if (grow(buf, buf->alsize + buf->bsize) < 0) { + done = 1; + rv = -1; + } } else { done = 1; } } while (!done); - return 0; + buf->length = strlen(buf->text); + + return rv; } int