]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/string.h
chmod is not available in VisualAge
[wxWidgets.git] / include / wx / string.h
index d21eb47a473242cafd7a8316a7fff38139dbb839..bb7bf7071e2fb6857a6a7bd866aabd94d51f5a91 100644 (file)
@@ -38,7 +38,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __WXMAC__
+#if defined(__WXMAC__) || defined(__VISAGECPP__)
     #include <ctype.h>
 #endif
 
     #include <std.h>
 #endif
 
-#include <string.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <stdlib.h>
+#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
+   // problem in VACPP V4 with including stdlib.h multiple times
+   // strconv includes it anyway
+#  include <stdio.h>
+#  include <string.h>
+#  include <stdarg.h>
+#  include <limits.h>
+#else
+#  include <string.h>
+#  include <stdio.h>
+#  include <stdarg.h>
+#  include <limits.h>
+#  include <stdlib.h>
+#endif
 
 #ifdef HAVE_STRINGS_H
     #include <strings.h>    // for strcasecmp()
 #endif // AIX
 
 #include "wx/defs.h"        // everybody should include this
-#include "wx/debug.h"       // for wxASSERT()
 #include "wx/wxchar.h"      // for wxChar
 #include "wx/buffer.h"      // for wxCharBuffer
 #include "wx/strconv.h"     // for wxConvertXXX() macros and wxMBConv classes
 // constants
 // ----------------------------------------------------------------------------
 
+#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
+// must define this static for VA or else you get multiply defined symbols everywhere
+extern const unsigned int wxSTRING_MAXLEN;
+
+#else
 // maximum possible length for a string means "take all string" everywhere
 //  (as sizeof(StringData) is unknown here, we substract 100)
 const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100;
 
+#endif
+
 // ----------------------------------------------------------------------------
 // global data
 // ----------------------------------------------------------------------------
@@ -156,6 +171,15 @@ inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2)
 #endif  // OS/compiler
 }
 
+// wxSnprintf() is like snprintf() if it's available and sprintf() (always
+// available, but dangerous!) if not
+extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len,
+                                  const wxChar *format, ...);
+
+// and wxVsnprintf() is like vsnprintf() or vsprintf()
+extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len,
+                                   const wxChar *format, va_list argptr);
+
 // return an empty wxString
 class WXDLLEXPORT wxString; // not yet defined
 inline const wxString& wxGetEmptyString() { return *(wxString *)&wxEmptyString; }
@@ -180,6 +204,12 @@ struct WXDLLEXPORT wxStringData
 
   // lock/unlock
   void  Lock()   { if ( !IsEmpty() ) nRefs++;                    }
+
+  // VC++ will refuse to inline this function but profiling shows that it
+  // is wrong
+#if defined(__VISUALC__) && (__VISUALC__ >= 1200)
+  __forceinline
+#endif
   void  Unlock() { if ( !IsEmpty() && --nRefs == 0) free(this);  }
 
   // if we had taken control over string memory (GetWriteBuf), it's
@@ -262,7 +292,9 @@ private:
   //
   // try `s << i' or `s.Printf("%d", i)' instead
   wxString(int);
+  wxString(unsigned int);
   wxString(long);
+  wxString(unsigned long);
 
 public:
   // constructors and destructor
@@ -288,6 +320,8 @@ public:
     // (default value of wxSTRING_MAXLEN means take all the string)
   wxString(const wxChar *psz, size_t nLength = wxSTRING_MAXLEN)
     { InitWith(psz, 0, nLength); }
+  wxString(const wxChar *psz, wxMBConv& WXUNUSED(conv), size_t nLength = wxSTRING_MAXLEN)
+    { InitWith(psz, 0, nLength); }
 
 #if wxUSE_UNICODE
     // from multibyte string
@@ -301,13 +335,10 @@ public:
     // from C string (for compilers using unsigned char)
   wxString(const unsigned char* psz, size_t nLength = wxSTRING_MAXLEN)
     { InitWith((const char*)psz, 0, nLength); }
