X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a38b83c353cce75329b2c53c0eaa4ad0f500ccf1..ad5c34f309074eefe625b82e1203eec5b91247f5:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index e4ff09bf0f..e00c818033 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -41,6 +41,12 @@ #include #include +// This probably isn't right, what should it be Vadim? +// Otherwise we end up with no wxVsprintf defined. +#ifdef __WXMOTIF__ +#define HAVE_VPRINTF +#endif + #ifdef wxUSE_WCSRTOMBS #include // for wcsrtombs(), see comments where it's used #endif // GNU @@ -78,6 +84,33 @@ static const struct // empty C style string: points to 'string data' byte of g_strEmpty extern const char *g_szNul = &g_strEmpty.dummy; +// ---------------------------------------------------------------------------- +// conditional compilation +// ---------------------------------------------------------------------------- + +// we want to find out if the current platform supports vsnprintf()-like +// function: for Unix this is done with configure, for Windows we test the +// compiler explicitly. +#ifdef __WXMSW__ + #ifdef _MSC_VER + #define wxVsprintf _vsnprintf + #endif +#else // !Windows + #ifdef HAVE_VSNPRINTF + #define wxVsprintf vsnprintf + #endif +#endif // Windows/!Windows + +#ifndef wxVsprintf + // in this case we'll use vsprintf() (which is ANSI and thus should be + // always available), but it's unsafe because it doesn't check for buffer + // size - so give a warning + #define wxVsprintf(buffer,len,format,argptr) vsprintf(buffer,format, argptr) +#ifndef __SC__ + #pragma message("Using sprintf() because no snprintf()-like function defined") +#endif +#endif + // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- @@ -102,22 +135,19 @@ extern const char *g_szNul = &g_strEmpty.dummy; #endif #ifdef __WXMSW__ - #ifdef _MSC_VER - #define wxVsprintf _vsnprintf - #endif + #ifdef _MSC_VER + #define wxVsprintf _vsnprintf + #endif #else - #if defined ( HAVE_VSNPRINTF ) - #define wxVsprintf vsnprintf - #endif + #if defined ( HAVE_VSNPRINTF ) + #define wxVsprintf vsnprintf + #endif #endif #ifndef wxVsprintf - #ifdef HAVE_VPRINTF + // vsprintf() is ANSI so we can always use it, but it's unsafe! #define wxVsprintf(buffer,len,format,argptr) vsprintf(buffer,format, argptr) #pragma message("Using sprintf() because no snprintf()-like function defined") - #else - #pragma error("No vsnprintf() or vsprintf() function available.") - #endif #endif NAMESPACE istream& operator>>(NAMESPACE istream& is, wxString& WXUNUSED(str)) @@ -317,6 +347,10 @@ void wxString::AllocBeforeWrite(size_t nLen) pData->Unlock(); AllocBuffer(nLen); } + else { + // update the string length + pData->nDataLength = nLen; + } wxASSERT( !GetStringData()->IsShared() ); // we must be the only owner } @@ -871,8 +905,13 @@ wxString& wxString::Pad(size_t nCount, char chPad, bool bFromRight) // truncate the string wxString& wxString::Truncate(size_t uiLen) { - *(m_pchData + uiLen) = '\0'; - GetStringData()->nDataLength = uiLen; + if ( uiLen < Len() ) { + CopyBeforeWrite(); + + *(m_pchData + uiLen) = '\0'; + GetStringData()->nDataLength = uiLen; + } + //else: nothing to do, string is already short enough return *this; } @@ -941,22 +980,14 @@ int wxString::Printf(const char *pszFormat, ...) int wxString::PrintfV(const char* pszFormat, va_list argptr) { -#ifdef __BORLANDC__ - static char s_szScratch[1024]; - - int iLen = vsprintf(s_szScratch, pszFormat, argptr); - AllocBeforeWrite(iLen); - strcpy(m_pchData, s_szScratch); - - return iLen; -#else - // static buffer to avoid dynamic memory allocation each time static char s_szScratch[1024]; + // NB: wxVsprintf() may return either less than the buffer size or -1 if there + // is not enough place depending on implementation int iLen = wxVsprintf(s_szScratch, WXSIZEOF(s_szScratch), pszFormat, argptr); char *buffer; - if ( (size_t)iLen < WXSIZEOF(s_szScratch) ) { + if ( iLen < (int)WXSIZEOF(s_szScratch) ) { buffer = s_szScratch; } else { @@ -986,7 +1017,6 @@ int wxString::PrintfV(const char* pszFormat, va_list argptr) free(buffer); return iLen; -#endif } // ---------------------------------------------------------------------------- @@ -1051,6 +1081,19 @@ bool wxString::Matches(const char *pszMask) const return *pszTxt == '\0'; } +// Count the number of chars +int wxString::Freq(char ch) const +{ + int count = 0; + int len = Len(); + for (int i = 0; i < len; i++) + { + if (GetChar(i) == ch) + count ++; + } + return count; +} + // --------------------------------------------------------------------------- // standard C++ library string functions // --------------------------------------------------------------------------- @@ -1092,6 +1135,8 @@ size_t wxString::find(const char* sz, size_t nStart, size_t n) const } #endif +// Gives a duplicate symbol (presumably a case-insensitivity problem) +#if !defined(__BORLANDC__) size_t wxString::find(char ch, size_t nStart) const { wxASSERT( nStart <= Len() ); @@ -1100,6 +1145,7 @@ size_t wxString::find(char ch, size_t nStart) const return p == NULL ? npos : p - c_str(); } +#endif size_t wxString::rfind(const wxString& str, size_t nStart) const {