X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34138703c3997ce676a1e713d9ff9eb020640da7..4040a396cb22fdaa2db0f79bd782218cd814a540:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index a4442365f3..81c856c9e3 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -22,6 +22,9 @@ * stdarg.h * limits.h */ +#ifdef __WXMAC__ +#include +#endif #include #include #include @@ -73,6 +76,8 @@ */ // --------------------------------------------------------------------------- +WXDLLEXPORT_DATA(extern const char*) wxEmptyString; + /// checks whether the passed in pointer is NULL and if the string is empty inline bool WXDLLEXPORT IsEmpty(const char *p) { return !p || !*p; } @@ -85,10 +90,22 @@ inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2) { #if defined(_MSC_VER) return _stricmp(psz1, psz2); +#elif defined(__SC__) + return _stricmp(psz1, psz2); #elif defined(__BORLANDC__) return stricmp(psz1, psz2); +#elif defined(__WATCOMC__) + return stricmp(psz1, psz2); #elif defined(__UNIX__) || defined(__GNUWIN32__) return strcasecmp(psz1, psz2); +#elif defined(__MWERKS__) && !defined(_MSC_VER) + register char c1, c2; + do { + c1 = tolower(*psz1++); + c2 = tolower(*psz2++); + } while ( c1 && (c1 == c2) ); + + return c1 - c2; #else // almost all compilers/libraries provide this function (unfortunately under // different names), that's why we don't implement our own which will surely @@ -125,7 +142,7 @@ inline const wxString& wxGetEmptyString() { return *(wxString *)&g_szNul; } struct WXDLLEXPORT wxStringData { int nRefs; // reference count - uint nDataLength, // actual string length + size_t nDataLength, // actual string length nAllocLength; // allocated memory size // mimics declaration 'char data[nAllocLength]' @@ -182,7 +199,7 @@ struct WXDLLEXPORT wxStringData { #endif //WXSTRING_IS_WXOBJECT -friend class wxArrayString; +friend class WXDLLEXPORT wxArrayString; // NB: special care was taken in arrangin the member functions in such order // that all inline functions can be effectively inlined @@ -254,17 +271,26 @@ public: /** @name generic attributes & operations */ //@{ /// as standard strlen() - uint Len() const { return GetStringData()->nDataLength; } + size_t Len() const { return GetStringData()->nDataLength; } /// string contains any characters? bool IsEmpty() const { return Len() == 0; } - /// reinitialize string (and free data!) + /// empty string contents void Empty() { - if ( GetStringData()->nDataLength != 0 ) + if ( !IsEmpty() ) Reinit(); + // should be empty wxASSERT( GetStringData()->nDataLength == 0 ); - wxASSERT( GetStringData()->nAllocLength == 0 ); + } + /// empty the string and free memory + void Clear() + { + if ( !GetStringData()->IsEmpty() ) + Reinit(); + + wxASSERT( GetStringData()->nDataLength == 0 ); // should be empty + wxASSERT( GetStringData()->nAllocLength == 0 ); // and not own any memory } /// Is an ascii value @@ -294,9 +320,14 @@ public: 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__) /// operator version of GetChar char operator[](size_t n) const { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } +#endif + /// operator version of GetChar char operator[](int n) const { ASSERT_VALID_INDEX( n ); return m_pchData[n]; } @@ -360,18 +391,28 @@ public: /** @name return resulting string */ //@{ /// - friend wxString operator+(const wxString& string1, const wxString& string2); + friend wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2); /// - friend wxString operator+(const wxString& string, char ch); + friend wxString WXDLLEXPORT operator+(const wxString& string, char ch); /// - friend wxString operator+(char ch, const wxString& string); + friend wxString WXDLLEXPORT operator+(char ch, const wxString& string); /// - friend wxString operator+(const wxString& string, const char *psz); + friend wxString WXDLLEXPORT operator+(const wxString& string, const char *psz); /// - friend wxString operator+(const char *psz, const wxString& string); + friend wxString WXDLLEXPORT operator+(const char *psz, const wxString& string); //@} //@} + /** @name stream-like functions */ + //@{ + /// insert an int into string + wxString& operator<<(int i); + /// insert a float into string + wxString& operator<<(float f); + /// insert a double into string + wxString& operator<<(double d); + //@} + /** @name string comparison */ //@{ /** @@ -405,6 +446,11 @@ public: nCount (or till the end if nCount = default value) */ wxString Mid(size_t nFirst, size_t nCount = STRING_MAXLEN) const; + /// Compatibility with wxWindows 1.xx + wxString SubString(size_t from, size_t to) const + { + return Mid(from, (to - from + 1)); + } /// get first nCount characters wxString Left(size_t nCount) const; /// get all characters before the first occurence of ch @@ -452,7 +498,7 @@ public: @param bReplaceAll: global replace (default) or only the first occurence @return the number of replacements made */ - uint Replace(const char *szOld, const char *szNew, bool bReplaceAll = TRUE); + size_t Replace(const char *szOld, const char *szNew, bool bReplaceAll = TRUE); //@} /// check if the string contents matches a mask containing '*' and '?' @@ -471,7 +517,7 @@ public: //@{ /// ensure that string has space for at least nLen characters // only works if the data of this string is not shared - void Alloc(uint nLen); + void Alloc(size_t nLen); /// minimize the string's memory // only works if the data of this string is not shared void Shrink(); @@ -480,7 +526,7 @@ public: Unget() *must* be called a.s.a.p. to put string back in a reasonable state! */ - char *GetWriteBuf(uint nLen); + char *GetWriteBuf(size_t nLen); /// call this immediately after GetWriteBuf() has been used void UngetWriteBuf(); //@} @@ -519,6 +565,8 @@ public: { *this = str + *this; return *this; } /// same as Len size_t Length() const { return Len(); } + /// Count the number of characters + int Freq(char ch) const; /// same as MakeLower void LowerCase() { MakeLower(); } /// same as MakeUpper @@ -555,8 +603,8 @@ public: /** @name constructors */ //@{ /// take nLen chars starting at nPos - wxString(const wxString& str, size_t nPos, size_t nLen = npos) - { + wxString(const wxString& str, size_t nPos, size_t nLen) + { wxASSERT( str.GetStringData()->IsValid() ); InitWith(str.c_str(), nPos, nLen == npos ? 0 : nLen); } @@ -682,11 +730,13 @@ public: /// find first n characters of sz size_t find(const char* sz, size_t nStart = 0, size_t n = npos) const; #endif + // Gives a duplicate symbol (presumably a case-insensitivity problem) +#if !defined(__BORLANDC__) /// find the first occurence of character ch after nStart size_t find(char ch, size_t nStart = 0) const; - +#endif // wxWin compatibility - inline bool Contains(const wxString& str) { return Find(str) != -1; } + inline bool Contains(const wxString& str) const { return Find(str) != -1; } //@} @@ -788,7 +838,7 @@ public: @memo probably the most commonly used array type - array of strings */ // ---------------------------------------------------------------------------- -class wxArrayString +class WXDLLEXPORT wxArrayString { public: /** @name ctors and dtor */ @@ -818,7 +868,7 @@ public: /** @name simple accessors */ //@{ /// number of elements in the array - uint Count() const { return m_nCount; } + size_t Count() const { return m_nCount; } /// is it empty? bool IsEmpty() const { return m_nCount == 0; } //@} @@ -847,7 +897,7 @@ public: /// add new element at the end void Add (const wxString& str); /// add new element at given position - void Insert(const wxString& str, uint uiIndex); + void Insert(const wxString& str, size_t uiIndex); /// remove first item matching this value void Remove(const char *sz); /// remove item by index @@ -861,7 +911,7 @@ private: void Grow(); // makes array bigger if needed void Free(); // free the string stored - size_t m_nSize, // current size of the array + size_t m_nSize, // current size of the array m_nCount; // current number of elements char **m_pItems; // pointer to data @@ -909,6 +959,11 @@ inline bool operator>=(const wxString& s1, const char * s2) { return s1.Cmp(s2) /// inline bool operator>=(const char * s1, const wxString& s2) { return s2.Cmp(s1) <= 0; } //@} +wxString WXDLLEXPORT operator+(const wxString& string1, const wxString& string2); +wxString WXDLLEXPORT operator+(const wxString& string, char ch); +wxString WXDLLEXPORT operator+(char ch, const wxString& string); +wxString WXDLLEXPORT operator+(const wxString& string, const char *psz); +wxString WXDLLEXPORT operator+(const char *psz, const wxString& string); // --------------------------------------------------------------------------- /** @name Global functions complementing standard C string library @@ -919,9 +974,20 @@ inline bool operator>=(const char * s1, const wxString& s2) { return s2.Cmp(s1) #ifdef STD_STRING_COMPATIBILITY // fwd decl -class WXDLLEXPORT istream; +// Known not to work with wxUSE_IOSTREAMH set to 0, so +// replacing with includes (on advice of ungod@pasdex.com.au) +// class WXDLLEXPORT istream; +#if wxUSE_IOSTREAMH +// N.B. BC++ doesn't have istream.h, ostream.h +#include +#else +#include +# ifdef _MSC_VER + using namespace std; +# endif +#endif -istream& WXDLLEXPORT operator>>(istream& is, wxString& str); +WXDLLEXPORT istream& operator>>(istream& is, wxString& str); #endif //std::string compatibility