xref: /freebsd/contrib/libpcap/missing/win_asprintf.c (revision afdbf109c6a661a729938f68211054a0a50d38ac)
157e22627SCy Schubert #include <stdio.h>
257e22627SCy Schubert #include <stdlib.h>
357e22627SCy Schubert #include <stdarg.h>
457e22627SCy Schubert 
557e22627SCy Schubert #include "portability.h"
657e22627SCy Schubert 
757e22627SCy Schubert int
pcapint_vasprintf(char ** strp,const char * format,va_list args)8*afdbf109SJoseph Mingrone pcapint_vasprintf(char **strp, const char *format, va_list args)
957e22627SCy Schubert {
1057e22627SCy Schubert 	int len;
1157e22627SCy Schubert 	size_t str_size;
1257e22627SCy Schubert 	char *str;
1357e22627SCy Schubert 	int ret;
1457e22627SCy Schubert 
1557e22627SCy Schubert 	len = _vscprintf(format, args);
1657e22627SCy Schubert 	if (len == -1) {
1757e22627SCy Schubert 		*strp = NULL;
1857e22627SCy Schubert 		return (-1);
1957e22627SCy Schubert 	}
2057e22627SCy Schubert 	str_size = len + 1;
2157e22627SCy Schubert 	str = malloc(str_size);
2257e22627SCy Schubert 	if (str == NULL) {
2357e22627SCy Schubert 		*strp = NULL;
2457e22627SCy Schubert 		return (-1);
2557e22627SCy Schubert 	}
266f9cba8fSJoseph Mingrone 	ret = vsnprintf(str, str_size, format, args);
2757e22627SCy Schubert 	if (ret == -1) {
2857e22627SCy Schubert 		free(str);
2957e22627SCy Schubert 		*strp = NULL;
3057e22627SCy Schubert 		return (-1);
3157e22627SCy Schubert 	}
3257e22627SCy Schubert 	*strp = str;
3357e22627SCy Schubert 	/*
346f9cba8fSJoseph Mingrone 	 * vsnprintf() shouldn't truncate the string, as we have
3557e22627SCy Schubert 	 * allocated a buffer large enough to hold the string, so its
3657e22627SCy Schubert 	 * return value should be the number of characters printed.
3757e22627SCy Schubert 	 */
3857e22627SCy Schubert 	return (ret);
3957e22627SCy Schubert }
4057e22627SCy Schubert 
4157e22627SCy Schubert int
pcapint_asprintf(char ** strp,const char * format,...)42*afdbf109SJoseph Mingrone pcapint_asprintf(char **strp, const char *format, ...)
4357e22627SCy Schubert {
4457e22627SCy Schubert 	va_list args;
4557e22627SCy Schubert 	int ret;
4657e22627SCy Schubert 
4757e22627SCy Schubert 	va_start(args, format);
48*afdbf109SJoseph Mingrone 	ret = pcapint_vasprintf(strp, format, args);
4957e22627SCy Schubert 	va_end(args);
5057e22627SCy Schubert 	return (ret);
5157e22627SCy Schubert }
52