]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wxchar.cpp
int warning
[wxWidgets.git] / src / common / wxchar.cpp
index a547a1e201f71756f29c3d8ac690e9520e387f9b..d6fd73b0a3b06285bc6d5adff9ffd529fb011fee 100644 (file)
@@ -1,8 +1,8 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/common/wxchar.cpp
 // Purpose:     wxChar implementation
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/common/wxchar.cpp
 // Purpose:     wxChar implementation
-// Author:      Ove Kåven
-// Modified by: Ron Lee
+// Author:      Ove Kaven
+// Modified by: Ron Lee, Francesco Montorsi
 // Created:     09/04/99
 // RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets copyright
 // Created:     09/04/99
 // RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets copyright
@@ -752,11 +752,13 @@ int wxPrintfConvSpec::Process(wxChar *buf, size_t lenMax, wxPrintfArg *p)
 #else
                     p->pad_char;
 
 #else
                     p->pad_char;
 
+#if wxUSE_WCHAR_T
                 if (type == wxPAT_WCHAR) {
                     // user passed a character explicitely indicated as Unicode...
                     const wchar_t buf[2] = { p->pad_wchar, 0 };
                     val = wxString(buf, wxConvLibc)[0u];
                 }
                 if (type == wxPAT_WCHAR) {
                     // user passed a character explicitely indicated as Unicode...
                     const wchar_t buf[2] = { p->pad_wchar, 0 };
                     val = wxString(buf, wxConvLibc)[0u];
                 }
+#endif
 #endif
 
                 size_t i;
 #endif
 
                 size_t i;
@@ -783,22 +785,26 @@ int wxPrintfConvSpec::Process(wxChar *buf, size_t lenMax, wxPrintfArg *p)
 
                 if (type == wxPAT_PCHAR) {
                     // user passed a string explicitely indicated as ANSI...
 
                 if (type == wxPAT_PCHAR) {
                     // user passed a string explicitely indicated as ANSI...
-                    val = wxString(p->pad_pchar, wxConvLibc);
+                    val = s = wxString(p->pad_pchar, wxConvLibc);
                 }
 #else
                     p->pad_pchar;
 
                 }
 #else
                     p->pad_pchar;
 
+#if wxUSE_WCHAR_T
                 if (type == wxPAT_PWCHAR) {
                     // user passed a string explicitely indicated as Unicode...
                 if (type == wxPAT_PWCHAR) {
                     // user passed a string explicitely indicated as Unicode...
-                    val = wxString(p->pad_pwchar, wxConvLibc);
+                    val = s = wxString(p->pad_pwchar, wxConvLibc);
                 }
                 }
+#endif
 #endif
                 int len;
 
                 if (val)
                 {
 #if wxUSE_STRUTILS
 #endif
                 int len;
 
                 if (val)
                 {
 #if wxUSE_STRUTILS
-                    len = wxMin(max_width, wxStrlen(val));
+                    // at this point we are sure that max_width is positive or null
+                    // (see top of wxPrintfConvSpec::LoadArg)
+                    len = wxMin((unsigned int)max_width, wxStrlen(val));
 #else
                     for ( len = 0; val[len] && (len < max_width); len++ )
                         ;
 #else
                     for ( len = 0; val[len] && (len < max_width); len++ )
                         ;
@@ -824,7 +830,9 @@ int wxPrintfConvSpec::Process(wxChar *buf, size_t lenMax, wxPrintfArg *p)
                 }
 
 #if wxUSE_STRUTILS
                 }
 
 #if wxUSE_STRUTILS
-                len = wxMin(len, lenMax-lenCur);
+                // at this point we are sure that max_width is positive or null
+                // (see top of wxPrintfConvSpec::LoadArg)
+                len = wxMin((unsigned int)len, lenMax-lenCur);
                 wxStrncpy(buf+lenCur, val, len);
                 lenCur += len;
 #else
                 wxStrncpy(buf+lenCur, val, len);
                 lenCur += len;
 #else
@@ -893,6 +901,36 @@ int wxPrintfConvSpec::Process(wxChar *buf, size_t lenMax, wxPrintfArg *p)
     return lenCur;
 }
 
     return lenCur;
 }
 
