2007-12-05 21:35:32 +00:00
/* vsprintf with automatic memory allocation.
Copyright ( C ) 2002 - 2004 , 2007 Free Software Foundation , Inc .
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU Lesser General Public License as published by
2007-12-07 14:32:35 +00:00
the Free Software Foundation ; either version 2.1 , or ( at your option )
2007-12-05 21:35:32 +00:00
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 Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License along
with this program ; if not , write to the Free Software Foundation ,
Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA . */
# ifndef _VASNPRINTF_H
# define _VASNPRINTF_H
/* Get va_list. */
# include <stdarg.h>
/* Get size_t. */
# include <stddef.h>
# ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
# define __attribute__(Spec) /* empty */
# endif
/* The __-protected variants of `format' and `printf' attributes
are accepted by gcc versions 2.6 .4 ( effectively 2.7 ) and later . */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
# define __format__ format
# define __printf__ printf
# endif
# endif
# ifdef __cplusplus
extern " C " {
# endif
/* Write formatted output to a string dynamically allocated with malloc().
You can pass a preallocated buffer for the result in RESULTBUF and its
size in * LENGTHP ; otherwise you pass RESULTBUF = NULL .
If successful , return the address of the string ( this may be = RESULTBUF
if no dynamic memory allocation was necessary ) and set * LENGTHP to the
number of resulting bytes , excluding the trailing NUL . Upon error , set
errno and return NULL .
When dynamic memory allocation occurs , the preallocated buffer is left
alone ( with possibly modified contents ) . This makes it possible to use
a statically allocated or stack - allocated buffer , like this :
char buf [ 100 ] ;
size_t len = sizeof ( buf ) ;
char * output = vasnprintf ( buf , & len , format , args ) ;
if ( output = = NULL )
. . . error handling . . . ;
else
{
. . . use the output string . . . ;
if ( output ! = buf )
free ( output ) ;
}
*/
# if REPLACE_VASNPRINTF
# define asnprintf rpl_asnprintf
# define vasnprintf rpl_vasnprintf
# endif
extern char * asnprintf ( char * resultbuf , size_t * lengthp , const char * format , . . . )
__attribute__ ( ( __format__ ( __printf__ , 3 , 4 ) ) ) ;
extern char * vasnprintf ( char * resultbuf , size_t * lengthp , const char * format , va_list args )
__attribute__ ( ( __format__ ( __printf__ , 3 , 0 ) ) ) ;
# ifdef __cplusplus
}
# endif
# endif /* _VASNPRINTF_H */