]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
no message
[wxWidgets.git] / include / wx / string.h
index a4442365f3413564c7a6dd92e7adf37230735d15..81c856c9e3ed252dea12945e5afa012512330a23 100644 (file)
@@ -22,6 +22,9 @@
  *         stdarg.h
  *         limits.h
  */
+#ifdef __WXMAC__
+#include <ctype.h>
+#endif
 #include <string.h>
 #include <stdio.h>
 #include <stdarg.h>
@@ -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 <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