diff options
author | Miloslav Trmač <mitr@redhat.com> | 2012-07-18 15:56:39 +0200 |
---|---|---|
committer | Miloslav Trmač <mitr@redhat.com> | 2012-07-18 17:11:34 +0200 |
commit | b7ac3c8762571a756aeb4fe0198ddd97745fa65f (patch) | |
tree | 9f1bbfa449a45fb9be467d9426f6237d268eaf8c /lib | |
parent | 1f61e8f16e22a3877a5e3d6cb37e7a9671b0eea2 (diff) | |
download | libumberlog-b7ac3c8762571a756aeb4fe0198ddd97745fa65f.tar.gz libumberlog-b7ac3c8762571a756aeb4fe0198ddd97745fa65f.tar.xz libumberlog-b7ac3c8762571a756aeb4fe0198ddd97745fa65f.zip |
Add helper function _ul_vasprintf_and_advance
... simplifying the callers of _ul_va_spin.
Signed-off-by: Miloslav Trmač <mitr@redhat.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/umberlog.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/lib/umberlog.c b/lib/umberlog.c index 3811da3..5666ac1 100644 --- a/lib/umberlog.c +++ b/lib/umberlog.c @@ -254,6 +254,29 @@ _ul_va_spin (const char *fmt, va_list *pap) } } +/* Return a newly allocated string. + On failure, NULL is returned and it is undefined what PAP points to. */ +static char * +_ul_vasprintf_and_advance (const char *fmt, va_list *pap) +{ + va_list aq; + size_t i; + char *res; + + va_copy (aq, *pap); + if (vasprintf (&res, fmt, aq) == -1) + { + va_end (aq); + return NULL; + } + va_end (aq); + if (res == NULL) + return NULL; + + _ul_va_spin (fmt, pap); + return res; +} + static inline ul_buffer_t * _ul_json_vappend (ul_buffer_t *buffer, va_list ap_orig) { @@ -265,27 +288,16 @@ _ul_json_vappend (ul_buffer_t *buffer, va_list ap_orig) while ((key = (char *)va_arg (ap, char *)) != NULL) { char *fmt = (char *)va_arg (ap, char *); - char *value = NULL; - va_list aq; - - va_copy (aq, ap); - if (vasprintf (&value, fmt, aq) == -1) - { - va_end (aq); - goto err; - } - va_end (aq); + char *value; + value = _ul_vasprintf_and_advance (fmt, &ap); if (!value) goto err; - buffer = ul_buffer_append (buffer, key, value); free (value); if (buffer == NULL) goto err; - - _ul_va_spin (fmt, &ap); } va_end (ap); @@ -359,13 +371,7 @@ _ul_vformat (ul_buffer_t *buffer, int format_version, /* "&ap" may not be possible for function parameters, so make a copy. */ va_copy (ap, ap_orig); - va_copy (aq, ap); - if (vasprintf (&value, msg_format, aq) == -1) - { - va_end (aq); - goto err; - } - va_end (aq); + value = _ul_vasprintf_and_advance (msg_format, &ap); if (!value) goto err; @@ -378,8 +384,6 @@ _ul_vformat (ul_buffer_t *buffer, int format_version, if (buffer == NULL) goto err; - _ul_va_spin (msg_format, &ap); - if (format_version > 0) buffer = _ul_json_vappend (buffer, ap); |