diff options
Diffstat (limited to 'qtools')
-rw-r--r-- | qtools/qcstring.cpp | 683 | ||||
-rw-r--r-- | qtools/qcstring.h | 531 |
2 files changed, 0 insertions, 1214 deletions
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp deleted file mode 100644 index 4f30a42..0000000 --- a/qtools/qcstring.cpp +++ /dev/null @@ -1,683 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#include "qcstring.h" - -#include <qstring.h> -#include <limits.h> -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <ctype.h> -//#include <qregexp.h> -#include <qdatastream.h> - -QCString &QCString::sprintf( const char *format, ... ) -{ - va_list ap; - va_start( ap, format ); - const int minlen=256; - int l = length(); - if (l<minlen) { resize(minlen); l=minlen; } - int n=vsnprintf( rawData(), l, format, ap); - if (n<0) n=l; - resize(n+1); - va_end( ap ); - return *this; -} - -int QCString::find( char c, int index, bool cs ) const -{ - if (index<0 || index>=(int)length()) return -1; // index outside string - const char *pos; - if (cs) - { - pos = strchr(data()+index,c); - } - else - { - pos = data()+index; - c = tolower((unsigned char)c); - while (*pos && tolower((unsigned char)*pos)!=c) pos++; - if (!*pos && c) pos=0; // not found - } - return pos ? (int)(pos - data()) : -1; -} - -int QCString::find( const char *str, int index, bool cs ) const -{ - int l = length(); - if (index<0 || index>=l) return -1; // index outside string - if (!str) return -1; // no string to search for - if (!*str) return index; // empty string matching at index - const char *pos; - if (cs) // case sensitive - { - pos = strstr(data()+index,str); - } - else // case insensitive - { - pos = data(); - int len = qstrlen(str); - while (*pos) - { - if (qstrnicmp(pos,str,len)==0) break; - pos++; - } - if (!*pos) pos = 0; // not found - } - return pos ? (int)(pos - data()) : -1; -} - -int QCString::find( const QCString &str, int index, bool cs ) const -{ - return find(str.data(),index,cs); -} - -#if 0 -int QCString::find( const QRegExp &rx, int index ) const -{ - if ( index < 0 ) - index += length(); - return rx.match( data(), index ); -} -#endif - -int QCString::findRev( char c, int index, bool cs) const -{ - const char *b = data(); - const char *pos; - int len = length(); - if (len==0) return -1; // empty string - if (index<0) // start from end - { - if (cs) - { - pos = strrchr(b,c); - return pos ? (int)(pos - b) : -1; - } - index=len; - } - else if (index>len) // bad index - { - return -1; - } - pos = b+index; - if (cs) - { - while ( pos>=b && *pos!=c) pos--; - } - else - { - c = tolower((unsigned char)c); - while ( pos>=b && tolower((unsigned char)*pos)!=c) pos--; - } - return pos>=b ? (int)(pos - b) : -1; -} - -int QCString::findRev( const char *str, int index, bool cs) const -{ - int slen = qstrlen(str); - int len = length(); - if (index<0) index = len-slen; // start from end - else if (index>len) return -1; // bad index - else if (index+slen>len) index=len-slen; // str would be too long - if (index<0) return -1; // no match possible - const char *pos = data()+index; - if (cs) // case sensitive - { - for (int i=index; i>=0; i--) if (qstrncmp(pos--,str,slen)==0) return i; - } - else // case insensitive - { - for (int i=index; i>=0; i--) if (qstrnicmp(pos,str,slen)==0) return i; - } - return -1; -} - -#if 0 -int QCString::findRev( const QRegExp &rx, int index ) const -{ - if ( index < 0 ) // neg index ==> start from end - index += length(); - if ( (uint)index > length() ) // bad index - return -1; - while( index >= 0 ) { - if ( rx.match( data(), index ) == index ) - return index; - index--; - } - return -1; -} -#endif - -int QCString::contains( char c, bool cs ) const -{ - if (length()==0) return 0; - int count=0; - const char *pos = data(); - if (cs) - { - while (*pos) if (*pos++ == c) count++; - } - else - { - c = tolower((unsigned char)c); - while (*pos) - { - if (tolower((unsigned char)*pos)==c) count++; - pos++; - } - } - return count; -} - -int QCString::contains( const char *str, bool cs ) const -{ - if (str==0 || length()==0) return 0; - int count=0; - const char *pos = data(); - int len = qstrlen(str); - while (*pos) - { - if (cs) - { - if (qstrncmp(pos,str,len)==0) count++; - } - else - { - if (qstrnicmp(pos,str,len)==0) count++; - } - pos++; - } - return count; -} - -#if 0 -int QCString::contains( const QRegExp &rx ) const -{ - if ( isEmpty() ) - return rx.match( data() ) < 0 ? 0 : 1; - int count = 0; - int index = -1; - int len = length(); - while ( index < len-1 ) { // count overlapping matches - index = rx.match( data(), index+1 ); - if ( index < 0 ) - break; - count++; - } - return count; -} -#endif - - -QCString QCString::simplifyWhiteSpace() const -{ - if ( isEmpty() ) // nothing to do - return *this; - - QCString result( length()+1 ); - const char *from = data(); - char *to = result.rawData(); - char *first = to; - while ( TRUE ) - { - while ( *from && isspace((uchar) *from) ) - from++; - while ( *from && !isspace((uchar)*from) ) - *to++ = *from++; - if ( *from ) - *to++ = 0x20; // ' ' - else - break; - } - if ( to > first && *(to-1) == 0x20 ) - to--; - *to = '\0'; - result.resize( (int)(to - result.data()) + 1 ); - return result; -} - -QCString &QCString::replace( uint index, uint len, const char *s) -{ - remove( index, len ); - insert( index, s ); - return *this; -} - -#if 0 -QCString &QCString::replace( const QRegExp &rx, const char *str ) -{ - if ( isEmpty() ) - return *this; - int index = 0; - int slen = qstrlen(str); - int len; - while ( index < (int)length() ) { - index = rx.match( data(), index, &len, FALSE ); - if ( index >= 0 ) { - replace( index, len, str ); - index += slen; - if ( !len ) - break; // Avoid infinite loop on 0-length matches, e.g. [a-z]* - } - else - break; - } - return *this; -} -#endif - -static bool ok_in_base( char c, int base ) -{ - if ( base <= 10 ) - return c>='0' && c<='9' && (c-'0') < base; - else - return (c>='0' && c<='9') || - (c >= 'a' && c < char('a'+base-10)) || - (c >= 'A' && c < char('A'+base-10)); -} - -short QCString::toShort(bool *ok, int base) const -{ - long v = toLong( ok, base ); - if ( ok && *ok && (v < -32768 || v > 32767) ) { - *ok = FALSE; - v = 0; - } - return (short)v; -} - -ushort QCString::toUShort(bool *ok,int base) const -{ - ulong v = toULong( ok, base ); - if ( ok && *ok && (v > 65535) ) { - *ok = FALSE; - v = 0; - } - return (ushort)v; -} - -int QCString::toInt(bool *ok, int base) const -{ - return (int)toLong( ok, base ); -} - -uint QCString::toUInt(bool *ok,int base) const -{ - return (uint)toULong( ok, base ); -} - - -long QCString::toLong(bool *ok,int base) const -{ - const char *p = data(); - long val=0; - int l = length(); - const long max_mult = INT_MAX / base; - bool is_ok = FALSE; - int neg = 0; - if ( !p ) - goto bye; - while ( l && isspace(*p) ) // skip leading space - l--,p++; - if ( l && *p == '-' ) { - l--; - p++; - neg = 1; - } else if ( *p == '+' ) { - l--; - p++; - } - - // NOTE: toULong() code is similar - if ( !l || !ok_in_base(*p,base) ) - goto bye; - while ( l && ok_in_base(*p,base) ) { - l--; - int dv; - if ( *p>='0' && *p<='9' ) { - dv = *p-'0'; - } else { - if ( *p >= 'a' && *p <= 'z' ) - dv = *p - 'a' + 10; - else - dv = *p - 'A' + 10; - } - if ( val > max_mult || (val == max_mult && dv > (INT_MAX%base)+neg) ) - goto bye; - val = base*val + dv; - p++; - } - if ( neg ) - val = -val; - while ( l && isspace(*p) ) // skip trailing space - l--,p++; - if ( !l ) - is_ok = TRUE; -bye: - if ( ok ) - *ok = is_ok; - return is_ok ? val : 0; -} - -ulong QCString::toULong(bool *ok,int base) const -{ - const char *p = data(); - ulong val=0; - int l = length(); - const ulong max_mult = 429496729; // UINT_MAX/10, rounded down - bool is_ok = FALSE; - if ( !p ) - goto bye; - while ( l && isspace(*p) ) // skip leading space - l--,p++; - if ( *p == '+' ) - l--,p++; - - // NOTE: toLong() code is similar - if ( !l || !ok_in_base(*p,base) ) - goto bye; - while ( l && ok_in_base(*p,base) ) { - l--; - uint dv; - if ( *p>='0' && *p<='9' ) { - dv = *p-'0'; - } else { - if ( *p >= 'a' && *p <= 'z' ) - dv = *p - 'a' + 10; - else - dv = *p - 'A' + 10; - } - if ( val > max_mult || (val == max_mult && dv > (UINT_MAX%base)) ) - goto bye; - val = base*val + dv; - p++; - } - - while ( l && isspace(*p) ) // skip trailing space - l--,p++; - if ( !l ) - is_ok = TRUE; -bye: - if ( ok ) - *ok = is_ok; - return is_ok ? val : 0; -} - -uint64 QCString::toUInt64(bool *ok,int base) const -{ - const char *p = data(); - uint64 val=0; - int l = length(); - const uint64 max_mult = 1844674407370955161ULL; // ULLONG_MAX/10, rounded down - bool is_ok = FALSE; - if ( !p ) - goto bye; - while ( l && isspace(*p) ) // skip leading space - l--,p++; - if ( *p == '+' ) - l--,p++; - - // NOTE: toULong() code is similar - if ( !l || !ok_in_base(*p,base) ) - goto bye; - while ( l && ok_in_base(*p,base) ) { - l--; - uint dv; - if ( *p>='0' && *p<='9' ) { - dv = *p-'0'; - } else { - if ( *p >= 'a' && *p <= 'z' ) - dv = *p - 'a' + 10; - else - dv = *p - 'A' + 10; - } - if ( val > max_mult || (val == max_mult && dv > (ULLONG_MAX%base)) ) - goto bye; - val = base*val + dv; - p++; - } - - while ( l && isspace(*p) ) // skip trailing space - l--,p++; - if ( !l ) - is_ok = TRUE; -bye: - if ( ok ) - *ok = is_ok; - return is_ok ? val : 0; -} - -//------------------------------------------------- - -void *qmemmove( void *dst, const void *src, uint len ) -{ - char *d; - char *s; - if ( dst > src ) { - d = (char *)dst + len - 1; - s = (char *)src + len - 1; - while ( len-- ) - *d-- = *s--; - } else if ( dst < src ) { - d = (char *)dst; - s = (char *)src; - while ( len-- ) - *d++ = *s++; - } - return dst; -} - -char *qstrdup( const char *str ) -{ - if ( !str ) - return 0; - char *dst = new char[qstrlen(str)+1]; - CHECK_PTR( dst ); - return strcpy( dst, str ); -} - -char *qstrncpy( char *dst, const char *src, uint len ) -{ - if ( !src ) - return 0; - strncpy( dst, src, len ); - if ( len > 0 ) - dst[len-1] = '\0'; - return dst; -} - -int qstricmp( const char *str1, const char *str2 ) -{ - const uchar *s1 = (const uchar *)str1; - const uchar *s2 = (const uchar *)str2; - int res; - uchar c; - if ( !s1 || !s2 ) - return s1 == s2 ? 0 : (int)(s2 - s1); - for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ ) - if ( !c ) // strings are equal - break; - return res; -} - -int qstrnicmp( const char *str1, const char *str2, uint len ) -{ - const uchar *s1 = (const uchar *)str1; - const uchar *s2 = (const uchar *)str2; - int res; - uchar c; - if ( !s1 || !s2 ) - return (int)(s2 - s1); - for ( ; len--; s1++, s2++ ) { - if ( (res = (c=tolower(*s1)) - tolower(*s2)) ) - return res; - if ( !c ) // strings are equal - break; - } - return 0; -} - -#ifndef QT_NO_DATASTREAM - -QDataStream &operator<<( QDataStream &s, const QByteArray &a ) -{ - return s.writeBytes( a.data(), a.size() ); -} - -QDataStream &operator>>( QDataStream &s, QByteArray &a ) -{ - Q_UINT32 len; - s >> len; // read size of array - if ( len == 0 || s.eof() ) { // end of file reached - a.resize( 0 ); - return s; - } - if ( !a.resize( (uint)len ) ) { // resize array -#if defined(CHECK_NULL) - qWarning( "QDataStream: Not enough memory to read QByteArray" ); -#endif - len = 0; - } - if ( len > 0 ) // not null array - s.readRawBytes( a.data(), (uint)len ); - return s; -} - -QDataStream &operator<<( QDataStream &s, const QCString &str ) -{ - return s.writeBytes( str.data(), str.size() ); -} - -QDataStream &operator>>( QDataStream &s, QCString &str ) -{ - Q_UINT32 len; - s >> len; // read size of string - if ( len == 0 || s.eof() ) { // end of file reached - str.resize( 0 ); - return s; - } - if ( !str.resize( (uint)len )) {// resize string -#if defined(CHECK_NULL) - qWarning( "QDataStream: Not enough memory to read QCString" ); -#endif - len = 0; - } - if ( len > 0 ) // not null array - s.readRawBytes( str.rawData(), (uint)len ); - return s; -} - -#endif //QT_NO_DATASTREAM - -/// substitute all occurrences of \a src in \a s by \a dst -QCString substitute(const QCString &s,const QCString &src,const QCString &dst) -{ - if (s.isEmpty() || src.isEmpty()) return s; - const char *p, *q; - int srcLen = src.length(); - int dstLen = dst.length(); - int resLen; - if (srcLen!=dstLen) - { - int count; - for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++; - resLen = s.length()+count*(dstLen-srcLen); - } - else // result has same size as s - { - resLen = s.length(); - } - QCString result(resLen+1); - char *r; - for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen) - { - int l = (int)(q-p); - memcpy(r,p,l); - r+=l; - - if (dst) memcpy(r,dst,dstLen); - r+=dstLen; - } - if (r) - { - qstrcpy(r,p); - } - //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data()); - return result; -} - - -/// substitute all occurrences of \a src in \a s by \a dst, but skip -/// each consecutive sequence of \a src where the number consecutive -/// \a src matches \a skip_seq; if \a skip_seq is negative, skip any -/// number of consecutive \a src -QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq) -{ - if (s.isEmpty() || src.isEmpty()) return s; - const char *p, *q; - int srcLen = src.length(); - int dstLen = dst.length(); - int resLen; - if (srcLen!=dstLen) - { - int count; - for (count=0, p=s.data(); (q=strstr(p,src))!=0; p=q+srcLen) count++; - resLen = s.length()+count*(dstLen-srcLen); - } - else // result has same size as s - { - resLen = s.length(); - } - QCString result(resLen+1); - char *r; - for (r=result.rawData(), p=s; (q=strstr(p,src))!=0; p=q+srcLen) - { - // search a consecutive sequence of src - int seq = 0, skip = 0; - if (skip_seq) - { - for (const char *n=q+srcLen; qstrncmp(n,src,srcLen)==0; seq=1+skip, n+=srcLen) - ++skip; // number of consecutive src after the current one - - // verify the allowed number of consecutive src to skip - if (skip_seq > 0 && skip_seq != seq) - seq = skip = 0; - } - - // skip a consecutive sequence of src when necessary - int l = (int)((q + seq * srcLen)-p); - memcpy(r,p,l); - r+=l; - - if (skip) - { - // skip only the consecutive src found after the current one - q += skip * srcLen; - // the next loop will skip the current src, aka (p=q+srcLen) - continue; - } - - if (dst) memcpy(r,dst,dstLen); - r+=dstLen; - } - qstrcpy(r,p); - result.resize((int)strlen(result.data())+1); - //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data()); - return result; -} - diff --git a/qtools/qcstring.h b/qtools/qcstring.h deleted file mode 100644 index 2efdc2d..0000000 --- a/qtools/qcstring.h +++ /dev/null @@ -1,531 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1997-2015 by Dimitri van Heesch. -** -** Permission to use, copy, modify, and distribute this software and its -** documentation under the terms of the GNU General Public License is hereby -** granted. No representations are made about the suitability of this software -** for any purpose. It is provided "as is" without express or implied warranty. -** See the GNU General Public License for more details. -** -** Note: this is a reimplementation of the qcstring.h that came with -** an Qt version 2.2.3. For short strings it stores the string data inside -** the object. For long strings it uses a separate array with reference counting. -** -**********************************************************************/ - -#ifndef QCSTRING_H -#define QCSTRING_H - -#ifndef QT_H -#include "qarray.h" -#endif // QT_H - -#include <string> -#include <algorithm> - -#include <cctype> -#include <cstring> -#include <cstdio> -#include <cstdlib> -#include <cstdint> -#include <ostream> - -/***************************************************************************** - Safe and portable C string functions; extensions to standard string.h - *****************************************************************************/ - -void *qmemmove( void *dst, const void *src, uint len ); - -#if defined(_OS_WIN32_) -#define qsnprintf _snprintf -#else -#define qsnprintf snprintf -#endif - -char *qstrdup( const char * ); - -inline uint cstrlen( const char *str ) -{ return (uint)strlen(str); } - -inline uint qstrlen( const char *str ) -{ return str ? (uint)strlen(str) : 0; } - -inline char *cstrcpy( char *dst, const char *src ) -{ return strcpy(dst,src); } - -inline char *qstrcpy( char *dst, const char *src ) -{ return src ? strcpy(dst, src) : 0; } - -char * qstrncpy(char *dst,const char *src, uint len); - -inline int cstrcmp( const char *str1, const char *str2 ) -{ return strcmp(str1,str2); } - -inline int qstrcmp( const char *str1, const char *str2 ) -{ return (str1 && str2) ? strcmp(str1,str2) : (int)((intptr_t)str2 - (intptr_t)str1); } - -inline int cstrncmp( const char *str1, const char *str2, uint len ) -{ return strncmp(str1,str2,len); } - -inline int qstrncmp( const char *str1, const char *str2, uint len ) -{ return (str1 && str2) ? strncmp(str1,str2,len) : - (int)((intptr_t)str2 - (intptr_t)str1); } - -int qstricmp( const char *str1, const char *str2 ); - -int qstrnicmp( const char *str1, const char *str2, uint len ); - -/***************************************************************************** - QByteArray class - *****************************************************************************/ - -#if defined(Q_TEMPLATEDLL) -template class QArray<char>; -#endif -typedef QArray<char> QByteArray; - -/***************************************************************************** - QByteArray stream functions - *****************************************************************************/ -#ifndef QT_NO_DATASTREAM -QDataStream &operator<<( QDataStream &, const QByteArray & ); -QDataStream &operator>>( QDataStream &, QByteArray & ); -#endif - -//class QRegExp; - -/** This is an alternative implementation of QCString. It provides basically - * the same functions but uses std::string as the underlying string type - */ -class QCString -{ - public: - QCString() = default; - ~QCString() = default; - QCString( const QCString &s ) = default; - QCString &operator=( const QCString &s ) = default; - QCString( QCString &&s ) = default; - QCString &operator=( QCString &&s ) = default; - - QCString( const std::string &s ) : m_rep(s) {} - - /** creates a string with room for size characters - * @param[in] size the number of character to allocate (also counting the 0-terminator!) - */ - explicit QCString( uint size ) { m_rep.resize(size>0 ? size-1 : 0); } - - /** creates a string from a plain C string. - * @param[in] str A zero terminated C string. When 0 an empty string is created. - */ - QCString( const char *str ) : m_rep(str?str:"") {} - - /** creates a string from \a str and copies over the first \a maxlen characters. */ - QCString( const char *str, uint maxlen ) : m_rep(str?str:"") { m_rep.resize(maxlen); } - - /** replaces the contents by that of string \a s. */ - - /** replaces the contents by that of C string \a str. */ - QCString &operator=( const char *str) { m_rep = str?str:""; return *this; } - - /** Returns TRUE iff the string is empty. Equivalent to isEmpty(). */ - bool isNull() const { return m_rep.empty(); } - - /** Returns TRUE iff the string is empty */ - bool isEmpty() const { return m_rep.empty(); } - - /** Returns the length of the string, not counting the 0-terminator. Equivalent to size(). */ - uint length() const { return (uint)m_rep.size(); } - - /** Returns the length of the string, not counting the 0-terminator. */ - uint size() const { return (uint)m_rep.size(); } - - /** Returns a pointer to the contents of the string in the form of a 0-terminated C string */ - const char *data() const { return m_rep.empty() ? 0 : m_rep.c_str(); } - - /** Returns a writable pointer to the data. - * @warning if the string is shared it will modifying the string directly and - * this will overwrite all copies as well! - */ - char *rawData() const { return m_rep.empty() ? 0 : const_cast<char*>(&m_rep[0]); } - - /** Resizes the string to hold \a newlen characters - * (this value should also count the 0-terminator). - * If the string is enlarged the contents will - * be left unmodified. - */ - bool resize( uint newlen ) { m_rep.resize( newlen>0 ? newlen-1 : 0 ); return TRUE; } - - /** Truncates the string at position \a pos. */ - bool truncate( uint pos ) { return resize( pos + 1 ); } - - /** Fills a string with a predefined character - * @param[in] c the character used to fill the string with. - * @param[in] len the number of character to fill. Use -1 to fill the whole string. - * @note the string will be resized to contain \a len characters. The contents of the - * string will be lost. - */ - bool fill( char c, int len = -1 ) - { - int l = len==-1 ? (int)m_rep.size() : len; - m_rep = std::string(l,c); - return TRUE; - } - - /** Returns a deep copy of the string. */ - QCString copy() const { return *this; } - - QCString &sprintf( const char *format, ... ); - - int find( char c, int index=0, bool cs=TRUE ) const; - int find( const char *str, int index=0, bool cs=TRUE ) const; - int find( const QCString &str, int index=0, bool cs=TRUE ) const; - //int find( const QRegExp &rx, int index=0 ) const; - - int findRev( char c, int index=-1, bool cs=TRUE) const; - int findRev( const char *str, int index=-1, bool cs=TRUE) const; - //int findRev( const QRegExp &rx, int index=-1 ) const; - - int contains( char c, bool cs=TRUE ) const; - int contains( const char *str, bool cs=TRUE ) const; - //int contains( const QRegExp &rx ) const; - - bool stripPrefix(const char *prefix) - { - if (prefix==0 || m_rep.empty()) return FALSE; - if (m_rep.rfind(prefix,0)==0) // string starts with prefix - { - m_rep.erase(0,qstrlen(prefix)); - return TRUE; - } - return FALSE; - } - - QCString left( uint len ) const - { - return m_rep.empty() ? QCString() : QCString(m_rep.substr(0,len)); - } - - QCString right( uint len ) const - { - return m_rep.empty() ? QCString() : - len<m_rep.size() ? QCString(m_rep.substr(m_rep.size()-len,len)) : - *this; - } - - QCString mid( uint index, uint len=(uint)-1) const - { - uint slen = (uint)m_rep.size(); - if (len==(uint)-1) len = slen-index; - return m_rep.empty() || index>slen || len==0 ? QCString() : - QCString(m_rep.substr(index,len)); - } - - QCString lower() const - { - std::string s = m_rep; - std::transform(s.begin(),s.end(),s.begin(), - [](unsigned char c){ return (unsigned char)std::tolower(c); }); - return s; - } - - QCString upper() const - { - std::string s = m_rep; - std::transform(s.begin(),s.end(),s.begin(), - [](unsigned char c){ return (unsigned char)std::toupper(c); }); - return s; - } - - QCString stripWhiteSpace() const - { - int sl = (uint)m_rep.size(); - if (sl==0 || (!std::isspace(m_rep[0]) && !std::isspace(m_rep[sl-1]))) return *this; - int start=0,end=sl-1; - while (start<sl && std::isspace(m_rep[start])) start++; - if (start==sl) return QCString(); // only whitespace - while (end>start && std::isspace(m_rep[end])) end--; - return QCString(m_rep.substr(start,1+end-start)); - } - - QCString simplifyWhiteSpace() const; - - QCString &insert( uint index, const char *s ) - { - uint len = s ? qstrlen(s) : 0; - if (len>0) - { - uint ol = (uint)m_rep.size(); - if (index>ol) // insert beyond end of string and fill gap with spaces - { - m_rep.resize(index+len); - std::memset(&m_rep[ol],' ',index-ol); - std::memcpy(&m_rep[index],s,len+1); - } - else // insert inside the string - { - m_rep.insert(index,s); - } - } - return *this; - } - - QCString &insert( uint index, char c) - { - char s[2] = { c, '\0' }; - return insert(index,s); - } - - QCString &append( const char *s ) - { - return operator+=(s); - } - - QCString &prepend( const char *s ) - { - return insert(0,s); - } - - QCString &remove( uint index, uint len ) - { - uint ol = (uint)m_rep.size(); - if (index<ol && len>0) m_rep.erase(index,index+len>=ol ? std::string::npos : len); - return *this; - } - - QCString &replace( uint index, uint len, const char *s); - //QCString &replace( const QRegExp &rx, const char *str ); - - short toShort( bool *ok=0, int base=10 ) const; - ushort toUShort( bool *ok=0, int base=10 ) const; - int toInt( bool *ok=0, int base=10 ) const; - uint toUInt( bool *ok=0, int base=10 ) const; - long toLong( bool *ok=0, int base=10 ) const; - ulong toULong( bool *ok=0, int base=10 ) const; - uint64 toUInt64( bool *ok=0, int base=10 ) const; - - QCString &setNum(short n) - { - m_rep = std::to_string(n); - return *this; - } - - QCString &setNum(ushort n) - { - m_rep = std::to_string(n); - return *this; - } - - QCString &setNum(int n) - { - m_rep = std::to_string(n); - return *this; - } - - QCString &setNum(uint n) - { - m_rep = std::to_string(n); - return *this; - } - - QCString &setNum(long n) - { - m_rep = std::to_string(n); - return *this; - } - - QCString &setNum(ulong n) - { - m_rep = std::to_string(n); - return *this; - } - - bool startsWith( const char *s ) const - { - if (m_rep.empty() || s==0) return s==0; - return m_rep.rfind(s,0)==0; // looking "backward" starting and ending at index 0 - } - - /** Converts the string to a plain C string */ - operator const char *() const - { - return data(); - } - - std::string str() const - { - return m_rep; - } - - QCString &operator+=( const QCString &s) - { - m_rep+=s.str(); - return *this; - } - - QCString &operator+=( const std::string &s) - { - m_rep+=s; - return *this; - } - - /** Appends string \a str to this string and returns a reference to the result. */ - QCString &operator+=( const char *s ) - { - if (s) m_rep+=s; - return *this; - } - - /** Appends character \a c to this string and returns a reference to the result. */ - QCString &operator+=( char c ) - { - m_rep+=c; - return *this; - } - - /** Returns a reference to the character at index \a i. */ - char &at( uint i) const - { - return const_cast<char&>(m_rep[i]); - } - - /** Indexing operator. Equivalent to at(). */ - char &operator[]( int i ) const - { - return const_cast<char&>(m_rep[i]); - } - - private: - std::string m_rep; -}; - -/***************************************************************************** - QCString stream functions - *****************************************************************************/ -#ifndef QT_NO_DATASTREAM -QDataStream &operator<<( QDataStream &, const QCString & ); -QDataStream &operator>>( QDataStream &, QCString & ); -#endif - -/***************************************************************************** - QCString non-member operators - *****************************************************************************/ - -inline bool operator==( const QCString &s1, const QCString &s2 ) -{ return qstrcmp(s1.data(),s2.data()) == 0; } - -inline bool operator==( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) == 0; } - -inline bool operator==( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) == 0; } - -inline bool operator!=( const QCString &s1, const QCString &s2 ) -{ return qstrcmp(s1.data(),s2.data()) != 0; } - -inline bool operator!=( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) != 0; } - -inline bool operator!=( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) != 0; } - -inline bool operator<( const QCString &s1, const QCString& s2 ) -{ return qstrcmp(s1.data(),s2.data()) < 0; } - -inline bool operator<( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) < 0; } - -inline bool operator<( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) < 0; } - -inline bool operator<=( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) <= 0; } - -inline bool operator<=( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) <= 0; } - -inline bool operator>( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) > 0; } - -inline bool operator>( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) > 0; } - -inline bool operator>=( const QCString &s1, const char *s2 ) -{ return qstrcmp(s1.data(),s2) >= 0; } - -inline bool operator>=( const char *s1, const QCString &s2 ) -{ return qstrcmp(s1,s2.data()) >= 0; } - -inline QCString operator+( const QCString &s1, const QCString &s2 ) -{ - return QCString(s1.str()+s2.str()); -} - - -inline QCString operator+( const QCString &s1, const char *s2 ) -{ - QCString tmp(s1); - tmp += s2; - return tmp; -} - -inline QCString operator+( const char *s1, const QCString &s2 ) -{ - QCString tmp(s1); - tmp += s2; - return tmp; -} - -inline QCString operator+( const QCString &s1, char c2 ) -{ - QCString tmp( s1.data() ); - tmp += c2; - return tmp; -} - -inline QCString operator+( char c1, const QCString &s2 ) -{ - QCString tmp; - tmp += c1; - tmp += s2; - return tmp; -} - -inline const char *qPrint(const char *s) -{ - if (s) return s; else return ""; -} - -inline const char *qPrint(const QCString &s) -{ - if (!s.isEmpty()) return s.data(); else return ""; -} - -inline const char *qPrint(const std::string &s) -{ - return s.c_str(); -} - -inline std::string toStdString(const QCString &s) -{ - return s.str(); -} - -// helper functions -QCString substitute(const QCString &str,const QCString &find,const QCString &replace); -QCString substitute(const QCString &s,const QCString &src,const QCString &dst,int skip_seq); - -inline QCString substitute(const QCString &s,char srcChar,char dstChar) -{ - std::string ss = s.str(); - std::replace(ss.begin(),ss.end(),srcChar,dstChar); - return ss; -} - -inline std::ostream& operator<<(std::ostream& os, const QCString& s) -{ - os << s.str(); - return os; -} - -#endif // QCSTRING_H |