1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2025 Chelsio Communications, Inc.
5 * Written by: John Baldwin <jhb@FreeBSD.org>
6 */
7
8 #include <cstdarg>
9 #include <cstdio>
10 #include <string>
11
12 #include "libutil++.hh"
13
14 static int
stringf_write(void * cookie,const char * buf,int len)15 stringf_write(void *cookie, const char *buf, int len)
16 {
17 std::string *str = reinterpret_cast<std::string *>(cookie);
18 try {
19 str->append(buf, len);
20 } catch (std::bad_alloc) {
21 errno = ENOMEM;
22 return (-1);
23 } catch (std::length_error) {
24 errno = EFBIG;
25 return (-1);
26 }
27 return (len);
28 }
29
30 std::string
stringf(const char * fmt,va_list ap)31 freebsd::stringf(const char *fmt, va_list ap)
32 {
33 std::string str;
34 freebsd::FILE_up fp(fwopen(reinterpret_cast<void *>(&str),
35 stringf_write));
36
37 vfprintf(fp.get(), fmt, ap);
38
39 if (ferror(fp.get()))
40 throw std::bad_alloc();
41 fp.reset(nullptr);
42
43 return str;
44 }
45
46 std::string
stringf(const char * fmt,...)47 freebsd::stringf(const char *fmt, ...)
48 {
49 std::va_list ap;
50 std::string str;
51
52 va_start(ap, fmt);
53 str = freebsd::stringf(fmt, ap);
54 va_end(ap);
55
56 return str;
57 }
58