-    // from multibyte string
-  wxString(const char *psz, wxMBConv& WXUNUSED(conv), size_t nLength = wxSTRING_MAXLEN)
-    { InitWith(psz, 0, nLength); }
 
 #if wxUSE_WCHAR_T
     // from wide (Unicode) string
-  wxString(const wchar_t *pwz);
+  wxString(const wchar_t *pwz, wxMBConv& conv = wxConvLibc);
 #endif // !wxUSE_WCHAR_T
 
     // from wxCharBuffer
@@ -370,38 +401,56 @@ public:
     wxChar& Last()
       { wxASSERT( !IsEmpty() ); CopyBeforeWrite(); return m_pchData[Len()-1]; }
 
-    // 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
     wxChar  operator[](size_t n) const
       { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
-#endif
 
     // operator version of GetChar
     wxChar  operator[](int n) const
       { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
-    // operator version of GetWritableChar
+#ifdef __alpha__
+    // operator version of GetChar
+    wxChar  operator[](unsigned int n) const
+      { ASSERT_VALID_INDEX( n ); return m_pchData[n]; }
+#endif
+
+    // operator version of GetWriteableChar
     wxChar& operator[](size_t n)
       { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
+#ifdef __alpha__
+    // operator version of GetWriteableChar
+    wxChar&  operator[](unsigned int n)
+      { ASSERT_VALID_INDEX( n ); CopyBeforeWrite(); return m_pchData[n]; }
+#endif
 
     // implicit conversion to C string
     operator const wxChar*() const { return m_pchData; }
     // explicit conversion to C string (use this with printf()!)
     const wxChar* c_str()   const { return m_pchData; }
-    // (and this with [wx]Printf()!)
+    // identical to c_str()
     const wxChar* wx_str()  const { return m_pchData; }
     // identical to c_str()
     const wxChar* GetData() const { return m_pchData; }
 
     // conversions with (possible) format convertions: have to return a
     // buffer with temporary data
+    //
+    // the functions defined (in either Unicode or ANSI) mode are mb_str() to
+    // return an ANSI (multibyte) string, wc_str() to return a wide string and
+    // fn_str() to return a string which should be used with the OS APIs
+    // accepting the file names. The return value is always the same, but the
+    // type differs because a function may either return pointer to the buffer
+    // directly or have to use intermediate buffer for translation.
 #if wxUSE_UNICODE
-    const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const { return conv.cWC2MB(m_pchData); }
+    const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const
+        { return conv.cWC2MB(m_pchData); }
+
     const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); }
 
-    const wxChar* wc_str(wxMBConv& WXUNUSED(conv) = wxConvLibc) const { return m_pchData; }
+    const wxChar* wc_str() const { return m_pchData; }
+
+    // for compatibility with !wxUSE_UNICODE version
+    const wxChar* wc_str(wxMBConv& WXUNUSED(conv)) const { return m_pchData; }
 
 #if wxMBFILES
     const wxCharBuffer fn_str() const { return mb_str(wxConvFile); }
@@ -409,17 +458,18 @@ public:
     const wxChar* fn_str() const { return m_pchData; }
 #endif // wxMBFILES/!wxMBFILES
 #else // ANSI
-#if wxUSE_MULTIBYTE
-    const wxChar* mb_str(wxMBConv& WXUNUSED(conv) = wxConvLibc) const
-        { return m_pchData; }
-    const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); }
-#else // !mmultibyte
     const wxChar* mb_str() const { return m_pchData; }
+
+    // for compatibility with wxUSE_UNICODE version
+    const wxChar* mb_str(wxMBConv& WXUNUSED(conv)) const { return m_pchData; }
+
     const wxWX2MBbuf mbc_str() const { return mb_str(); }
-#endif // multibyte/!multibyte
+
 #if wxUSE_WCHAR_T
