|
30 | 30 | #include <__config> |
31 | 31 | #include <__cstddef/size_t.h> |
32 | 32 | #include <__std_mbstate_t.h> |
33 | | -#include <cstdarg> |
| 33 | +#include <__utility/forward.h> |
34 | 34 |
|
35 | 35 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
36 | 36 | # pragma GCC system_header |
@@ -82,31 +82,32 @@ __libcpp_mbsrtowcs_l(wchar_t* __dest, const char** __src, size_t __len, mbstate_ |
82 | 82 | } |
83 | 83 | #endif |
84 | 84 |
|
85 | | -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 4, 5) int __libcpp_snprintf_l( |
86 | | - char* __s, size_t __n, locale_t __loc, const char* __format, ...) { |
87 | | - va_list __va; |
88 | | - va_start(__va, __format); |
89 | | - int __res = ::vsnprintf_l(__s, __n, __loc, __format, __va); |
90 | | - va_end(__va); |
91 | | - return __res; |
| 85 | +template <class... _Args> |
| 86 | +_LIBCPP_HIDE_FROM_ABI int |
| 87 | +__libcpp_snprintf_l(char* __s, size_t __n, locale_t __loc, const char* __format, _Args&&... __args) { |
| 88 | + _LIBCPP_DIAGNOSTIC_PUSH |
| 89 | + _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 90 | + _LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 91 | + return ::snprintf_l(__s, __n, __loc, __format, std::forward<_Args>(__args)...); |
| 92 | + _LIBCPP_DIAGNOSTIC_POP |
92 | 93 | } |
93 | 94 |
|
94 | | -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4) int __libcpp_asprintf_l( |
95 | | - char** __s, locale_t __loc, const char* __format, ...) { |
96 | | - va_list __va; |
97 | | - va_start(__va, __format); |
98 | | - int __res = ::vasprintf_l(__s, __loc, __format, __va); |
99 | | - va_end(__va); |
100 | | - return __res; |
| 95 | +template <class... _Args> |
| 96 | +_LIBCPP_HIDE_FROM_ABI int __libcpp_asprintf_l(char** __s, locale_t __loc, const char* __format, _Args&&... __args) { |
| 97 | + _LIBCPP_DIAGNOSTIC_PUSH |
| 98 | + _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 99 | + _LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 100 | + return ::asprintf_l(__s, __loc, __format, std::forward<_Args>(__args)...); |
| 101 | + _LIBCPP_DIAGNOSTIC_POP |
101 | 102 | } |
102 | 103 |
|
103 | | -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_ATTRIBUTE_FORMAT(__scanf__, 3, 4) int __libcpp_sscanf_l( |
104 | | - const char* __s, locale_t __loc, const char* __format, ...) { |
105 | | - va_list __va; |
106 | | - va_start(__va, __format); |
107 | | - int __res = ::vsscanf_l(__s, __loc, __format, __va); |
108 | | - va_end(__va); |
109 | | - return __res; |
| 104 | +template <class... _Args> |
| 105 | +_LIBCPP_HIDE_FROM_ABI int __libcpp_sscanf_l(const char* __s, locale_t __loc, const char* __format, _Args&&... __args) { |
| 106 | + _LIBCPP_DIAGNOSTIC_PUSH |
| 107 | + _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 108 | + _LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") |
| 109 | + return ::sscanf_l(__s, __loc, __format, std::forward<_Args>(__args)...); |
| 110 | + _LIBCPP_DIAGNOSTIC_POP |
110 | 111 | } |
111 | 112 |
|
112 | 113 | _LIBCPP_END_NAMESPACE_STD |
|
0 commit comments