* stdarg.h
* limits.h
*/
+#ifdef __WXMAC__
+#include <ctype.h>
+#endif
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
*/
// ---------------------------------------------------------------------------
+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; }
{
#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
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]'
{
#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
/** @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
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]; }
/** @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 */
//@{
/**
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
@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 '?'
//@{
/// 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();
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();
//@}
{ *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
/** @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);
}
/// 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; }
//@}
@memo probably the most commonly used array type - array of strings
*/
// ----------------------------------------------------------------------------
-class wxArrayString
+class WXDLLEXPORT wxArrayString
{
public:
/** @name ctors and dtor */
/** @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; }
//@}
/// 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
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
///
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
#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 <iostream.h>
+#else
+#include <istream>
+# 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