summaryrefslogtreecommitdiffstats
path: root/qtools
diff options
context:
space:
mode:
Diffstat (limited to 'qtools')
-rw-r--r--qtools/qcstring.cpp683
-rw-r--r--qtools/qcstring.h531
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