+// differences from standard strncpy:
+// 1) copies everything from 'source' except for '%%' sequence which is copied as '%'
+// 2) returns the number of written characters in 'dest' as it could differ from given 'n'
+// 3) much less optimized, unfortunately...
+static int wxCopyStrWithPercents(wxChar *dest, const wxChar *source, size_t n)
+{
+    size_t written = 0;
+
+    if (n == 0)
+        return 0;
+
+    size_t i;
+    for ( i = 0; i < n-1; source++, i++)
+    {
+        dest[written++] = *source;
+        if (*(source+1) == wxT('%'))
+        {
+            // skip this additional '%' character
+            source++;
+            i++;
+        }
+    }
+
+    if (i < n)
+        // copy last character inconditionally
+        dest[written++] = *source;
+
+    return written;
+}
+
 int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
                              const wxChar *format, va_list argptr)
 {
 int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
                              const wxChar *format, va_list argptr)
 {
@@ -950,15 +988,26 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
         return -1;      // format strings with both positional and
                         // non-positional conversion specifier are unsupported !!
 
         return -1;      // format strings with both positional and
                         // non-positional conversion specifier are unsupported !!
 
+    // on platforms where va_list is an array type, it is necessary to make a
+    // copy to be able to pass it to LoadArg as a reference.
+    bool ok = true;
+    va_list ap;
+    wxVaCopy(ap, argptr);
+
     // now load arguments from stack
     // now load arguments from stack
-    for (i=0; i < nargs; i++) {
-        if (!pspec[i])
-            return -1;  // user forgot a positional parameter (e.g. %$1s %$3s) ?
-        if (!pspec[i]->LoadArg(&argdata[i], argptr))
-            return -1;  // this means that wxPrintfConvSpec::Parse failed
-                        // to set its 'type' to a valid value...
+    for (i=0; i < nargs && ok; i++) {
+        // !pspec[i] if user forgot a positional parameter (e.g. %$1s %$3s) ?
+        // or LoadArg false if wxPrintfConvSpec::Parse failed to set its 'type'
+        // to a valid value...
+        ok = pspec[i] && pspec[i]->LoadArg(&argdata[i], ap);
     }
 
     }
 
+    va_end(ap);
+
+    // something failed while loading arguments from the variable list...
+    if (!ok)
+        return -1;
+
     // finally, process each conversion specifier with its own argument
     toparse = format;
     for (i=0; i < nargs; i++)
     // finally, process each conversion specifier with its own argument
     toparse = format;
     for (i=0; i < nargs; i++)
@@ -969,8 +1018,7 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
         if (lenCur+tocopy >= lenMax)
             return -1;      // not enough space in the output buffer !
 
         if (lenCur+tocopy >= lenMax)
             return -1;      // not enough space in the output buffer !
 
-        wxStrncpy(buf+lenCur, toparse, tocopy);
-        lenCur += tocopy;
+        lenCur += wxCopyStrWithPercents(buf+lenCur, toparse, tocopy);
 
         // process this specifier directly in the output buffer
         int n = arg[i].Process(buf+lenCur, lenMax - lenCur, &argdata[arg[i].pos]);
 
         // process this specifier directly in the output buffer
         int n = arg[i].Process(buf+lenCur, lenMax - lenCur, &argdata[arg[i].pos]);
@@ -990,8 +1038,9 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
     size_t tocopy = wxStrlen(format) + 1  - ( toparse - format ) ;
     if (lenCur+tocopy >= lenMax)
         return -1;      // not enough space in the output buffer !
     size_t tocopy = wxStrlen(format) + 1  - ( toparse - format ) ;
     if (lenCur+tocopy >= lenMax)
         return -1;      // not enough space in the output buffer !
-    wxStrncpy(buf+lenCur, toparse, tocopy);
-    lenCur += tocopy - 1;   // the -1 is because of the '\0'
+
+    // the -1 is because of the '\0'
+    lenCur += wxCopyStrWithPercents(buf+lenCur, toparse, tocopy) - 1;
 
     // clean the static array portion used...
     // NOTE: other arrays do not need cleanup!
 
     // clean the static array portion used...
     // NOTE: other arrays do not need cleanup!