]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
Reverted mouse position change - wxMSW does send (-1, -1) for keyboard context menu...
[wxWidgets.git] / src / common / string.cpp
index 84f285410c0efcf1fbfc7ebbedbe7dfa364c5fb7..e401661db80bd78982742e51d23610cd84ab584c 100644 (file)
@@ -1347,9 +1347,9 @@ wxString& wxString::MakeLower()
 // ---------------------------------------------------------------------------
 
 // some compilers (VC++ 6.0 not to name them) return true for a call to
 // ---------------------------------------------------------------------------
 
 // some compilers (VC++ 6.0 not to name them) return true for a call to
-// isspace('ê') in the C locale which seems to be broken to me, but we have to
-// live with this by checking that the character is a 7 bit one - even if this
-// may fail to detect some spaces (I don't know if Unicode doesn't have
+// isspace('\xEA') in the C locale which seems to be broken to me, but we have
+// to live with this by checking that the character is a 7 bit one - even if 
+// this may fail to detect some spaces (I don't know if Unicode doesn't have
 // space-like symbols somewhere except in the first 128 chars), it is arguably
 // still better than trimming away accented letters
 inline int wxSafeIsspace(wxChar ch) { return (ch < 127) && wxIsspace(ch); }
 // space-like symbols somewhere except in the first 128 chars), it is arguably
 // still better than trimming away accented letters
 inline int wxSafeIsspace(wxChar ch) { return (ch < 127) && wxIsspace(ch); }
@@ -1603,12 +1603,24 @@ int wxString::DoPrintfUtf8(const char *format, ...)
     and set errno.
 
     What vswprintf sets errno to is undefined but Darwin seems to set it to
     and set errno.
 
     What vswprintf sets errno to is undefined but Darwin seems to set it to
-    EOVERFLOW.  The only expected errno that are defined anywhere are by an
-    addendum indicating that EILSEQ should be set for bad input characters and
-    EINVALID for bad arguments such as a NULL buffer pointer.  It would appear
-    that setting EOVERFLOW is not documented anywhere and has only been at
-    this time observed on Darwin.
-
+    EOVERFLOW.  The only expected errno are EILSEQ and EINVAL.  Both of
+    those are defined in the standard and backed up by several conformance
+    statements.  Note that ENOMEM mentioned in the manual page does not
+    apply to swprintf, only wprintf and fwprintf.
+
+    Official manual page:
+    http://www.opengroup.org/onlinepubs/009695399/functions/swprintf.html
+
+    Some conformance statements (AIX, Solaris):
+    http://www.opengroup.org/csq/view.mhtml?RID=ibm%2FSD1%2F3
+    http://www.theopengroup.org/csq/view.mhtml?norationale=1&noreferences=1&RID=Fujitsu%2FSE2%2F10
+
+    Since EILSEQ and EINVAL are rather common but EOVERFLOW is not and since
+    EILSEQ and EINVAL are specifically defined to mean the error is other than
+    an undersized buffer and no other errno are defined we treat those two
+    as meaning hard errors and everything else gets the old behavior which
+    is to keep looping and increasing buffer size until the function succeeds.
     In practice it's impossible to determine before compilation which behavior
     may be used.  The vswprintf function may have vsnprintf-like behavior or
     vice-versa.  Behavior detected on one release can theoretically change
     In practice it's impossible to determine before compilation which behavior
     may be used.  The vswprintf function may have vsnprintf-like behavior or
     vice-versa.  Behavior detected on one release can theoretically change
@@ -1704,16 +1716,15 @@ static int DoStringPrintfV(wxString& str,
             // as we don't know how much we need, double the current size of
             // the buffer
 #ifndef __WXWINCE__
             // as we don't know how much we need, double the current size of
             // the buffer
 #ifndef __WXWINCE__
-            if( (errno == 0) || (errno == EOVERFLOW) )
+            if( (errno == EILSEQ) || (errno == EINVAL) )
+            // If errno was set to one of the two well-known hard errors
+            // then fail immediately to avoid an infinite loop.
+                return -1;
+            else
+#endif // __WXWINCE__
             // still not enough, as we don't know how much we need, double the
             // current size of the buffer
                 size *= 2;
             // still not enough, as we don't know how much we need, double the
             // current size of the buffer
                 size *= 2;
-            else
-            // If errno was set to something else, assume hard failure.
-                return -1;
-#else
-            size *= 2;
-#endif // __WXWINCE__
 #endif // wxUSE_WXVSNPRINTF/!wxUSE_WXVSNPRINTF
         }
         else if ( len >= size )
 #endif // wxUSE_WXVSNPRINTF/!wxUSE_WXVSNPRINTF
         }
         else if ( len >= size )