diff options
Diffstat (limited to 'src/libopkg/.svn/text-base/sprintf_alloc.c.svn-base')
-rw-r--r-- | src/libopkg/.svn/text-base/sprintf_alloc.c.svn-base | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/libopkg/.svn/text-base/sprintf_alloc.c.svn-base b/src/libopkg/.svn/text-base/sprintf_alloc.c.svn-base new file mode 100644 index 0000000..aef8e06 --- /dev/null +++ b/src/libopkg/.svn/text-base/sprintf_alloc.c.svn-base @@ -0,0 +1,49 @@ +/* sprintf_alloc.c -- like sprintf with memory allocation + + Copyright (C) 2010 Ubiq Technologies <graham.gower@gmail.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +*/ + +#include <stdarg.h> + +#include "sprintf_alloc.h" +#include "libbb/libbb.h" + +void +sprintf_alloc(char **str, const char *fmt, ...) +{ + va_list ap; + int n; + unsigned int size = 0; + + *str = NULL; + + for (;;) { + va_start(ap, fmt); + n = vsnprintf (*str, size, fmt, ap); + va_end(ap); + + if (n < 0) { + fprintf(stderr, "%s: encountered an output or encoding" + " error during vsnprintf.\n", + __FUNCTION__); + exit(EXIT_FAILURE); + } + + if (n < size) + break; + + /* Truncated, try again with more space. */ + size = n+1; + *str = xrealloc(*str, size); + } +} |