From: Robert Roebling <robert@roebling.de> Date: Sat, 10 Aug 2002 11:58:15 +0000 (+0000) Subject: Implemented the various printf() functions under X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a59c124d063b0df0b3259d99b5b569206414f8f5 Implemented the various printf() functions under Unicode with their GNU libc 2.2 funtions. This saves us some unicode<->ansi conversion and we no longer need the experimental printf() code in string.cpp. I had to implement wxSprintf() using wxSnprintf() as the former doesn't exist in Unicode GNU libc 2.2. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16442 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/string.h b/include/wx/string.h index b9319c6b7a..7f4245d2aa 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -165,16 +165,32 @@ inline int Stricmp(const char *psz1, const char *psz2) #endif // OS/compiler } +#ifndef wxSnprintf // wxSnprintf() is like snprintf() if it's available and sprintf() (always -// available, but dangerous!) if not +// available, but dangerous!) if not. extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len, const wxChar *format, ...) ATTRIBUTE_PRINTF_3; +#else +// GNU libc 2.2 only has for wxSnprintf for Unicode called swprintf +// so we imitate wxSprintf using it. +extern int WXDLLEXPORT wxSprintf(wxChar *buf, + const wxChar *format, + ...) ATTRIBUTE_PRINTF_2; +#endif +#ifndef wxVsnprintf // and wxVsnprintf() is like vsnprintf() or vsprintf() extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, const wxChar *format, va_list argptr); +#else +// GNU libc 2.2 only has for wxVsnprintf for Unicode called vswprintf +// so we imitate wxVsprintf using it. +extern int WXDLLEXPORT wxVsprintf(wxChar *buf, + const wxChar *format, + va_list argptr); +#endif // return an empty wxString class WXDLLEXPORT wxString; // not yet defined diff --git a/include/wx/wxchar.h b/include/wx/wxchar.h index eecb6b5a4e..21afa7f864 100644 --- a/include/wx/wxchar.h +++ b/include/wx/wxchar.h @@ -372,6 +372,29 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # define wxStrtoul wcstoul # define wxStrxfrm wcsxfrm +# define wxFgetc fgetwc +# define wxFgetchar fgetwchar +# define wxFgets fgetws +# define wxFputc fputwc +# define wxFputchar fputwchar +# define wxFprintf fwprintf +# define wxFscanf fwscanf +# define wxGetc getwc +# define wxGetchar getwchar +# define wxGets getws +# define wxPrintf wprintf +# define wxPutc wputc +# define wxPutchar wputchar +# define wxPuts putws +# define wxScanf wscanf +# define wxSnprintf swprintf +# define wxSscanf swscanf +# define wxUngetc ungetwc +# define wxVfprint vfwprintf +# define wxVprintf vwprintf +# define wxVsscanf vswscanf +# define wxVsnprintf vswprintf + // glibc doesn't have wc equivalents of the other stuff # define wxNEED_WX_STDIO_H # define wxNEED_WX_STDLIB_H @@ -482,29 +505,30 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # endif # ifdef wxNEED_WX_STDIO_H +# define wxFopen fopen +# define wxFreopen freopen +# define wxPerror perror +# define wxRemove remove +# define wxRename rename +# define wxTmpnam tmpnam + # define wxFgetc fgetc # define wxFgetchar fgetchar # define wxFgets fgets -# define wxFopen fopen # define wxFputc fputc # define wxFputchar fputchar # define wxFprintf fprintf -# define wxFreopen freopen # define wxFscanf fscanf # define wxGetc getc # define wxGetchar getchar # define wxGets gets -# define wxPerror perror # define wxPrintf printf # define wxPutc putc # define wxPutchar putchar # define wxPuts puts -# define wxRemove remove -# define wxRename rename # define wxScanf scanf # define wxSprintf sprintf # define wxSscanf sscanf -# define wxTmpnam tmpnam # define wxUngetc ungetc # define wxVfprint vfprintf # define wxVprintf vprintf @@ -513,6 +537,7 @@ typedef unsigned __WCHAR_TYPE__ wxUChar; # undef wxNEED_WX_STDIO_H # endif + # ifdef wxNEED_WX_STDLIB_H # define wxAtof atof # define wxAtoi atoi @@ -640,14 +665,6 @@ WXDLLEXPORT FILE * wxFopen(const wxChar *path, const wxChar *mode); WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream); WXDLLEXPORT int wxRemove(const wxChar *path); WXDLLEXPORT int wxRename(const wxChar *oldpath, const wxChar *newpath); -WXDLLEXPORT int wxPrintf(const wxChar *fmt, ...) ATTRIBUTE_PRINTF_1; -WXDLLEXPORT int wxVprintf(const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxFprintf(FILE *stream, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVfprintf(FILE *stream, const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxSprintf(wxChar *buf, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr); -WXDLLEXPORT int wxSscanf(const wxChar *buf, const wxChar *fmt, ...) ATTRIBUTE_PRINTF_2; -WXDLLEXPORT int wxVsscanf(const wxChar *buf, const wxChar *fmt, va_list argptr); #endif #ifndef wxAtof diff --git a/src/common/string.cpp b/src/common/string.cpp index e232c8a79d..6956cdd521 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -48,7 +48,9 @@ #if wxUSE_UNICODE #undef wxUSE_EXPERIMENTAL_PRINTF - #define wxUSE_EXPERIMENTAL_PRINTF 1 + #ifndef wvsnprintf + #define wxUSE_EXPERIMENTAL_PRINTF 1 + #endif #endif // allocating extra space for each string consumes more memory but speeds up @@ -184,11 +186,11 @@ wxSTD ostream& operator<<(wxSTD ostream& os, const wxString& str) #endif //std::string compatibility -extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, - const wxChar *format, va_list argptr) +#ifndef wxVsnprintf +int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, + const wxChar *format, va_list argptr) { #if wxUSE_UNICODE - // FIXME should use wvsnprintf() or whatever if it's available wxString s; int iLen = s.PrintfV(format, argptr); if ( iLen != -1 ) @@ -210,9 +212,20 @@ extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len, return rc; #endif // Unicode/ANSI } +#else +// GNU libc 2.2 only has for wxVsnprintf for Unicode called vswprintf +// so we imitate wxVsprintf using it. +int WXDLLEXPORT wxVsprintf(wxChar *buf, + const wxChar *format, + va_list argptr) +{ + return vswprintf( buf, 10000, format, argptr ); +} +#endif -extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len, - const wxChar *format, ...) +#ifndef wxSnprintf +int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len, + const wxChar *format, ...) { va_list argptr; va_start(argptr, format); @@ -223,6 +236,23 @@ extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len, return iLen; } +#else +// GNU libc 2.2 only has for wxSnprintf for Unicode called swprintf +// so we imitate wxSprintf using it. +int WXDLLEXPORT wxSprintf(wxChar *buf, + const wxChar *format, + ...) ATTRIBUTE_PRINTF_2 +{ + va_list argptr; + va_start(argptr, format); + + int iLen = swprintf(buf, 10000, format, argptr); + + va_end(argptr); + + return iLen; +} +#endif // ---------------------------------------------------------------------------- // private classes diff --git a/src/common/wxchar.cpp b/src/common/wxchar.cpp index 657a0554c2..eaaef7ad4a 100644 --- a/src/common/wxchar.cpp +++ b/src/common/wxchar.cpp @@ -393,85 +393,6 @@ WXDLLEXPORT int wxRename(const wxChar *oldpath, const wxChar *newpath) { return rename( wxConvFile.cWX2MB(oldpath), wxConvFile.cWX2MB(newpath) ); } - -int WXDLLEXPORT wxPrintf(const wxChar *fmt, ...) -{ - va_list argptr; - int ret; - - va_start(argptr, fmt); - ret = wxVprintf(fmt, argptr); - va_end(argptr); - return ret; -} - -int WXDLLEXPORT wxVprintf(const wxChar *fmt, va_list argptr) -{ - wxString str; - str.PrintfV(fmt,argptr); - printf("%s", (const char*)str.mb_str()); - return str.Len(); -} - -int WXDLLEXPORT wxFprintf(FILE *stream, const wxChar *fmt, ...) -{ - va_list argptr; - int ret; - - va_start(argptr, fmt); - ret = wxVfprintf(stream, fmt, argptr); - va_end(argptr); - return ret; -} - -int WXDLLEXPORT wxVfprintf(FILE *stream, const wxChar *fmt, va_list argptr) -{ - wxString str; - str.PrintfV(fmt,argptr); - fprintf(stream, "%s", (const char*)str.mb_str()); - return str.Len(); -} - -int WXDLLEXPORT wxSprintf(wxChar *buf, const wxChar *fmt, ...) -{ - va_list argptr; - int ret; - - va_start(argptr, fmt); - ret = wxVsprintf(buf, fmt, argptr); - va_end(argptr); - return ret; -} - -int WXDLLEXPORT wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr) -{ - // this might be sort of inefficient, but it doesn't matter since - // we'd prefer people to use wxString::Printf directly instead anyway - wxString str; - str.PrintfV(fmt,argptr); - wxStrcpy(buf,str.c_str()); - return str.Len(); -} - -int WXDLLEXPORT wxSscanf(const wxChar *buf, const wxChar *fmt, ...) -{ - va_list argptr; - int ret; - - va_start(argptr, fmt); - ret = wxVsscanf(buf, fmt, argptr); - va_end(argptr); - return ret; -} - -int WXDLLEXPORT wxVsscanf(const wxChar *buf, const wxChar *fmt, va_list argptr) -{ - int ret; - // this will work only for numeric conversion! Strings will not be converted correctly - // hopefully this is all we'll need - ret = vsscanf(wxConvLibc.cWX2MB(buf), wxConvLibc.cWX2MB(fmt), argptr); - return ret; -} #endif #ifndef wxAtof