From: Florian Forster Date: Sun, 12 May 2013 10:17:47 +0000 (+0200) Subject: src/common.[ch]: Add the ssnprintf_alloc() function. X-Git-Tag: collectd-5.4.0~44 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=80be251e335e8da43788ec50cec29bb38e11c24b;p=collectd.git src/common.[ch]: Add the ssnprintf_alloc() function. --- diff --git a/src/common.c b/src/common.c index 79e4c02c..d963efa5 100644 --- a/src/common.c +++ b/src/common.c @@ -86,6 +86,47 @@ int ssnprintf (char *dest, size_t n, const char *format, ...) return (ret); } /* int ssnprintf */ +char *ssnprintf_alloc (char const *format, ...) /* {{{ */ +{ + char static_buffer[1024] = ""; + char *alloc_buffer; + size_t alloc_buffer_size; + int status; + va_list ap; + + /* Try printing into the static buffer. In many cases it will be + * sufficiently large and we can simply return a strdup() of this + * buffer. */ + va_start (ap, format); + status = vsnprintf (static_buffer, sizeof (static_buffer), format, ap); + va_end (ap); + if (status < 0) + return (NULL); + + /* "status" does not include the null byte. */ + alloc_buffer_size = (size_t) (status + 1); + if (alloc_buffer_size <= sizeof (static_buffer)) + return (strdup (static_buffer)); + + /* Allocate a buffer large enough to hold the string. */ + alloc_buffer = malloc (alloc_buffer_size); + if (alloc_buffer == NULL) + return (NULL); + memset (alloc_buffer, 0, alloc_buffer_size); + + /* Print again into this new buffer. */ + va_start (ap, format); + status = vsnprintf (alloc_buffer, alloc_buffer_size, format, ap); + va_end (ap); + if (status < 0) + { + sfree (alloc_buffer); + return (NULL); + } + + return (alloc_buffer); +} /* }}} char *ssnprintf_alloc */ + char *sstrdup (const char *s) { char *r; diff --git a/src/common.h b/src/common.h index 7c0d9369..317be8d1 100644 --- a/src/common.h +++ b/src/common.h @@ -56,7 +56,13 @@ struct rate_to_value_state_s typedef struct rate_to_value_state_s rate_to_value_state_t; char *sstrncpy (char *dest, const char *src, size_t n); + +__attribute__ ((format(printf,3,4))) int ssnprintf (char *dest, size_t n, const char *format, ...); + +__attribute__ ((format(printf,1,2))) +char *ssnprintf_alloc (char const *format, ...); + char *sstrdup(const char *s); void *smalloc(size_t size); char *sstrerror (int errnum, char *buf, size_t buflen);