|
Packit Service |
50c9f2 |
/****************************************************************************
|
|
Packit Service |
50c9f2 |
**
|
|
Packit Service |
50c9f2 |
** Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit Service |
50c9f2 |
**
|
|
Packit Service |
50c9f2 |
** Permission to use, copy, modify, and distribute this software and its
|
|
Packit Service |
50c9f2 |
** documentation under the terms of the GNU General Public License is hereby
|
|
Packit Service |
50c9f2 |
** granted. No representations are made about the suitability of this software
|
|
Packit Service |
50c9f2 |
** for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit Service |
50c9f2 |
** See the GNU General Public License for more details.
|
|
Packit Service |
50c9f2 |
**
|
|
Packit Service |
50c9f2 |
** Note: this is a reimplementation of the qcstring.h that came with
|
|
Packit Service |
50c9f2 |
** an Qt version 2.2.3. For short strings it stores the string data inside
|
|
Packit Service |
50c9f2 |
** the object. For long strings it uses a separate array with reference counting.
|
|
Packit Service |
50c9f2 |
**
|
|
Packit Service |
50c9f2 |
**********************************************************************/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#ifndef QCSTRING_H
|
|
Packit Service |
50c9f2 |
#define QCSTRING_H
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#ifndef QT_H
|
|
Packit Service |
50c9f2 |
#include "qarray.h"
|
|
Packit Service |
50c9f2 |
#endif // QT_H
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#include <stdio.h>
|
|
Packit Service |
50c9f2 |
#include <stdlib.h>
|
|
Packit Service |
50c9f2 |
#include <string.h>
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if !defined(_OS_WIN32_) || defined(__MINGW32__)
|
|
Packit Service |
50c9f2 |
#include <stdint.h>
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if defined(_OS_SUN_) && defined(_CC_GNU_)
|
|
Packit Service |
50c9f2 |
#include <strings.h>
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#include <assert.h>
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
class QGString;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
Fixes and workarounds for some platforms
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if defined(_OS_HPUX_)
|
|
Packit Service |
50c9f2 |
// HP-UX has badly defined strstr() etc.
|
|
Packit Service |
50c9f2 |
// ### fix in 3.0: change hack_* to qt_hack_*
|
|
Packit Service |
50c9f2 |
// by the way HP-UX is probably right, the standard has evolved and
|
|
Packit Service |
50c9f2 |
// we'll have to adapt to it
|
|
Packit Service |
50c9f2 |
inline char *hack_strstr( const char *s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return (char *)strstr(s1, s2); }
|
|
Packit Service |
50c9f2 |
inline char *hack_strchr( const char *s, int c )
|
|
Packit Service |
50c9f2 |
{ return (char *)strchr(s, c); }
|
|
Packit Service |
50c9f2 |
inline char *hack_strrchr( const char *s, int c )
|
|
Packit Service |
50c9f2 |
{ return (char *)strrchr(s, c); }
|
|
Packit Service |
50c9f2 |
#define strstr(s1,s2) hack_strstr((s1),(s2))
|
|
Packit Service |
50c9f2 |
#define strchr(s,c) hack_strchr((s),(c))
|
|
Packit Service |
50c9f2 |
#define strrchr(s,c) hack_strrchr((s),(c))
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
Safe and portable C string functions; extensions to standard string.h
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT void *qmemmove( void *dst, const void *src, uint len );
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if defined(_OS_SUN_) || defined(_CC_OC_)
|
|
Packit Service |
50c9f2 |
#define memmove(s1,s2,n) qmemmove((s1),(s2),(n))
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if defined(_OS_WIN32_)
|
|
Packit Service |
50c9f2 |
#define qsnprintf _snprintf
|
|
Packit Service |
50c9f2 |
#else
|
|
Packit Service |
50c9f2 |
#define qsnprintf snprintf
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT char *qstrdup( const char * );
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline uint cstrlen( const char *str )
|
|
Packit Service |
50c9f2 |
{ return (uint)strlen(str); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline uint qstrlen( const char *str )
|
|
Packit Service |
50c9f2 |
{ return str ? (uint)strlen(str) : 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
|
|
Packit Service |
50c9f2 |
{ return strcpy(dst,src); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline char *qstrcpy( char *dst, const char *src )
|
|
Packit Service |
50c9f2 |
{ return src ? strcpy(dst, src) : 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT char * qstrncpy(char *src,const char *dst, uint len);
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
|
|
Packit Service |
50c9f2 |
{ return strcmp(str1,str2); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 )
|
|
Packit Service |
50c9f2 |
{ return (str1 && str2) ? strcmp(str1,str2) : (int)((intptr_t)str2 - (intptr_t)str1); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len )
|
|
Packit Service |
50c9f2 |
{ return strncmp(str1,str2,len); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline int qstrncmp( const char *str1, const char *str2, uint len )
|
|
Packit Service |
50c9f2 |
{ return (str1 && str2) ? strncmp(str1,str2,len) :
|
|
Packit Service |
50c9f2 |
(int)((intptr_t)str2 - (intptr_t)str1); }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT int qstricmp( const char *str1, const char *str2 );
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT int qstrnicmp( const char *str1, const char *str2, uint len );
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
QByteArray class
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#if defined(Q_TEMPLATEDLL)
|
|
Packit Service |
50c9f2 |
template class Q_EXPORT QArray<char>;
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
typedef QArray<char> QByteArray;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
QByteArray stream functions
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
#ifndef QT_NO_DATASTREAM
|
|
Packit Service |
50c9f2 |
Q_EXPORT QDataStream &operator<<( QDataStream &, const QByteArray & );
|
|
Packit Service |
50c9f2 |
Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & );
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
class QRegExp;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** This is an alternative implementation of QCString. It provides basically
|
|
Packit Service |
50c9f2 |
* the same functions but uses reference counting and copy on write.
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
class QCString
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
public:
|
|
Packit Service |
50c9f2 |
/** creates an empty string */
|
|
Packit Service |
50c9f2 |
QCString() : m_rep()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** destroys the string */
|
|
Packit Service |
50c9f2 |
~QCString()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** makes a copy of a string. */
|
|
Packit Service |
50c9f2 |
QCString( const QCString &s ) : m_rep(s.m_rep)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** creates a string with room for size characters
|
|
Packit Service |
50c9f2 |
* @param[in] size the number of character to allocate (including the 0-terminator)
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
explicit QCString( int size ) : m_rep(size)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** creates a string from a plain C string.
|
|
Packit Service |
50c9f2 |
* @param[in] str A zero terminated C string. When 0 an empty string is created.
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
QCString( const char *str ) : m_rep(str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** creates a string from \a str and copies over the first \a maxlen characters. */
|
|
Packit Service |
50c9f2 |
QCString( const char *str, uint maxlen ) : m_rep(str,maxlen)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** replaces the contents by that of string \a s. */
|
|
Packit Service |
50c9f2 |
QCString &operator=( const QCString &s )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
m_rep = s.m_rep;
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** replaces the contents by that of C string \a str. */
|
|
Packit Service |
50c9f2 |
QCString &operator=( const char *str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
m_rep = str;
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns TRUE iff the string is empty. Equivalent to isEmpty(). */
|
|
Packit Service |
50c9f2 |
bool isNull() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.isEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns TRUE iff the string is empty */
|
|
Packit Service |
50c9f2 |
bool isEmpty() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.isEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns the length of the string, excluding the 0-terminator. Equivalent to size(). */
|
|
Packit Service |
50c9f2 |
uint length() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.length();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns the length of the string, excluding the 0-terminator. */
|
|
Packit Service |
50c9f2 |
uint size() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.length();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns a pointer to the contents of the string in the form of a 0-terminated C string */
|
|
Packit Service |
50c9f2 |
const char *data() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.data();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns a writable pointer to the data.
|
|
Packit Service |
50c9f2 |
* @warning if the string is shared it will modifying the string directly and
|
|
Packit Service |
50c9f2 |
* this will overwrite all copies as well!
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
char *rawData() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.rawData();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Resizes the string to hold \a newlen characters
|
|
Packit Service |
50c9f2 |
* (this value should include the 0-terminator). If the string is enlarged the contents will
|
|
Packit Service |
50c9f2 |
* be left unmodified.
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
bool resize( uint newlen )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
m_rep.resize(newlen);
|
|
Packit Service |
50c9f2 |
return TRUE;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Truncates the string at position \a pos. */
|
|
Packit Service |
50c9f2 |
bool truncate( uint pos )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return resize(pos+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Fills a string with a predefined character
|
|
Packit Service |
50c9f2 |
* @param[in] c the character used to fill the string with.
|
|
Packit Service |
50c9f2 |
* @param[in] len the number of character to fill. Use -1 to fill the whole string.
|
|
Packit Service |
50c9f2 |
* @note the string will be resized to contain \a len characters. The contents of the
|
|
Packit Service |
50c9f2 |
* string will be lost.
|
|
Packit Service |
50c9f2 |
*/
|
|
Packit Service |
50c9f2 |
bool fill( char c, int len = -1 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
m_rep.fill(c,len);
|
|
Packit Service |
50c9f2 |
return TRUE;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns a deep copy of the string. */
|
|
Packit Service |
50c9f2 |
QCString copy() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (length()==0) return QCString();
|
|
Packit Service |
50c9f2 |
QCString cs(length()+1);
|
|
Packit Service |
50c9f2 |
memcpy(cs.rawData(),data(),length());
|
|
Packit Service |
50c9f2 |
return cs;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
QCString &sprintf( const char *format, ... );
|
|
Packit Service |
50c9f2 |
int find( char c, int index=0, bool cs=TRUE ) const;
|
|
Packit Service |
50c9f2 |
int find( const char *str, int index=0, bool cs=TRUE ) const;
|
|
Packit Service |
50c9f2 |
int find( const QCString &str, int index=0, bool cs=TRUE ) const;
|
|
Packit Service |
50c9f2 |
int find( const QRegExp &rx, int index=0 ) const;
|
|
Packit Service |
50c9f2 |
int findRev( char c, int index=-1, bool cs=TRUE) const;
|
|
Packit Service |
50c9f2 |
int findRev( const char *str, int index=-1, bool cs=TRUE) const;
|
|
Packit Service |
50c9f2 |
int findRev( const QRegExp &rx, int index=-1 ) const;
|
|
Packit Service |
50c9f2 |
int contains( char c, bool cs=TRUE ) const;
|
|
Packit Service |
50c9f2 |
int contains( const char *str, bool cs=TRUE ) const;
|
|
Packit Service |
50c9f2 |
int contains( const QRegExp &rx ) const;
|
|
Packit Service |
50c9f2 |
bool stripPrefix(const char *prefix);
|
|
Packit Service |
50c9f2 |
QCString left( uint len ) const;
|
|
Packit Service |
50c9f2 |
QCString right( uint len ) const;
|
|
Packit Service |
50c9f2 |
QCString mid( uint index, uint len=0xffffffff) const;
|
|
Packit Service |
50c9f2 |
QCString lower() const;
|
|
Packit Service |
50c9f2 |
QCString upper() const;
|
|
Packit Service |
50c9f2 |
QCString stripWhiteSpace() const;
|
|
Packit Service |
50c9f2 |
QCString simplifyWhiteSpace() const;
|
|
Packit Service |
50c9f2 |
QCString &assign( const char *str );
|
|
Packit Service |
50c9f2 |
QCString &insert( uint index, const char *s );
|
|
Packit Service |
50c9f2 |
QCString &insert( uint index, char c);
|
|
Packit Service |
50c9f2 |
QCString &append( const char *s );
|
|
Packit Service |
50c9f2 |
QCString &prepend( const char *s );
|
|
Packit Service |
50c9f2 |
QCString &remove( uint index, uint len );
|
|
Packit Service |
50c9f2 |
QCString &replace( uint index, uint len, const char *s);
|
|
Packit Service |
50c9f2 |
QCString &replace( const QRegExp &rx, const char *str );
|
|
Packit Service |
50c9f2 |
short toShort( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
ushort toUShort( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
int toInt( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
uint toUInt( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
long toLong( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
ulong toULong( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
uint64 toUInt64( bool *ok=0 ) const;
|
|
Packit Service |
50c9f2 |
QCString &setNum(short n);
|
|
Packit Service |
50c9f2 |
QCString &setNum(ushort n);
|
|
Packit Service |
50c9f2 |
QCString &setNum(int n);
|
|
Packit Service |
50c9f2 |
QCString &setNum(uint n);
|
|
Packit Service |
50c9f2 |
QCString &setNum(long n);
|
|
Packit Service |
50c9f2 |
QCString &setNum(ulong n);
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Converts the string to a plain C string */
|
|
Packit Service |
50c9f2 |
operator const char *() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return (const char *)data();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Appends string \a str to this string and returns a reference to the result. */
|
|
Packit Service |
50c9f2 |
QCString &operator+=( const char *str )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (!str) return *this;
|
|
Packit Service |
50c9f2 |
int len1 = length();
|
|
Packit Service |
50c9f2 |
int len2 = (int)strlen(str);
|
|
Packit Service |
50c9f2 |
resize(len1+len2+1);
|
|
Packit Service |
50c9f2 |
memcpy(rawData()+len1,str,len2);
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Appends character \a c to this string and returns a reference to the result. */
|
|
Packit Service |
50c9f2 |
QCString &operator+=( char c )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
int len = length();
|
|
Packit Service |
50c9f2 |
resize(len+2);
|
|
Packit Service |
50c9f2 |
rawData()[len]=c;
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Returns a reference to the character at index \a i. */
|
|
Packit Service |
50c9f2 |
char &at( uint i) const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.at(i);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/** Indexing operator. Equavalent to at(). */
|
|
Packit Service |
50c9f2 |
char &operator[]( int i ) const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return m_rep.at((uint)i);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
private:
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
struct LSData;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
// long string representation
|
|
Packit Service |
50c9f2 |
struct LongStringRep
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
uchar isShort; // : 1; // should be shared with ShortStringRep
|
|
Packit Service |
50c9f2 |
//uchar : 7;
|
|
Packit Service |
50c9f2 |
LSData *d;
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#define SHORT_STR_CAPACITY ((int)sizeof(LongStringRep)-2)
|
|
Packit Service |
50c9f2 |
#define SHORT_STR_MAX_LEN (SHORT_STR_CAPACITY-1)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
// short string representation
|
|
Packit Service |
50c9f2 |
struct ShortStringRep
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
uchar isShort; // : 1; // should be shared with LongStringRep
|
|
Packit Service |
50c9f2 |
uchar len; // : 7;
|
|
Packit Service |
50c9f2 |
char str[SHORT_STR_CAPACITY]; // size including 0-terminator
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
// ref counting string header
|
|
Packit Service |
50c9f2 |
struct LSHeader
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
int len; // length of string without 0 terminator
|
|
Packit Service |
50c9f2 |
int refCount; // -1=leaked, 0=one ref & non-cost, n>0, n+1 refs, const
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
// ref counting string data and methods
|
|
Packit Service |
50c9f2 |
struct LSData : public LSHeader
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
char *toStr()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return (char*)(this+1); // string data starts after the header
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
// creates a LSData item with room for size bytes (which includes the 0 terminator!)
|
|
Packit Service |
50c9f2 |
// if size is zero, an empty string will be created.
|
|
Packit Service |
50c9f2 |
static LSData *create(int size)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
LSData *data;
|
|
Packit Service |
50c9f2 |
data = (LSData*)malloc(sizeof(LSHeader)+size);
|
|
Packit Service |
50c9f2 |
data->len = size-1;
|
|
Packit Service |
50c9f2 |
data->refCount = 0;
|
|
Packit Service |
50c9f2 |
data->toStr()[size-1] = 0;
|
|
Packit Service |
50c9f2 |
return data;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
// remove out reference to the data. Frees memory if no more users
|
|
Packit Service |
50c9f2 |
void dispose()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (--refCount<0) free(this);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
// resizes LSData so it can hold size bytes (which includes the 0 terminator!)
|
|
Packit Service |
50c9f2 |
// Since this is for long strings only, size should be > SHORT_STR_CAPACITY
|
|
Packit Service |
50c9f2 |
static LSData *resize(LSData *d,int size)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (d->len>0 && d->refCount==0) // non-const, non-empty
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
d = (LSData*)realloc(d,sizeof(LSHeader)+size);
|
|
Packit Service |
50c9f2 |
d->len = size-1;
|
|
Packit Service |
50c9f2 |
d->toStr()[size-1] = 0;
|
|
Packit Service |
50c9f2 |
return d;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // need to make a copy
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
LSData *newData = LSData::create(size);
|
|
Packit Service |
50c9f2 |
int len = d->len;
|
|
Packit Service |
50c9f2 |
if (len>=size) len=size-1;
|
|
Packit Service |
50c9f2 |
memcpy(newData->toStr(),d->toStr(),len);
|
|
Packit Service |
50c9f2 |
newData->toStr()[len]=0;
|
|
Packit Service |
50c9f2 |
d->dispose();
|
|
Packit Service |
50c9f2 |
return newData;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
class StringRep
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
public:
|
|
Packit Service |
50c9f2 |
StringRep()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
void initEmpty()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.isShort=TRUE;
|
|
Packit Service |
50c9f2 |
u.s.len=0;
|
|
Packit Service |
50c9f2 |
//memset(u.s.str,0,SHORT_STR_CAPACITY);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
~StringRep()
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (!u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d->dispose();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep(const StringRep &s)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (&s!=this)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.isShort = s.u.s.isShort;
|
|
Packit Service |
50c9f2 |
if (s.u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = s.u.s.len;
|
|
Packit Service |
50c9f2 |
memcpy(u.s.str,s.u.s.str,s.u.s.len+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = s.u.l.d;
|
|
Packit Service |
50c9f2 |
u.l.d->refCount++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // self-assignment
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u = s.u; // avoid uninitialized warning from gcc
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep(int size)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.isShort = size<=SHORT_STR_CAPACITY;
|
|
Packit Service |
50c9f2 |
if (size<=SHORT_STR_CAPACITY) // init short string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (size>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = size-1;
|
|
Packit Service |
50c9f2 |
u.s.str[size-1]='\0';
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = 0;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // int long string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = LSData::create(size);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep(const char *str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
int len = (int)strlen(str);
|
|
Packit Service |
50c9f2 |
u.s.isShort = len
|
|
Packit Service |
50c9f2 |
if (len
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = len;
|
|
Packit Service |
50c9f2 |
qstrncpy(u.s.str,str,SHORT_STR_CAPACITY);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = LSData::create(len+1);
|
|
Packit Service |
50c9f2 |
memcpy(u.l.d->toStr(),str,u.l.d->len);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // create empty string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep( const char *str, uint maxlen )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (str && maxlen>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
uint len=(uint)strlen(str);
|
|
Packit Service |
50c9f2 |
if (len>maxlen) len=maxlen;
|
|
Packit Service |
50c9f2 |
u.s.isShort = len<=SHORT_STR_MAX_LEN;
|
|
Packit Service |
50c9f2 |
if (u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = len;
|
|
Packit Service |
50c9f2 |
memcpy(u.s.str,str,len);
|
|
Packit Service |
50c9f2 |
u.s.str[len]='\0';
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = LSData::create(len+1);
|
|
Packit Service |
50c9f2 |
memcpy(u.l.d->toStr(),str,len);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // create empty string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep &operator=(const StringRep &s)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (&s!=this)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (!u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d->dispose();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
u.s.isShort = s.u.s.isShort;
|
|
Packit Service |
50c9f2 |
if (u.s.isShort) // copy by value
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = s.u.s.len;
|
|
Packit Service |
50c9f2 |
memcpy(u.s.str,s.u.s.str,s.u.s.len+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // copy by reference
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = s.u.l.d;
|
|
Packit Service |
50c9f2 |
u.l.d->refCount++;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // self-assignment
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u = s.u; // avoid uninitialized warning from gcc
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
StringRep &operator=(const char *str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (!u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d->dispose();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
if (str)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
int len = (int)strlen(str);
|
|
Packit Service |
50c9f2 |
u.s.isShort = len
|
|
Packit Service |
50c9f2 |
if (len
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = len;
|
|
Packit Service |
50c9f2 |
qstrncpy(u.s.str,str,SHORT_STR_CAPACITY);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = LSData::create(len+1);
|
|
Packit Service |
50c9f2 |
memcpy(u.l.d->toStr(),str,len);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
return *this;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
bool isEmpty() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return u.s.isShort && u.s.len==0;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
uint length() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
uint l = u.s.isShort ? u.s.len : u.l.d->len;
|
|
Packit Service |
50c9f2 |
return l;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
const char *data() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return u.s.len==0 ? 0 : u.s.str;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return u.l.d->len==0 ? 0 : u.l.d->toStr();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
char *rawData() const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return u.s.len==0 ? 0 : (char*)u.s.str;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
//assert(u.l.d->refCount==0); // string may not be shared when accessed raw
|
|
Packit Service |
50c9f2 |
return u.l.d->len==0 ? 0 : u.l.d->toStr();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
char &at(int i) const
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (u.s.isShort)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return (char&)u.s.str[i];
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
return u.l.d->toStr()[i];
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
bool resize( uint newlen )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (u.s.isShort && newlen<=SHORT_STR_CAPACITY) // resize short string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (newlen>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.s.len = newlen-1;
|
|
Packit Service |
50c9f2 |
u.s.str[newlen-1]='\0';
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // string becomes empty
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (u.s.isShort) // turn short string into long string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
StringRep tmp = *this;
|
|
Packit Service |
50c9f2 |
u.s.isShort=FALSE;
|
|
Packit Service |
50c9f2 |
u.l.d = LSData::create(newlen);
|
|
Packit Service |
50c9f2 |
if (tmp.u.s.len>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
memcpy(u.l.d->toStr(),tmp.u.s.str,tmp.u.s.len+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d->toStr()[0]='\0';
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (!u.s.isShort && newlen<=SHORT_STR_CAPACITY) // turn long string into short string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (newlen>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
StringRep tmp(newlen); // copy short part into tmp buffer
|
|
Packit Service |
50c9f2 |
memcpy(tmp.u.s.str,u.l.d->toStr(),newlen-1);
|
|
Packit Service |
50c9f2 |
tmp.u.s.str[newlen-1]='\0';
|
|
Packit Service |
50c9f2 |
u.l.d->dispose();
|
|
Packit Service |
50c9f2 |
u.s = tmp.u.s;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d->dispose();
|
|
Packit Service |
50c9f2 |
initEmpty();
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else // resize long string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
u.l.d = u.l.d->resize(u.l.d,newlen);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
return TRUE;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
bool fill( char c, int len )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (len<0) len=length();
|
|
Packit Service |
50c9f2 |
if (!u.s.isShort) // detach from shared string
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
resize(len+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
else if (len!=(int)length())
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (len>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
resize(len+1);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
if (len>0)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
memset(rawData(),c,len);
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
return TRUE;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
private:
|
|
Packit Service |
50c9f2 |
union ShortOrLongStringSelector
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
ShortStringRep s;
|
|
Packit Service |
50c9f2 |
LongStringRep l;
|
|
Packit Service |
50c9f2 |
} u;
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
StringRep m_rep;
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
};
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
QCString stream functions
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
#ifndef QT_NO_DATASTREAM
|
|
Packit Service |
50c9f2 |
Q_EXPORT QDataStream &operator<<( QDataStream &, const QCString & );
|
|
Packit Service |
50c9f2 |
Q_EXPORT QDataStream &operator>>( QDataStream &, QCString & );
|
|
Packit Service |
50c9f2 |
#endif
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
/*****************************************************************************
|
|
Packit Service |
50c9f2 |
QCString non-member operators
|
|
Packit Service |
50c9f2 |
*****************************************************************************/
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator==( const QCString &s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2.data()) == 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator==( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) == 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator==( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) == 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator!=( const QCString &s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2.data()) != 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator!=( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) != 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator!=( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) != 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator<( const QCString &s1, const QCString& s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2.data()) < 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator<( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) < 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator<( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) < 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator<=( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) <= 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator<=( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) <= 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator>( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) > 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator>( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) > 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator>=( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1.data(),s2) >= 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline bool operator>=( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{ return qstrcmp(s1,s2.data()) >= 0; }
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline QCString operator+( const QCString &s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
QCString tmp(s1);
|
|
Packit Service |
50c9f2 |
tmp += s2;
|
|
Packit Service |
50c9f2 |
return tmp;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
inline QCString operator+( const QCString &s1, const QGString &s2 );
|
|
Packit Service |
50c9f2 |
inline QCString operator+( const QGString &s1, const QCString &s2 );
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline QCString operator+( const QCString &s1, const char *s2 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
QCString tmp(s1);
|
|
Packit Service |
50c9f2 |
tmp += s2;
|
|
Packit Service |
50c9f2 |
return tmp;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline QCString operator+( const char *s1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
QCString tmp(s1);
|
|
Packit Service |
50c9f2 |
tmp += s2;
|
|
Packit Service |
50c9f2 |
return tmp;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline QCString operator+( const QCString &s1, char c2 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
QCString tmp( s1.data() );
|
|
Packit Service |
50c9f2 |
tmp += c2;
|
|
Packit Service |
50c9f2 |
return tmp;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
Q_EXPORT inline QCString operator+( char c1, const QCString &s2 )
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
QCString tmp;
|
|
Packit Service |
50c9f2 |
tmp += c1;
|
|
Packit Service |
50c9f2 |
tmp += s2;
|
|
Packit Service |
50c9f2 |
return tmp;
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
inline const char *qPrint(const char *s)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (s) return s; else return "";
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
inline const char *qPrint(const QCString &s)
|
|
Packit Service |
50c9f2 |
{
|
|
Packit Service |
50c9f2 |
if (!s.isEmpty()) return s.data(); else return "";
|
|
Packit Service |
50c9f2 |
}
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
#endif // QCSTRING_H
|