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
This commit is contained in:
parent
e6ccaf1a99
commit
a59c124d06
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user