xref: /illumos-gate/usr/src/tools/smatch/src/utils.c (revision c85f09cc)
1*c85f09ccSJohn Levon // SPDX-License-Identifier: MIT
2*c85f09ccSJohn Levon // Copyright (C) 2018 Luc Van Oostenryck
3*c85f09ccSJohn Levon 
4*c85f09ccSJohn Levon #include "utils.h"
5*c85f09ccSJohn Levon #include "allocate.h"
6*c85f09ccSJohn Levon #include <string.h>
7*c85f09ccSJohn Levon #include <stdarg.h>
8*c85f09ccSJohn Levon #include <stdio.h>
9*c85f09ccSJohn Levon 
10*c85f09ccSJohn Levon 
xmemdup(const void * src,size_t len)11*c85f09ccSJohn Levon void *xmemdup(const void *src, size_t len)
12*c85f09ccSJohn Levon {
13*c85f09ccSJohn Levon 	return memcpy(__alloc_bytes(len), src, len);
14*c85f09ccSJohn Levon }
15*c85f09ccSJohn Levon 
xstrdup(const char * src)16*c85f09ccSJohn Levon char *xstrdup(const char *src)
17*c85f09ccSJohn Levon {
18*c85f09ccSJohn Levon 	return xmemdup(src, strlen(src) + 1);
19*c85f09ccSJohn Levon }
20*c85f09ccSJohn Levon 
xvasprintf(const char * fmt,va_list ap)21*c85f09ccSJohn Levon char *xvasprintf(const char *fmt, va_list ap)
22*c85f09ccSJohn Levon {
23*c85f09ccSJohn Levon 	va_list ap2;
24*c85f09ccSJohn Levon 	char *str;
25*c85f09ccSJohn Levon 	int n;
26*c85f09ccSJohn Levon 
27*c85f09ccSJohn Levon 	va_copy(ap2, ap);
28*c85f09ccSJohn Levon 	n = vsnprintf(NULL, 0, fmt, ap2) + 1;
29*c85f09ccSJohn Levon 	va_end(ap2);
30*c85f09ccSJohn Levon 
31*c85f09ccSJohn Levon 	str = __alloc_bytes(n);
32*c85f09ccSJohn Levon 	vsnprintf(str, n, fmt, ap);
33*c85f09ccSJohn Levon 
34*c85f09ccSJohn Levon 	return str;
35*c85f09ccSJohn Levon }
36*c85f09ccSJohn Levon 
xasprintf(const char * fmt,...)37*c85f09ccSJohn Levon char *xasprintf(const char *fmt, ...)
38*c85f09ccSJohn Levon {
39*c85f09ccSJohn Levon 	va_list ap;
40*c85f09ccSJohn Levon 	char *str;
41*c85f09ccSJohn Levon 
42*c85f09ccSJohn Levon 	va_start(ap, fmt);
43*c85f09ccSJohn Levon 	str = xvasprintf(fmt, ap);
44*c85f09ccSJohn Levon 	va_end(ap);
45*c85f09ccSJohn Levon 
46*c85f09ccSJohn Levon 	return str;
47*c85f09ccSJohn Levon }
48