From b07c4162f4e1c5056e73500147a17f4e63abaaf4 Mon Sep 17 00:00:00 2001 From: Mark Pulford Date: Tue, 3 May 2011 00:23:16 +0930 Subject: Add strbuf_append_number() The separate strbuf_append_number() function avoids a potential double call to the slow vsnprintf() function required by strbuf_append_fmt(). Also inline strbuf_append_mem() since it is very simple and will be used often. --- strbuf.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'strbuf.c') diff --git a/strbuf.c b/strbuf.c index b6227fc..7a53a52 100644 --- a/strbuf.c +++ b/strbuf.c @@ -175,13 +175,6 @@ void strbuf_resize(strbuf_t *s, int len) s->reallocs++; } -void strbuf_append_mem(strbuf_t *s, const char *c, int len) -{ - strbuf_ensure_empty_length(s, len); - memcpy(s->buf + s->length, c, len); - s->length += len; -} - void strbuf_append_string(strbuf_t *s, const char *str) { int space, i; @@ -200,6 +193,24 @@ void strbuf_append_string(strbuf_t *s, const char *str) } } +void strbuf_append_number(strbuf_t *s, double number) +{ + int len; + + /* Lowest double printed with %.14g is 21 characters long: + * -1.7976931348623e+308 + * + * Use 32 to include the \0, and a few extra just in case.. + */ + strbuf_ensure_empty_length(s, 32); + + len = sprintf(s->buf + s->length, "%.14g", number); + if (len < 0) + die("BUG: Unable to convert number"); /* This should never happen.. */ + + s->length += len; +} + void strbuf_append_fmt(strbuf_t *s, const char *fmt, ...) { va_list arg; -- cgit v1.2.3