xref: /netbsd-src/external/bsd/libpcap/dist/missing/win_asprintf.c (revision f73a5f05f638a81353839a8e4bfc90d1189181e7)
14a71e5f3Schristos #include <stdio.h>
24a71e5f3Schristos #include <stdlib.h>
34a71e5f3Schristos #include <stdarg.h>
44a71e5f3Schristos 
54a71e5f3Schristos #include "portability.h"
64a71e5f3Schristos 
74a71e5f3Schristos int
8*f73a5f05Schristos pcapint_vasprintf(char **strp, const char *format, va_list args)
94a71e5f3Schristos {
104a71e5f3Schristos 	int len;
114a71e5f3Schristos 	size_t str_size;
124a71e5f3Schristos 	char *str;
134a71e5f3Schristos 	int ret;
144a71e5f3Schristos 
154a71e5f3Schristos 	len = _vscprintf(format, args);
164a71e5f3Schristos 	if (len == -1) {
174a71e5f3Schristos 		*strp = NULL;
184a71e5f3Schristos 		return (-1);
194a71e5f3Schristos 	}
204a71e5f3Schristos 	str_size = len + 1;
214a71e5f3Schristos 	str = malloc(str_size);
224a71e5f3Schristos 	if (str == NULL) {
234a71e5f3Schristos 		*strp = NULL;
244a71e5f3Schristos 		return (-1);
254a71e5f3Schristos 	}
26748408edSchristos 	ret = vsnprintf(str, str_size, format, args);
274a71e5f3Schristos 	if (ret == -1) {
284a71e5f3Schristos 		free(str);
294a71e5f3Schristos 		*strp = NULL;
304a71e5f3Schristos 		return (-1);
314a71e5f3Schristos 	}
324a71e5f3Schristos 	*strp = str;
334a71e5f3Schristos 	/*
34748408edSchristos 	 * vsnprintf() shouldn't truncate the string, as we have
354a71e5f3Schristos 	 * allocated a buffer large enough to hold the string, so its
364a71e5f3Schristos 	 * return value should be the number of characters printed.
374a71e5f3Schristos 	 */
384a71e5f3Schristos 	return (ret);
394a71e5f3Schristos }
404a71e5f3Schristos 
414a71e5f3Schristos int
42*f73a5f05Schristos pcapint_asprintf(char **strp, const char *format, ...)
434a71e5f3Schristos {
444a71e5f3Schristos 	va_list args;
454a71e5f3Schristos 	int ret;
464a71e5f3Schristos 
474a71e5f3Schristos 	va_start(args, format);
48*f73a5f05Schristos 	ret = pcapint_vasprintf(strp, format, args);
494a71e5f3Schristos 	va_end(args);
504a71e5f3Schristos 	return (ret);
514a71e5f3Schristos }
52