Stop using WX_DEFINE_VARARG_FUNC() macros for CRT vararg wrappers
Use variadic templates for them too, this is slightly more verbose, but much more clear and simpler to read, debug etc. We can now also easily combine the wxS[n]printf() overloads for char and wchar_t buffers into a single template function.
This commit is contained in:
parent
31fba462d2
commit
4bcf6f814a
1 changed files with 68 additions and 25 deletions
|
|
@ -237,21 +237,43 @@
|
|||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxGCC_ONLY_WARNING_SUPPRESS(format-nonliteral)
|
||||
wxGCC_ONLY_WARNING_SUPPRESS(format-security)
|
||||
|
||||
WX_DEFINE_VARARG_FUNC_SANS_N0(int, wxPrintf, 1, (const wxFormatString&),
|
||||
wxCRT_PrintfW, wxCRT_PrintfA)
|
||||
inline int wxPrintf(const wxFormatString& s)
|
||||
template <typename... Targs>
|
||||
int wxPrintf(const wxFormatString& format, Targs... args)
|
||||
{
|
||||
return wxPrintf(wxASCII_STR("%s"), s.InputAsString());
|
||||
format.Validate({wxFormatStringSpecifier<Targs>::value...});
|
||||
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
if ( wxLocaleIsUtf8 )
|
||||
#endif
|
||||
return wxCRT_PrintfA(format, wxArgNormalizerUtf8<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // wxUSE_UNICODE_UTF8
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
return wxCRT_PrintfW(format, wxArgNormalizerWchar<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // !wxUSE_UTF8_LOCALE_ONLY
|
||||
}
|
||||
|
||||
WX_DEFINE_VARARG_FUNC_SANS_N0(int, wxFprintf, 2, (FILE*, const wxFormatString&),
|
||||
wxCRT_FprintfW, wxCRT_FprintfA)
|
||||
inline int wxFprintf(FILE *f, const wxFormatString& s)
|
||||
template <typename... Targs>
|
||||
int wxFprintf(FILE* fp, const wxFormatString& format, Targs... args)
|
||||
{
|
||||
return wxFprintf(f, wxASCII_STR("%s"), s.InputAsString());
|
||||
format.Validate({wxFormatStringSpecifier<Targs>::value...});
|
||||
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
if ( wxLocaleIsUtf8 )
|
||||
#endif
|
||||
return wxCRT_FprintfA(fp, format, wxArgNormalizerUtf8<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // wxUSE_UNICODE_UTF8
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
return wxCRT_FprintfW(fp, format, wxArgNormalizerWchar<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // !wxUSE_UTF8_LOCALE_ONLY
|
||||
}
|
||||
|
||||
wxGCC_ONLY_WARNING_RESTORE(format-security)
|
||||
wxGCC_ONLY_WARNING_RESTORE(format-nonliteral)
|
||||
|
||||
// va_list versions of printf functions simply forward to the respective
|
||||
|
|
@ -296,49 +318,70 @@ wxVfprintf(FILE *f, const wxString& format, va_list ap)
|
|||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfWchar(char *str, const wxChar *format, ...);
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfWchar(wchar_t *str, const wxChar *format, ...);
|
||||
#endif
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfUtf8(char *str, const char *format, ...);
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfUtf8(wchar_t *str, const char *format, ...);
|
||||
#endif
|
||||
WX_DEFINE_VARARG_FUNC(int, wxSprintf, 2, (char*, const wxFormatString&),
|
||||
wxDoSprintfWchar, wxDoSprintfUtf8)
|
||||
|
||||
template <typename CharType, typename... Targs>
|
||||
int wxSprintf(CharType* str, const wxFormatString& format, Targs... args)
|
||||
{
|
||||
format.Validate({wxFormatStringSpecifier<Targs>::value...});
|
||||
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
if ( wxLocaleIsUtf8 )
|
||||
#endif
|
||||
return wxDoSprintfUtf8(str, format, wxArgNormalizerUtf8<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // wxUSE_UNICODE_UTF8
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
return wxDoSprintfWchar(str, format, wxArgNormalizerWchar<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // !wxUSE_UTF8_LOCALE_ONLY
|
||||
}
|
||||
|
||||
int WXDLLIMPEXP_BASE
|
||||
wxVsprintf(char *str, const wxString& format, va_list argptr);
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfWchar(char *str, size_t size, const wxChar *format, ...);
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfWchar(wchar_t *str, size_t size, const wxChar *format, ...);
|
||||
#endif
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfUtf8(char *str, size_t size, const char *format, ...);
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfUtf8(wchar_t *str, size_t size, const char *format, ...);
|
||||
#endif
|
||||
WX_DEFINE_VARARG_FUNC(int, wxSnprintf, 3, (char*, size_t, const wxFormatString&),
|
||||
wxDoSnprintfWchar, wxDoSnprintfUtf8)
|
||||
|
||||
template <typename CharType, typename... Targs>
|
||||
int wxSnprintf(CharType* str, size_t size, const wxFormatString& format, Targs... args)
|
||||
{
|
||||
format.Validate({wxFormatStringSpecifier<Targs>::value...});
|
||||
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
if ( wxLocaleIsUtf8 )
|
||||
#endif
|
||||
return wxDoSnprintfUtf8(str, size, format, wxArgNormalizerUtf8<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // wxUSE_UNICODE_UTF8
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
return wxDoSnprintfWchar(str, size, format, wxArgNormalizerWchar<Targs>{args, nullptr, 0}.get()...);
|
||||
#endif // !wxUSE_UTF8_LOCALE_ONLY
|
||||
}
|
||||
|
||||
int WXDLLIMPEXP_BASE
|
||||
wxVsnprintf(char *str, size_t size, const wxString& format, va_list argptr);
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfWchar(wchar_t *str, const wxChar *format, ...);
|
||||
#endif
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
int WXDLLIMPEXP_BASE wxDoSprintfUtf8(wchar_t *str, const char *format, ...);
|
||||
#endif
|
||||
WX_DEFINE_VARARG_FUNC(int, wxSprintf, 2, (wchar_t*, const wxFormatString&),
|
||||
wxDoSprintfWchar, wxDoSprintfUtf8)
|
||||
|
||||
int WXDLLIMPEXP_BASE
|
||||
wxVsprintf(wchar_t *str, const wxString& format, va_list argptr);
|
||||
|
||||
#if !wxUSE_UTF8_LOCALE_ONLY
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfWchar(wchar_t *str, size_t size, const wxChar *format, ...);
|
||||
#endif
|
||||
#if wxUSE_UNICODE_UTF8
|
||||
int WXDLLIMPEXP_BASE wxDoSnprintfUtf8(wchar_t *str, size_t size, const char *format, ...);
|
||||
#endif
|
||||
WX_DEFINE_VARARG_FUNC(int, wxSnprintf, 3, (wchar_t*, size_t, const wxFormatString&),
|
||||
wxDoSnprintfWchar, wxDoSnprintfUtf8)
|
||||
|
||||
int WXDLLIMPEXP_BASE
|
||||
wxVsnprintf(wchar_t *str, size_t size, const wxString& format, va_list argptr);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue