From a93cf225f709cd7d652707ffc37bdcd9f1d10e0c Mon Sep 17 00:00:00 2001 From: Stefan Neis Date: Wed, 2 Apr 2008 12:05:27 +0000 Subject: [PATCH] Added detection of vsscanf and whether or not a prototype exists in headers. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52980 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- configure.in | 33 ++++++++++++++++++++++++++++++++- include/wx/wxcrt.h | 7 +++++-- include/wx/wxcrtvararg.h | 13 +++++++++++-- setup.h.in | 6 ++++++ src/common/wxcrt.cpp | 2 +- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/configure.in b/configure.in index 49260e76d4..de07fb3943 100644 --- a/configure.in +++ b/configure.in @@ -4027,7 +4027,7 @@ dnl dnl so we first check if the function is in the library dnl dnl FIXME: replace this mess with WX_CHECK_FUNCS() -AC_CHECK_FUNCS(snprintf vsnprintf) +AC_CHECK_FUNCS(snprintf vsnprintf vsscanf) if test "$ac_cv_func_vsnprintf" = "yes"; then dnl yes it is -- now check if it is in the headers @@ -4164,6 +4164,37 @@ define HAVE_UNIX98_PRINTF as 1 in setup.h if it is available.]) fi fi +dnl the same as above but for vsscanf() now: it's not present in at least +dnl Solaris 9 headers for gcc-3.4 (due to fixinclude's processing of stdio.h) +if test "$ac_cv_func_vsscanf" = "yes"; then + AC_CACHE_CHECK([for vsscanf declaration], wx_cv_func_vsscanf_decl, + [ + AC_TRY_COMPILE( + [ + #include + #include + #ifdef __MSL__ + #if __MSL__ >= 0x6000 + namespace std {} + using namespace std; + #endif + #endif + ], + [ + char *buf, *parse; + vsscanf(buf, "%s", parse); + ], + wx_cv_func_vsscanf_decl=yes, + wx_cv_func_vsscanf_decl=no + ) + ] + ) + + if test "$wx_cv_func_vsscanf_decl" = "yes"; then + AC_DEFINE(HAVE_VSSCANF_DECL) + fi +fi + if test "$wxUSE_UNICODE" = yes; then dnl also look if we have wide char IO functions, notice that [f]putws are diff --git a/include/wx/wxcrt.h b/include/wx/wxcrt.h index 04b5fa6e4d..6383a0f5d3 100644 --- a/include/wx/wxcrt.h +++ b/include/wx/wxcrt.h @@ -19,8 +19,11 @@ #include "wx/wxcrtbase.h" #include "wx/string.h" -#if defined (__VISUALC__) || defined (__DMC__) - #define HAVE_NO_VSSCANF 1 +#ifndef __WX_SETUP_H__ +// For non-configure builds assume vsscanf is available, if not Visual C or DMC +#if !defined (__VISUALC__) && !defined (__DMC__) + #define HAVE_VSSCANF 1 +#endif #endif // ============================================================================ diff --git a/include/wx/wxcrtvararg.h b/include/wx/wxcrtvararg.h index 2e52bb23df..85b18d6135 100644 --- a/include/wx/wxcrtvararg.h +++ b/include/wx/wxcrtvararg.h @@ -31,8 +31,8 @@ /* printf() family saga */ /* - For some systems [v]snprintf() exists in the system libraries but not in the - headers, so we need to declare it ourselves to be able to use it. + For some systems [v]snprintf()/vsscanf() exists in the system libraries but + not in the headers, so we need to declare it ourselves to be able to use it. */ #if defined(HAVE_VSNPRINTF) && !defined(HAVE_VSNPRINTF_DECL) #ifdef __cplusplus @@ -52,6 +52,15 @@ int snprintf(char *str, size_t size, const char *format, ...); #endif /* !HAVE_SNPRINTF_DECL */ +#if defined(HAVE_VSSCANF) && !defined(HAVE_VSSCANF_DECL) +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int vsscanf(const char *str, const char *format, va_list ap); +#endif /* !HAVE_SNPRINTF_DECL */ + /* Wrapper for vsnprintf if it's 3rd parameter is non-const. Note: the * same isn't done for snprintf below, the builtin wxSnprintf_ is used * instead since it's already a simple wrapper */ diff --git a/setup.h.in b/setup.h.in index c7a3321653..162d88073b 100644 --- a/setup.h.in +++ b/setup.h.in @@ -896,6 +896,12 @@ * with 'char*' for the 3rd parameter instead of 'const char*' */ #undef HAVE_BROKEN_VSNPRINTF_DECL +/* Define if you have vsscanf() */ +#undef HAVE_VSSCANF + +/* Define if you have vsscanf() declaration in the header */ +#undef HAVE_VSSCANF_DECL + /* Define if you have usleep() */ #undef HAVE_USLEEP diff --git a/src/common/wxcrt.cpp b/src/common/wxcrt.cpp index 6f3377d6cd..d6f7c35cda 100644 --- a/src/common/wxcrt.cpp +++ b/src/common/wxcrt.cpp @@ -1290,7 +1290,7 @@ wchar_t *wxFgets(wchar_t *s, int size, FILE *stream) // wxScanf() and friends // ---------------------------------------------------------------------------- -#ifndef HAVE_NO_VSSCANF // __VISUALC__ and __DMC__ see wx/crt.h +#ifdef HAVE_VSSCANF // __VISUALC__ and __DMC__ see wx/crt.h int wxVsscanf(const char *str, const char *format, va_list ap) { return wxCRT_VsscanfA(str, format, ap); } int wxVsscanf(const wchar_t *str, const wchar_t *format, va_list ap) -- 2.45.2