xref: /freebsd/contrib/libpcap/missing/win_asprintf.c (revision 02e9120893770924227138ba49df1edb3896112a)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 
5 #include "portability.h"
6 
7 int
8 pcap_vasprintf(char **strp, const char *format, va_list args)
9 {
10 	int len;
11 	size_t str_size;
12 	char *str;
13 	int ret;
14 
15 	len = _vscprintf(format, args);
16 	if (len == -1) {
17 		*strp = NULL;
18 		return (-1);
19 	}
20 	str_size = len + 1;
21 	str = malloc(str_size);
22 	if (str == NULL) {
23 		*strp = NULL;
24 		return (-1);
25 	}
26 	ret = vsnprintf(str, str_size, format, args);
27 	if (ret == -1) {
28 		free(str);
29 		*strp = NULL;
30 		return (-1);
31 	}
32 	*strp = str;
33 	/*
34 	 * vsnprintf() shouldn't truncate the string, as we have
35 	 * allocated a buffer large enough to hold the string, so its
36 	 * return value should be the number of characters printed.
37 	 */
38 	return (ret);
39 }
40 
41 int
42 pcap_asprintf(char **strp, const char *format, ...)
43 {
44 	va_list args;
45 	int ret;
46 
47 	va_start(args, format);
48 	ret = pcap_vasprintf(strp, format, args);
49 	va_end(args);
50 	return (ret);
51 }
52