X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f4a0c5be34be837210768501c13dbcff81e533c..706bb5f973ccb44a924ee1f9aa79c7ee34eb2556:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index 1107cc55cf..fbdedd721e 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -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 #ifdef __SALFORDC__ -#include + #include #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,9 +104,25 @@ 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__ +#if defined(__VISUALC__) #pragma message("Using sprintf() because no snprintf()-like function defined") -#endif +#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 +#elif defined(__DECCXX) + // nothing +#else + // change this to some analogue of '#warning' for your compiler + #error "Using sprintf() because no snprintf()-like function defined" +#endif //compiler + #endif // no vsnprintf // ---------------------------------------------------------------------------- @@ -211,7 +227,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 +627,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 +1450,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 + + // 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); }