changeset 128:7e72d4008f6d

Little changes in buffer
author David Demelier <markand@malikania.fr>
date Thu, 08 Mar 2012 10:27:27 +0100
parents e00bc8f7eabf
children 2f71e113be63
files buf.c
diffstat 1 files changed, 11 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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