-    const wxWCharBuffer wc_str(wxMBConv& conv) const { return conv.cMB2WC(m_pchData); }
+    const wxWCharBuffer wc_str(wxMBConv& conv) const
+        { return conv.cMB2WC(m_pchData); }
 #endif // wxUSE_WCHAR_T
+
     const wxChar* fn_str() const { return m_pchData; }
 #endif // Unicode/ANSI
 
@@ -487,6 +537,8 @@ public:
     // append count copies of given character
   wxString& Append(wxChar ch, size_t count = 1u)
     { wxString str(ch, count); return *this << str; }
+  wxString& Append(const wxChar* psz, size_t nLen)
+    { ConcatSelf(nLen, psz); return *this; }
 
     // prepend a string, return the string itself
   wxString& Prepend(const wxString& str)
@@ -506,11 +558,23 @@ public:
 
   // stream-like functions
       // insert an int into string
-  wxString& operator<<(int i);
+  wxString& operator<<(int i)
+    { return (*this) << Format(_T("%d"), i); }
+      // insert an unsigned int into string
+  wxString& operator<<(unsigned int ui)
+    { return (*this) << Format(_T("%u"), ui); }
+      // insert a long into string
+  wxString& operator<<(long l)
+    { return (*this) << Format(_T("%ld"), l); }
+      // insert an unsigned long into string
+  wxString& operator<<(unsigned long ul)
+    { return (*this) << Format(_T("%lu"), ul); }
       // insert a float into string
-  wxString& operator<<(float f);
+  wxString& operator<<(float f)
+    { return (*this) << Format(_T("%f"), f); }
       // insert a double into string
-  wxString& operator<<(double d);
+  wxString& operator<<(double d)
+    { return (*this) << Format(_T("%g"), d); }
 
   // string comparison
     // case-sensitive comparison (returns a value < 0, = 0 or > 0)
@@ -533,10 +597,15 @@ public:
       // if nCount = default value)
   wxString Mid(size_t nFirst, size_t nCount = wxSTRING_MAXLEN) const;
 
-    // operator version of Mid()
+      // operator version of Mid()
   wxString  operator()(size_t start, size_t len) const
     { return Mid(start, len); }
 
+      // check that the tring starts with prefix and return the rest of the
+      // string in the provided pointer if it is not NULL, otherwise return
+      // FALSE
+  bool StartsWith(const wxChar *prefix, wxString *rest = NULL) const;
+
       // get first nCount characters
   wxString Left(size_t nCount) const;
       // get last nCount characters
@@ -591,12 +660,26 @@ public:
     // check if the string contents matches a mask containing '*' and '?'
   bool Matches(const wxChar *szMask) const;
 
+    // conversion to numbers: all functions return TRUE only if the whole string
+    // is a number and put the value of this number into the pointer provided
+        // convert to a signed integer
+    bool ToLong(long *val) const;
+        // convert to an unsigned integer
+    bool ToULong(unsigned long *val) const;
+        // convert to a double
+    bool ToDouble(double *val) const;
+
   // formated input/output
     // as sprintf(), returns the number of characters written or < 0 on error
   int Printf(const wxChar *pszFormat, ...);
     // as vprintf(), returns the number of characters written or < 0 on error
   int PrintfV(const wxChar* pszFormat, va_list argptr);
 
+    // returns the string containing the result of Printf() to it
+  static wxString Format(const wxChar *pszFormat, ...);
+    // the same as above, but takes a va_list
+  static wxString FormatV(const wxChar *pszFormat, va_list argptr);
+
   // raw access to string memory
     // ensure that string has space for at least nLen characters
     // only works if the data of this string is not shared
@@ -609,6 +692,7 @@ public:
   wxChar *GetWriteBuf(size_t nLen);
     // call this immediately after GetWriteBuf() has been used
   void UngetWriteBuf();
+  void UngetWriteBuf(size_t nLen);
 
   // wxWindows version 1 compatibility functions
 
