+// ----------------------------------------------------------------------------
+// sorting
+// ----------------------------------------------------------------------------
+
+// we can only sort one array at a time with the quick-sort based
+// implementation
+#if wxUSE_THREADS
+ // 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
+extern "C" int wxC_CALLING_CONV // LINKAGEMODE
+wxStringCompareFunction(const void *first, const void *second)
+{
+ wxString *strFirst = (wxString *)first;
+ wxString *strSecond = (wxString *)second;
+
+ if ( gs_compareFunction ) {
+ return gs_compareFunction(*strFirst, *strSecond);
+ }
+ else {
+ // maybe we should use wxStrcoll
+ int result = wxStrcmp(strFirst->c_str(), strSecond->c_str());
+
+ return gs_sortAscending ? result : -result;
+ }
+}
+