#include <limits.h>
#include <stdlib.h>
+#ifdef HAVE_STRINGS_H
+ #include <strings.h> // for strcasecmp()
+#endif // AIX
+
#ifndef WX_PRECOMP
#include "wx/defs.h"
// maximum possible length for a string means "take all string" everywhere
// (as sizeof(StringData) is unknown here we substract 100)
-#define STRING_MAXLEN (UINT_MAX - 100)
+const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100;
// 'naughty' cast
#define WXSTRINGCAST (char *)(const char *)
//---------------------------------------------------------------------------
// checks whether the passed in pointer is NULL and if the string is empty
-inline bool WXDLLEXPORT IsEmpty(const char *p) { return !p || !*p; }
+inline bool WXDLLEXPORT IsEmpty(const char *p) { return (!p || !*p); }
// safe version of strlen() (returns 0 if passed NULL pointer)
inline size_t WXDLLEXPORT Strlen(const char *psz)
// portable strcasecmp/_stricmp
inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2)
{
-#if defined(__VISUALC__) || defined(__MWERKS__)
+#if defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) )
return _stricmp(psz1, psz2);
#elif defined(__SC__)
return _stricmp(psz1, psz2);
return stricmp(psz1, psz2);
#elif defined(__UNIX__) || defined(__GNUWIN32__)
return strcasecmp(psz1, psz2);
-#elif defined(__MWERKS__) && !defined(_MSC_VER)
+#elif defined(__MWERKS__) && !defined(__INTEL__)
register char c1, c2;
do {
c1 = tolower(*psz1++);
char* data() const { return (char*)(this + 1); }
// empty string has a special ref count so it's never deleted
- bool IsEmpty() const { return nRefs == -1; }
- bool IsShared() const { return nRefs > 1; }
+ bool IsEmpty() const { return (nRefs == -1); }
+ bool IsShared() const { return (nRefs > 1); }
// lock/unlock
void Lock() { if ( !IsEmpty() ) nRefs++; }
// if we had taken control over string memory (GetWriteBuf), it's
// intentionally put in invalid state
- void Validate(bool b) { nRefs = b ? 1 : 0; }
- bool IsValid() const { return nRefs != 0; }
+ void Validate(bool b) { nRefs = (b ? 1 : 0); }
+ bool IsValid() const { return (nRefs != 0); }
};
// ---------------------------------------------------------------------------
// ctors, use Reinit() otherwise)
void Init() { m_pchData = (char *)g_szNul; }
// initializaes the string with (a part of) C-string
- void InitWith(const char *psz, size_t nPos = 0, size_t nLen = STRING_MAXLEN);
+ void InitWith(const char *psz, size_t nPos = 0, size_t nLen = wxSTRING_MAXLEN);
// as Init, but also frees old data
void Reinit() { GetStringData()->Unlock(); Init(); }
// string containing nRepeat copies of ch
wxString(char ch, size_t nRepeat = 1);
// ctor takes first nLength characters from C string
- // (default value of STRING_MAXLEN means take all the string)
- wxString(const char *psz, size_t nLength = STRING_MAXLEN)
+ // (default value of wxSTRING_MAXLEN means take all the string)
+ wxString(const char *psz, size_t nLength = wxSTRING_MAXLEN)
{ InitWith(psz, 0, nLength); }
// from C string (for compilers using unsigned char)
- wxString(const unsigned char* psz, size_t nLength = STRING_MAXLEN);
+ wxString(const unsigned char* psz, size_t nLength = wxSTRING_MAXLEN);
// from wide (UNICODE) string
wxString(const wchar_t *pwz);
// dtor is not virtual, this class must not be inherited from!
char& Last()
{ wxASSERT( !IsEmpty() ); CopyBeforeWrite(); return m_pchData[Len()-1]; }
- // on alpha-linux this gives overload problems:
- // Also on Solaris, so removing for now (JACS)
-#if ! defined(__ALPHA__)
+ // under Unix it is tested with configure, assume it works on other
+ // platforms (there might be overloading problems if size_t and int are
+ // the same type)
+#if !defined(__UNIX__) || wxUSE_SIZE_T_STRING_OPERATOR
// operator version of GetChar
char operator[](size_t n) const
{ ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
wxString& operator<<(double d);
// string comparison
- // case-sensitive comparison: return 0 if =, +1 if > or -1 if <
+ // case-sensitive comparison (returns a value < 0, = 0 or > 0)
int Cmp(const char *psz) const { return strcmp(c_str(), psz); }
// same as Cmp() but not case-sensitive
int CmpNoCase(const char *psz) const { return Stricmp(c_str(), psz); }
// simple sub-string extraction
// return substring starting at nFirst of length nCount (or till the end
// if nCount = default value)
- wxString Mid(size_t nFirst, size_t nCount = STRING_MAXLEN) const;
+ wxString Mid(size_t nFirst, size_t nCount = wxSTRING_MAXLEN) const;
// operator version of Mid()
wxString operator()(size_t start, size_t len) const
// return the length of the string
size_t length() const { return Len(); }
// return the maximum size of the string
- size_t max_size() const { return STRING_MAXLEN; }
+ size_t max_size() const { return wxSTRING_MAXLEN; }
// resize the string, filling the space with c if c != 0
void resize(size_t nSize, char ch = '\0');
// delete the contents of the string
class WXDLLEXPORT wxArrayString
{
public:
+ // type of function used by wxArrayString::Sort()
+ typedef int (*CompareFunction)(const wxString& first,
+ const wxString& second);
+
// constructors and destructor
// default ctor
wxArrayString();
// remove item by index
void Remove(size_t nIndex);
- // sort array elements
- void Sort(bool bCase = TRUE, bool bReverse = FALSE);
+ // sorting
+ // sort array elements in alphabetical order (or reversed alphabetical
+ // order if reverseOrder parameter is TRUE)
+ void Sort(bool reverseOrder = FALSE);
+ // sort array elements using specified comparaison function
+ void Sort(CompareFunction compareFunction);
private:
void Grow(); // makes array bigger if needed
void Free(); // free the string stored
+ void DoSort(); // common part of all Sort() variants
+
size_t m_nSize, // current size of the array
m_nCount; // current number of elements