]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
Fixed doubled-up key effects in wxTextCtrl by resetting m_lastMsg to 0
[wxWidgets.git] / src / common / string.cpp
index 1107cc55cf71076e97376dea15bc6de2a86ea9a6..54a87d7ba5bb2006d656d4b0bd0308a69577f7a7 100644 (file)
@@ -10,7 +10,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "string.h"
+  #pragma implementation "string.h"
 #endif
 
 /*
@@ -28,7 +28,7 @@
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
@@ -42,7 +42,7 @@
 #include <stdlib.h>
 
 #ifdef __SALFORDC__
-#include <clib.h>
+  #include <clib.h>
 #endif
 
 #if wxUSE_WCSRTOMBS
@@ -63,7 +63,7 @@
 // ---------------------------------------------------------------------------
 
 #ifdef  wxSTD_STRING_COMPATIBILITY
-  const size_t wxString::npos = STRING_MAXLEN;
+  const size_t wxString::npos = wxSTRING_MAXLEN;
 #endif // wxSTD_STRING_COMPATIBILITY
 
 // ----------------------------------------------------------------------------
@@ -104,11 +104,21 @@ extern const char WXDLLEXPORT *g_szNul = &g_strEmpty.dummy;
     // always available), but it's unsafe because it doesn't check for buffer
     // size - so give a warning
     #define wxVsprintf(buffer,len,format,argptr) vsprintf(buffer,format, argptr)
-#ifndef __SC__
-    #pragma message("Using sprintf() because no snprintf()-like function defined")
-#endif
+
+    #if defined(__VISUALC__)
+        #pragma message("Using sprintf() because no snprintf()-like function defined")
+    #elif defined(__GNUG__) && !defined(__UNIX__)
+        #warning "Using sprintf() because no snprintf()-like function defined"
+    #elif defined(__MWERKS__)
+           #warning "Using sprintf() because no snprintf()-like function defined"
+    #endif //compiler
 #endif // no vsnprintf
 
+#ifdef _AIX
+  // AIX has vsnprintf, but there's no prototype in the system headers.
+  extern "C" int vsnprintf(char* str, size_t n, const char* format, va_list ap);
+#endif
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------
@@ -211,7 +221,7 @@ void wxString::InitWith(const char *psz, size_t nPos, size_t nLength)
 
   wxASSERT( nPos <= Strlen(psz) );
 
-  if ( nLength == STRING_MAXLEN )
+  if ( nLength == wxSTRING_MAXLEN )
     nLength = Strlen(psz + nPos);
 
   STATISTICS_ADD(InitialLength, nLength);
@@ -611,8 +621,8 @@ wxString wxString::Mid(size_t nFirst, size_t nCount) const
   wxStringData *pData = GetStringData();
   size_t nLen = pData->nDataLength;
 
-  // default value of nCount is STRING_MAXLEN and means "till the end"
-  if ( nCount == STRING_MAXLEN )
+  // default value of nCount is wxSTRING_MAXLEN and means "till the end"
+  if ( nCount == wxSTRING_MAXLEN )
   {
     nCount = nLen - nFirst;
   }
@@ -1434,10 +1444,83 @@ void wxArrayString::Remove(const char *sz)
   Remove(iIndex);
 }
 
+// ----------------------------------------------------------------------------
+// sorting
+// ----------------------------------------------------------------------------
+
+// we can only sort one array at a time with the quick-sort based
+// implementation
+#if wxUSE_THREADS
+  #include <wx/thread.h>
+
+  // need a critical section to protect access to gs_compareFunction and
+  // gs_sortAscending variables
+  static wxCriticalSection *gs_critsectStringSort = NULL;
+
+  // call this before the value of the global sort vars is changed/after
+  // you're finished with them
+  #define START_SORT()     wxASSERT( !gs_critsectStringSort );                \
+                           gs_critsectStringSort = new wxCriticalSection;     \
+                           gs_critsectStringSort->Enter()
+  #define END_SORT()       gs_critsectStringSort->Leave();                    \
+                           delete gs_critsectStringSort;                      \
+                           gs_critsectStringSort = NULL
+#else // !threads
+  #define START_SORT()
+  #define END_SORT()
+#endif // wxUSE_THREADS
+
+// function to use for string comparaison
+static wxArrayString::CompareFunction gs_compareFunction = NULL;
+
+// if we don't use the compare function, this flag tells us if we sort the
+// array in ascending or descending order
+static bool gs_sortAscending = TRUE;
+
+// function which is called by quick sort
+static int wxStringCompareFunction(const void *first, const void *second)
+{
+  wxString *strFirst = (wxString *)first;
+  wxString *strSecond = (wxString *)second;
+
+  if ( gs_compareFunction ) {
+    return gs_compareFunction(*strFirst, *strSecond);
+  }
+  else {
+    int result = strcmp(strFirst->c_str(), strSecond->c_str());
+
+    return gs_sortAscending ? result : -result;
+  }
+}
+
 // sort array elements using passed comparaison function
+void wxArrayString::Sort(CompareFunction compareFunction)
+{
+  START_SORT();
+
+  wxASSERT( !gs_compareFunction );  // must have been reset to NULL
+  gs_compareFunction = compareFunction;
+
+  DoSort();
+
+  END_SORT();
+}
+
+void wxArrayString::Sort(bool reverseOrder)
+{
+  START_SORT();
+
+  wxASSERT( !gs_compareFunction );  // must have been reset to NULL
+  gs_sortAscending = !reverseOrder;
+
+  DoSort();
+
+  END_SORT();
+}
 
-void wxArrayString::Sort(bool WXUNUSED(bCase), bool WXUNUSED(bReverse) )
+void wxArrayString::DoSort()
 {
-  //@@@@ TO DO
-  //qsort(m_pItems, m_nCount, sizeof(char *), fCmp);
+  // just sort the pointers using qsort() - of course it only works because
+  // wxString() *is* a pointer to its data
+  qsort(m_pItems, m_nCount, sizeof(char *), wxStringCompareFunction);
 }