Work around wrong vsscanf() declaration under HP-UX.

Under this system vsscanf() is declared as taking a non-const char* as first
argument which prevented our code using it from compiling. Wrap it in
wxCRT_VsscanfA() adding the necessary const_cast<> to fix this.

Closes #15638.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-12-03 13:38:35 +00:00
parent 3258c423b4
commit 50805a002a
5 changed files with 98 additions and 1 deletions

48
configure vendored
View File

@@ -29994,6 +29994,54 @@ $as_echo "$wx_cv_func_vsscanf_decl" >&6; }
if test "$wx_cv_func_vsscanf_decl" = "yes"; then
$as_echo "#define HAVE_VSSCANF_DECL 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if vsscanf() declaration is broken" >&5
$as_echo_n "checking if vsscanf() declaration is broken... " >&6; }
if ${wx_cv_func_broken_vsscanf_decl+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
#include <stdarg.h>
#ifdef __MSL__
#if __MSL__ >= 0x6000
namespace std {}
using namespace std;
#endif
#endif
int
main ()
{
const char *buf;
va_list args;
vsscanf(buf, "%s", args);
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
wx_cv_func_broken_vsscanf_decl=no
else
wx_cv_func_broken_vsscanf_decl=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $wx_cv_func_broken_vsscanf_decl" >&5
$as_echo "$wx_cv_func_broken_vsscanf_decl" >&6; }
if test "$wx_cv_func_broken_vsscanf_decl" = "yes"; then
$as_echo "#define HAVE_BROKEN_VSSCANF_DECL 1" >>confdefs.h
fi
fi
fi
ac_ext=c

View File

@@ -4236,6 +4236,37 @@ if test "$ac_cv_func_vsscanf" = "yes"; then
if test "$wx_cv_func_vsscanf_decl" = "yes"; then
AC_DEFINE(HAVE_VSSCANF_DECL)
dnl we know there is a vsscanf() declaration, but it can be broken by
dnl declaring vsscanf() as taking a non-const first argument (this
dnl happens at least under HP-UX 11.31, see #15638).
AC_CACHE_CHECK([if vsscanf() declaration is broken], wx_cv_func_broken_vsscanf_decl,
[
AC_TRY_COMPILE(
[
#include <stdio.h>
#include <stdarg.h>
#ifdef __MSL__
#if __MSL__ >= 0x6000
namespace std {}
using namespace std;
#endif
#endif
],
[
const char *buf;
va_list args;
vsscanf(buf, "%s", args);
],
wx_cv_func_broken_vsscanf_decl=no,
wx_cv_func_broken_vsscanf_decl=yes
)
]
)
if test "$wx_cv_func_broken_vsscanf_decl" = "yes"; then
AC_DEFINE(HAVE_BROKEN_VSSCANF_DECL)
fi
fi
fi
AC_LANG_POP()

View File

@@ -238,7 +238,17 @@
#define wxCRT_ScanfA scanf
#define wxCRT_SscanfA sscanf
#define wxCRT_FscanfA fscanf
/* vsscanf() may have a wrong declaration with non-const first parameter, fix
* this by wrapping it if necessary. */
#if defined __cplusplus && defined HAVE_BROKEN_VSSCANF_DECL
inline int wxCRT_VsscanfA(const char *str, const char *format, va_list ap)
{
return vsscanf(const_cast<char *>(str), format, ap);
}
#else
#define wxCRT_VsscanfA vsscanf
#endif
#if defined(wxNEED_WPRINTF)
int wxCRT_ScanfW(const wchar_t *format, ...);

View File

@@ -1001,6 +1001,10 @@
* with 'char*' for the 3rd parameter instead of 'const char*' */
#undef HAVE_BROKEN_VSNPRINTF_DECL
/* Define if you have a _broken_ vsscanf() declaration in the header,
* with 'char*' for the 1st parameter instead of 'const char*' */
#undef HAVE_BROKEN_VSSCANF_DECL
/* Define if you have vsscanf() */
#undef HAVE_VSSCANF

View File

@@ -1107,6 +1107,10 @@ typedef pid_t GPid;
* with 'char*' for the 3rd parameter instead of 'const char*' */
#undef HAVE_BROKEN_VSNPRINTF_DECL
/* Define if you have a _broken_ vsscanf() declaration in the header,
* with 'char*' for the 1st parameter instead of 'const char*' */
#undef HAVE_BROKEN_VSSCANF_DECL
/* Define if you have vsscanf() */
#define HAVE_VSSCANF 1