@@ -690,6 +774,8 @@ public:
   void clear() { Empty(); }
     // returns true if the string is empty
   bool empty() const { return IsEmpty(); }
+    // inform string about planned change in size
+  void reserve(size_t size) { Alloc(size); }
 
   // lib.string.access
     // return the character at position n
@@ -752,8 +838,8 @@ public:
   wxString& replace(size_t nStart, size_t nLen,
                     const wxString& str, size_t nStart2, size_t nLen2);
     // replaces the substring with first nCount chars of sz
-    wxString& replace(size_t nStart, size_t nLen,
-                      const wxChar* sz, size_t nCount);
+  wxString& replace(size_t nStart, size_t nLen,
+                    const wxChar* sz, size_t nCount);
 
     // swap two strings
   void swap(wxString& str);
@@ -769,7 +855,7 @@ public:
 #if !defined(__VISUALC__) || defined(__WIN32__)
     // find first n characters of sz
   size_t find(const wxChar* sz, size_t nStart = 0, size_t n = npos) const;
-#endif
+#endif // VC++ 1.5
 
   // Gives a duplicate symbol (presumably a case-insensitivity problem)
 #if !defined(__BORLANDC__)
@@ -788,7 +874,7 @@ public:
           size_t n = npos) const;
     // as find, but from the end
   size_t rfind(wxChar ch, size_t nStart = npos) const;
-#endif
+#endif // VC++ 1.5
 
     // find first/last occurence of any character in the set
 
@@ -819,7 +905,8 @@ public:
     // same as above
   size_t find_first_not_of(wxChar ch, size_t nStart = 0) const;
     //  as strcspn()
-  size_t find_last_not_of(const wxString& str, size_t nStart=npos) const;
+  size_t find_last_not_of(const wxString& str, size_t nStart = npos) const
+    { return find_first_not_of(str.c_str(), nStart); }
     // same as above
   size_t find_last_not_of(const wxChar* sz, size_t nStart = npos) const;
     // same as above
@@ -831,18 +918,22 @@ public:
     // just like strcmp()
   int compare(const wxString& str) const { return Cmp(str); }
     // comparison with a substring
-  int compare(size_t nStart, size_t nLen, const wxString& str) const;
+  int compare(size_t nStart, size_t nLen, const wxString& str) const
+    { return Mid(nStart, nLen).Cmp(str); }
     // comparison of 2 substrings
   int compare(size_t nStart, size_t nLen,
-              const wxString& str, size_t nStart2, size_t nLen2) const;
+              const wxString& str, size_t nStart2, size_t nLen2) const
+    { return Mid(nStart, nLen).Cmp(str.Mid(nStart2, nLen2)); }
     // just like strcmp()
   int compare(const wxChar* sz) const { return Cmp(sz); }
     // substring comparison with first nCount characters of sz
   int compare(size_t nStart, size_t nLen,
-              const wxChar* sz, size_t nCount = npos) const;
+              const wxChar* sz, size_t nCount = npos) const
+    { return Mid(nStart, nLen).Cmp(wxString(sz, nCount)); }
 
   // substring extraction
-  wxString substr(size_t nStart = 0, size_t nLen = npos) const;
+  wxString substr(size_t nStart = 0, size_t nLen = npos) const
+    { return Mid(nStart, nLen); }
 #endif // wxSTD_STRING_COMPATIBILITY
 };
 
@@ -869,8 +960,9 @@ public:
                                  const wxString& second);
 
   // constructors and destructor
-    // default ctor
-  wxArrayString();
+    // default ctor: if autoSort is TRUE, the array is always sorted (in
+    // alphabetical order)
+  wxArrayString(bool autoSort = FALSE);
     // copy ctor
   wxArrayString(const wxArrayString& array);
     // assignment operator
@@ -911,14 +1003,16 @@ public:
     // sensitive (default). Returns index of the first item matched or
     // wxNOT_FOUND
   int  Index (const wxChar *sz, bool bCase = TRUE, bool bFromEnd = FALSE) const;
