/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
-#pragma implementation "string.h"
+ #pragma implementation "string.h"
#endif
/*
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <stdlib.h>
#ifdef __SALFORDC__
-#include <clib.h>
+ #include <clib.h>
#endif
#if wxUSE_WCSRTOMBS
// 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)
-#if defined(__VISUALC__)
- #pragma message("Using sprintf() because no snprintf()-like function defined")
-#elif defined(__GNUG__)
- #warning "Using sprintf() because no snprintf()-like function defined"
-#elif defined(__MWERKS__)
- #warning "Using sprintf() because no snprintf()-like function defined"
-#elif defined(__WATCOMC__)
- // No warning
-#elif defined(__BORLANDC__)
- // No warning
-#elif defined(__SUNCC__)
- // nothing -- I don't know about "#warning" for Sun's CC
-#else
- // change this to some analogue of '#warning' for your compiler
- #error "Using sprintf() because no snprintf()-like function defined"
-#endif //compiler
+ #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
// ----------------------------------------------------------------------------
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);
}