1*b3127a2dSJohn Baldwin /*- 2*b3127a2dSJohn Baldwin * SPDX-License-Identifier: BSD-2-Clause 3*b3127a2dSJohn Baldwin * 4*b3127a2dSJohn Baldwin * Copyright (c) 2025 Chelsio Communications, Inc. 5*b3127a2dSJohn Baldwin * Written by: John Baldwin <jhb@FreeBSD.org> 6*b3127a2dSJohn Baldwin */ 7*b3127a2dSJohn Baldwin 8*b3127a2dSJohn Baldwin #ifndef __LIBUTILPP_HH__ 9*b3127a2dSJohn Baldwin #define __LIBUTILPP_HH__ 10*b3127a2dSJohn Baldwin 11*b3127a2dSJohn Baldwin #include <cstdarg> 12*b3127a2dSJohn Baldwin #include <cstdio> 13*b3127a2dSJohn Baldwin #include <cstdlib> 14*b3127a2dSJohn Baldwin #include <memory> 15*b3127a2dSJohn Baldwin 16*b3127a2dSJohn Baldwin namespace freebsd { 17*b3127a2dSJohn Baldwin /* 18*b3127a2dSJohn Baldwin * FILE_up is a std::unique_ptr<> for FILE objects which uses 19*b3127a2dSJohn Baldwin * fclose() to destroy the wrapped pointer. 20*b3127a2dSJohn Baldwin */ 21*b3127a2dSJohn Baldwin struct fclose_deleter { 22*b3127a2dSJohn Baldwin void operator() (std::FILE *fp) const 23*b3127a2dSJohn Baldwin { 24*b3127a2dSJohn Baldwin std::fclose(fp); 25*b3127a2dSJohn Baldwin } 26*b3127a2dSJohn Baldwin }; 27*b3127a2dSJohn Baldwin 28*b3127a2dSJohn Baldwin using FILE_up = std::unique_ptr<std::FILE, fclose_deleter>; 29*b3127a2dSJohn Baldwin 30*b3127a2dSJohn Baldwin /* 31*b3127a2dSJohn Baldwin * malloc_up<T> is a std::unique_ptr<> which uses free() to 32*b3127a2dSJohn Baldwin * destroy the wrapped pointer. This can be used to wrap 33*b3127a2dSJohn Baldwin * pointers allocated implicitly by malloc() such as those 34*b3127a2dSJohn Baldwin * returned by strdup(). 35*b3127a2dSJohn Baldwin */ 36*b3127a2dSJohn Baldwin template <class T> 37*b3127a2dSJohn Baldwin struct free_deleter { 38*b3127a2dSJohn Baldwin void operator() (T *p) const 39*b3127a2dSJohn Baldwin { 40*b3127a2dSJohn Baldwin std::free(p); 41*b3127a2dSJohn Baldwin } 42*b3127a2dSJohn Baldwin }; 43*b3127a2dSJohn Baldwin 44*b3127a2dSJohn Baldwin template <class T> 45*b3127a2dSJohn Baldwin using malloc_up = std::unique_ptr<T, free_deleter<T>>; 46*b3127a2dSJohn Baldwin 47*b3127a2dSJohn Baldwin /* 48*b3127a2dSJohn Baldwin * Returns a std::string containing the same output as 49*b3127a2dSJohn Baldwin * sprintf(). Throws std::bad_alloc if an error occurs. 50*b3127a2dSJohn Baldwin */ 51*b3127a2dSJohn Baldwin std::string stringf(const char *fmt, ...) __printflike(1, 2); 52*b3127a2dSJohn Baldwin std::string stringf(const char *fmt, std::va_list ap); 53*b3127a2dSJohn Baldwin } 54*b3127a2dSJohn Baldwin 55*b3127a2dSJohn Baldwin #endif /* !__LIBUTILPP_HH__ */ 56