-    // add new element at the end
-  void Add(const wxString& str);
+    // add new element at the end (if the array is not sorted), return its
+    // index
+  size_t Add(const wxString& str);
     // add new element at given position
   void Insert(const wxString& str, size_t uiIndex);
     // remove first item matching this value
   void Remove(const wxChar *sz);
     // remove item by index
   void Remove(size_t nIndex);
+  void RemoveAt(size_t nIndex) { Remove(nIndex); }
 
   // sorting
     // sort array elements in alphabetical order (or reversed alphabetical
@@ -927,16 +1021,36 @@ public:
     // sort array elements using specified comparaison function
   void Sort(CompareFunction compareFunction);
 
+  // comparison
+    // compare two arrays case sensitively
+  bool operator==(const wxArrayString& a) const;
+    // compare two arrays case sensitively
+  bool operator!=(const wxArrayString& a) const { return !(*this == a); }
+
+protected:
+  void Copy(const wxArrayString& src);  // copies the contents of another array
+
 private:
-  void    Grow();     // makes array bigger if needed
-  void    Free();     // free the string stored
+  void Grow();                          // makes array bigger if needed
+  void Free();                          // free all the strings stored
 
-  void    DoSort();   // common part of all Sort() variants
+  void DoSort();                        // common part of all Sort() variants
 
   size_t  m_nSize,    // current size of the array
           m_nCount;   // current number of elements
 
-  wxChar  **m_pItems;   // pointer to data
+  wxChar  **m_pItems; // pointer to data
+
+  bool    m_autoSort; // if TRUE, keep the array always sorted
+};
+
+class WXDLLEXPORT wxSortedArrayString : public wxArrayString
+{
+public:
+  wxSortedArrayString() : wxArrayString(TRUE)
+    { }
+  wxSortedArrayString(const wxArrayString& array) : wxArrayString(TRUE)
+    { Copy(array); }
 };
 
 // ---------------------------------------------------------------------------
@@ -991,11 +1105,19 @@ inline bool operator==(const wxString& s1, const wxWCharBuffer& s2)
     { return (s1.Cmp((const wchar_t *)s2) == 0); }
 inline bool operator==(const wxWCharBuffer& s1, const wxString& s2)
     { return (s2.Cmp((const wchar_t *)s1) == 0); }
+inline bool operator!=(const wxString& s1, const wxWCharBuffer& s2)
+    { return (s1.Cmp((const wchar_t *)s2) != 0); }
+inline bool operator!=(const wxWCharBuffer& s1, const wxString& s2)
+    { return (s2.Cmp((const wchar_t *)s1) != 0); }
 #else
 inline bool operator==(const wxString& s1, const wxCharBuffer& s2)
     { return (s1.Cmp((const char *)s2) == 0); }
 inline bool operator==(const wxCharBuffer& s1, const wxString& s2)
     { return (s2.Cmp((const char *)s1) == 0); }
+inline bool operator!=(const wxString& s1, const wxCharBuffer& s2)
+    { return (s1.Cmp((const char *)s2) != 0); }
+inline bool operator!=(const wxCharBuffer& s1, const wxString& s2)
+    { return (s2.Cmp((const char *)s1) != 0); }
 #endif
 
 wxString WXDLLEXPORT operator+(const wxString& string1,  const wxString& string2);
@@ -1026,7 +1148,8 @@ inline wxString WXDLLEXPORT operator+(const wxCharBuffer& buf, const wxString& s
 
 #include "wx/ioswrap.h"
 
-WXDLLEXPORT istream& operator>>(istream& is, wxString& str);
+WXDLLEXPORT istream& operator>>(istream&, wxString&);
+WXDLLEXPORT ostream& operator<<(ostream&, const wxString&);
 
 #endif  // wxSTD_STRING_COMPATIBILITY