00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef _KJS_USTRING_H_
00025
#define _KJS_USTRING_H_
00026
00027
#include <kjs/global.h>
00028
00032
namespace DOM {
00033
class DOMString;
00034 }
00035
class KJScript;
00036
class QString;
00037
class QConstString;
00038
00039
namespace KJS {
00040
00041
class UCharReference;
00042
class UString;
00043
00051 struct KJS_EXPORT UChar {
00055 UChar();
00056 UChar(
char u);
00057 UChar(
unsigned char u);
00063 UChar(
unsigned char h ,
unsigned char l);
00068 UChar(
unsigned short u);
00069 UChar(
const UCharReference &c);
00073 unsigned char high()
const {
return uc >> 8; }
00077 unsigned char low()
const {
return uc; }
00081 unsigned short unicode()
const {
return uc; }
00082
public:
00086 UChar toLower() const;
00090 UChar toUpper() const;
00094 static UChar null;
00095
00096
unsigned short uc;
00097 } KJS_PACKED;
00098
00099 inline UChar::UChar() { }
00100 inline UChar::UChar(
unsigned char h ,
unsigned char l) : uc(h << 8 | l) { }
00101
inline UChar::UChar(
char u) : uc((unsigned char)u) { }
00102
inline UChar::UChar(
unsigned char u) : uc(u) { }
00103 inline UChar::UChar(
unsigned short u) : uc(u) { }
00104
00119 class KJS_EXPORT UCharReference {
00120
friend class UString;
00121 UCharReference(
UString *s,
unsigned int off) : str(s), offset(off) { }
00122
public:
00126 UCharReference& operator=(UChar c);
00130 UCharReference& operator=(
char c) {
return operator=(UChar(c)); }
00134 unsigned short unicode()
const {
return ref().uc; }
00138 unsigned char low()
const {
return ref().uc; }
00142 unsigned char high()
const {
return ref().uc >> 8; }
00146 UChar toLower()
const {
return ref().
toLower(); }
00150 UChar toUpper()
const {
return ref().toUpper(); }
00151
private:
00152
00153 UCharReference();
00154
00155 UChar& ref() const;
00156
UString *str;
00157
int offset;
00158 };
00159
00160 inline UChar::UChar(const UCharReference &c) : uc(c.unicode()) { }
00161
00165 class KJS_EXPORT CString {
00166
public:
00167 CString() : data(0L), length(0) { }
00168 CString(
const char *c);
00169 CString(
const char *c,
int len);
00170 CString(
const CString &);
00171
00172 ~CString();
00173
00174 CString &append(
const CString &);
00175 CString &operator=(
const char *c);
00176 CString &operator=(
const CString &);
00177 CString &operator+=(
const CString &c) {
return append(c); }
00178
00179
int size()
const {
return length; }
00180
const char *c_str()
const {
return data; }
00181
private:
00182
char *data;
00183
int length;
00184 };
00185
00189 class KJS_EXPORT UString {
00190
friend bool operator==(
const UString&,
const UString&);
00191
friend class UCharReference;
00192
friend class Identifier;
00193
friend class PropertyMap;
00194
friend class PropertyMapHashTableEntry;
00198
struct KJS_EXPORT Rep {
00199
friend class UString;
00200
friend bool operator==(
const UString&,
const UString&);
00201
00202
static Rep *create(UChar *d,
int l);
00203
void destroy();
00204
00205 UChar *data()
const {
return dat; }
00206
int size()
const {
return len; }
00207
00208
unsigned hash()
const {
if (_hash == 0) _hash = computeHash(dat, len);
return _hash; }
00209
00210
static unsigned computeHash(
const UChar *,
int length);
00211
static unsigned computeHash(
const char *);
00212
00213
void ref() { ++rc; }
00214
void deref() {
if (--rc == 0) destroy(); }
00215
00216 UChar *dat;
00217
int len;
00218
int capacity;
00219
int rc;
00220
mutable unsigned _hash;
00221
00222
enum { capacityForIdentifier = 0x10000000 };
00223
00224
static Rep null;
00225
static Rep empty;
00226 };
00227
00228
public:
00232 UString();
00236
explicit UString(
char c);
00240 UString(
const char *c);
00245 UString(
const UChar *c,
int length);
00252 UString(UChar *c,
int length,
bool copy);
00256 UString(
const UString &s) { attach(s.
rep); }
00264 UString(
const QString &);
00268 UString(
const DOM::DOMString &);
00272 UString(
const UString &,
const UString &);
00277 ~UString() { release(); }
00278
00282
static UString from(
int i);
00286
static UString from(
unsigned int u);
00290
static UString from(
long l);
00294
static UString from(
double d);
00295
00299 UString &append(
const UString &);
00300
00304 CString cstring() const;
00312
char *ascii() const;
00316 DOM::DOMString string() const;
00320
QString qstring() const;
00324
QConstString qconststring() const;
00325
00329 UString &operator=(const
char *c);
00330 UString &operator=(const UString &);
00334 UString &operator+=(const UString &s) {
return append(s); }
00335
00339 const UChar* data()
const {
return rep->data(); }
00343 bool isNull()
const {
return (rep == &Rep::null); }
00347 bool isEmpty()
const {
return (!rep->len); }
00355
bool is8Bit() const;
00359 int size()
const {
return rep->size(); }
00363 UChar operator[](
int pos)
const;
00367 UCharReference operator[](
int pos);
00368
00377
double toDouble(
bool tolerateTrailingJunk,
bool tolerateEmptyString)
const;
00378
double toDouble(
bool tolerateTrailingJunk)
const;
00379
double toDouble() const;
00386
unsigned long toULong(
bool *ok,
bool tolerateEmptyString) const;
00387
unsigned long toULong(
bool *ok = 0) const;
00388
00389
unsigned int toUInt32(
bool *ok = 0) const;
00390
unsigned int toStrictUInt32(
bool *ok = 0) const;
00391
00398
unsigned toArrayIndex(
bool *ok = 0) const;
00399
00403 UString toLower() const;
00407 UString toUpper() const;
00412
int find(const UString &f,
int pos = 0) const;
00413
int find(UChar,
int pos = 0) const;
00419
int rfind(const UString &f,
int pos) const;
00420
int rfind(UChar,
int pos) const;
00424 UString substr(
int pos = 0,
int len = -1) const;
00428 static UString null;
00429 #ifdef KJS_DEBUG_MEM
00433 static
void globalClear();
00434 #endif
00435 private:
00436 UString(Rep *r) { attach(r); }
00437
void attach(Rep *r);
00438
void detach();
00439
void release();
00440 Rep *rep;
00441 };
00442
00443 KJS_EXPORT
inline bool operator==(
const UChar &c1,
const UChar &c2) {
00444
return (c1.
uc == c2.
uc);
00445 }
00446 KJS_EXPORT
inline bool operator!=(
const UChar& c1,
const UChar& c2) {
00447
return !KJS::operator==(c1, c2);
00448 }
00449 KJS_EXPORT
bool operator==(
const UString& s1,
const UString& s2);
00450
inline bool operator!=(
const UString& s1,
const UString& s2) {
00451
return !KJS::operator==(s1, s2);
00452 }
00453 KJS_EXPORT
bool operator<(
const UString& s1,
const UString& s2);
00454 KJS_EXPORT
bool operator==(
const UString& s1,
const char *s2);
00455 KJS_EXPORT
inline bool operator!=(
const UString& s1,
const char *s2) {
00456
return !KJS::operator==(s1, s2);
00457 }
00458 KJS_EXPORT
inline bool operator==(
const char *s1,
const UString& s2) {
00459
return operator==(s2, s1);
00460 }
00461 KJS_EXPORT
inline bool operator!=(
const char *s1,
const UString& s2) {
00462
return !KJS::operator==(s1, s2);
00463 }
00464 KJS_EXPORT
bool operator==(
const CString& s1,
const CString& s2);
00465 KJS_EXPORT
inline bool operator!=(
const CString& s1,
const CString& s2) {
00466
return !KJS::operator==(s1, s2);
00467 }
00468 KJS_EXPORT
inline UString operator+(
const UString& s1,
const UString& s2) {
00469
return UString(s1, s2);
00470 }
00471
00472 KJS_EXPORT
int compare(
const UString &,
const UString &);
00473
00474 }
00475
00476
#endif