1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Common/String.h
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef __COMMON_STRING_H
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define __COMMON_STRING_H
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include <string.h>
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _WIN32
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include <wctype.h>
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include <wchar.h>
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "MyTypes.h"
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "MyVector.h"
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline unsigned MyStringLen(const char *s)
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned i;
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (i = 0; s[i] != 0; i++);
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return i;
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline void MyStringCopy(char *dest, const char *src)
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  while ((*dest++ = *src++) != 0);
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline char *MyStpCpy(char *dest, const char *src)
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (;;)
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    char c = *src;
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    *dest = c;
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (c == 0)
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return dest;
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    src++;
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    dest++;
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline unsigned MyStringLen(const wchar_t *s)
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned i;
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (i = 0; s[i] != 0; i++);
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return i;
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline void MyStringCopy(wchar_t *dest, const wchar_t *src)
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  while ((*dest++ = *src++) != 0);
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint FindCharPosInString(const char *s, char c) throw();
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint FindCharPosInString(const wchar_t *s, wchar_t c) throw();
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef _WIN32
57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifndef _UNICODE
58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #define STRING_UNICODE_THROW
59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef STRING_UNICODE_THROW
63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define STRING_UNICODE_THROW throw()
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/*
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline char MyCharUpper_Ascii(char c)
68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c >= 'a' && c <= 'z')
70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (char)(c - 0x20);
71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return c;
72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline wchar_t MyCharUpper_Ascii(wchar_t c)
74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c >= 'a' && c <= 'z')
76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (wchar_t)(c - 0x20);
77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return c;
78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline char MyCharLower_Ascii(char c)
82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c >= 'A' && c <= 'Z')
84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (char)(c + 0x20);
85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return c;
86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline wchar_t MyCharLower_Ascii(wchar_t c)
89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c >= 'A' && c <= 'Z')
91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (wchar_t)(c + 0x20);
92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return c;
93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckywchar_t MyCharUpper_WIN(wchar_t c) throw();
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline wchar_t MyCharUpper(wchar_t c) throw()
98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c < 'a') return c;
100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c <= 'z') return (wchar_t)(c - 0x20);
101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c <= 0x7F) return c;
102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifdef _WIN32
103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifdef _UNICODE
104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return (wchar_t)(unsigned)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c);
105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #else
106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return (wchar_t)MyCharUpper_WIN(c);
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #else
109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (wchar_t)towupper(c);
110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/*
114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckywchar_t MyCharLower_WIN(wchar_t c) throw();
115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline wchar_t MyCharLower(wchar_t c) throw()
117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c < 'A') return c;
119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c <= 'Z') return (wchar_t)(c + 0x20);
120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (c <= 0x7F) return c;
121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifdef _WIN32
122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #ifdef _UNICODE
123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return (wchar_t)(unsigned)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c);
124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #else
125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return (wchar_t)MyCharLower_WIN(c);
126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    #endif
127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #else
128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return (wchar_t)tolower(c);
129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync*/
132baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// char *MyStringUpper(char *s) throw();
134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// char *MyStringLower(char *s) throw();
135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// void MyStringUpper_Ascii(wchar_t *s) throw();
137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyvoid MyStringLower_Ascii(wchar_t *s) throw();
138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// wchar_t *MyStringUpper(wchar_t *s) STRING_UNICODE_THROW;
139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// wchar_t *MyStringLower(wchar_t *s) STRING_UNICODE_THROW;
140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw();
142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool IsString1PrefixedByString2(const char *s1, const char *s2) throw();
144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw();
145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw();
147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num) throw();
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// ---------- ASCII ----------
150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// char values in ASCII strings must be less then 128
151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw();
152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw();
153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw();
154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw();
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define MY_STRING_DELETE(_p_) delete []_p_;
157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// #define MY_STRING_DELETE(_p_) my_delete(_p_);
158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass AString
160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  char *_chars;
162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned _len;
163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned _limit;
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void MoveItems(unsigned dest, unsigned src)
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(char));
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InsertSpace(unsigned &index, unsigned size);
171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReAlloc(unsigned newLimit);
173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetStartLen(unsigned len);
174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Grow_1();
175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Grow(unsigned n);
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // AString(unsigned num, const char *s);
178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(unsigned num, const AString &s);
179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(const AString &s, char c); // it's for String + char
180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(const char *s1, unsigned num1, const char *s2, unsigned num2);
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend AString operator+(const AString &s, char c) { return AString(s, c); } ;
183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // friend AString operator+(char c, const AString &s); // is not supported
184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend AString operator+(const AString &s1, const AString &s2);
186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend AString operator+(const AString &s1, const char    *s2);
187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend AString operator+(const char    *s1, const AString &s2);
188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
189baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic:
190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString();
191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(char c);
192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(const char *s);
193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString(const AString &s);
194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  ~AString() { MY_STRING_DELETE(_chars); }
195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned Len() const { return _len; }
197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsEmpty() const { return _len == 0; }
198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Empty() { _len = 0; _chars[0] = 0; }
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  operator const char *() const { return _chars; }
201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const char *Ptr() const { return _chars; }
202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const char *Ptr(unsigned pos) const { return _chars + pos; }
203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const char *RightPtr(unsigned num) const { return _chars + _len - num; }
204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  char Back() const { return _chars[_len - 1]; }
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
206cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReplaceOneCharAtPos(unsigned pos, char c) { _chars[pos] = c; }
207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  // The minimum size of the character buffer in characters.
209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  // This value does not include space for a null terminator.
210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  char *GetBuffer(unsigned minBufLen)
211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (minBufLen > _limit)
213cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ReAlloc(minBufLen);
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return _chars;
215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
217cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReleaseBuffer(unsigned newLen) { _len = newLen; _chars[newLen] = 0; }
218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
219cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator=(char c);
220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator=(const char *s);
221cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator=(const AString &s);
222cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
223cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator+=(char c)
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
225cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (_limit == _len)
226cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      Grow_1();
227cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    unsigned len = _len;
228cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    char *chars = _chars;
229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    chars[len++] = c;
230cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    chars[len] = 0;
231cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _len = len;
232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return *this;
233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator+=(const char *s);
236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString &operator+=(const AString &s);
237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
238cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetFrom(const char *s, unsigned len); // no check
239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // AString Mid(unsigned startIndex, unsigned count) const { return AString(count, _chars + startIndex); }
240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString Left(unsigned count) const { return AString(count, *this); }
241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void MakeUpper() { MyStringUpper(_chars); }
243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void MakeLower() { MyStringLower(_chars); }
244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
245cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int Compare(const char *s) const { return MyStringCompare(_chars, s); }
247cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int Compare(const AString &s) const { return MyStringCompare(_chars, s._chars); }
248cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int CompareNoCase(const char *s) const { return MyStringCompareNoCase(_chars, s); }
249cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int CompareNoCase(const AString &s) const { return MyStringCompareNoCase(_chars, s._chars); }
250cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsPrefixedBy(const char *s) const { return IsString1PrefixedByString2(_chars, s); }
251cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw();
252cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
253cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(char c) const { return FindCharPosInString(_chars, c); }
254cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(char c, unsigned startIndex) const
255baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
256cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    int pos = FindCharPosInString(_chars + startIndex, c);
257cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return pos < 0 ? -1 : (int)startIndex + pos;
258baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
259cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int ReverseFind(char c) const throw();
260cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(const AString &s) const { return Find(s, 0); }
261cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(const AString &s, unsigned startIndex) const throw();
262cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
263cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void TrimLeft() throw();
264cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void TrimRight() throw();
265cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Trim()
266baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
267cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    TrimRight();
268cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    TrimLeft();
269baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
270cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
271cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InsertAtFront(char c);
272cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void Insert(unsigned index, char c);
273cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Insert(unsigned index, const char *s);
274cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Insert(unsigned index, const AString &s);
275cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
276cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void RemoveChar(char ch) throw();
277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Replace(char oldChar, char newChar) throw();
278cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Replace(const AString &oldString, const AString &newString);
279baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
280cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Delete(unsigned index) throw();
281cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Delete(unsigned index, unsigned count) throw();
282cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteFrontal(unsigned num) throw();
283cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteBack() { _chars[--_len] = 0; }
284cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteFrom(unsigned index)
285baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
286cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (index < _len)
287cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
288cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _len = index;
289cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _chars[index] = 0;
290cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
291baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
292cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
293baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
294cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator<(const AString &s1, const AString &s2);
295cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator>(const AString &s1, const AString &s2);
296baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
297cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/*
298cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator==(const AString &s1, const AString &s2);
299cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator==(const AString &s1, const char    *s2);
300cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator==(const char    *s1, const AString &s2);
301baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
302cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator!=(const AString &s1, const AString &s2);
303cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator!=(const AString &s1, const char    *s2);
304cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator!=(const char    *s1, const AString &s2);
305cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/
306baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
307cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const AString &s1, const AString &s2) { return s1.Len() == s2.Len() && strcmp(s1, s2) == 0; }
308cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const AString &s1, const char    *s2) { return strcmp(s1, s2) == 0; }
309cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const char    *s1, const AString &s2) { return strcmp(s1, s2) == 0; }
310baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
311cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const AString &s1, const AString &s2) { return s1.Len() != s2.Len() || strcmp(s1, s2) != 0; }
312cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const AString &s1, const char    *s2) { return strcmp(s1, s2) != 0; }
313cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const char    *s1, const AString &s2) { return strcmp(s1, s2) != 0; }
314baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
315baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
316baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
317cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass UString
318cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
319cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  wchar_t *_chars;
320cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned _len;
321cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned _limit;
322baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
323cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void MoveItems(unsigned dest, unsigned src)
324baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
325cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(wchar_t));
326baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
327cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
328cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InsertSpace(unsigned index, unsigned size);
329cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
330cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReAlloc(unsigned newLimit);
331cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetStartLen(unsigned len);
332cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Grow_1();
333cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Grow(unsigned n);
334cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
335cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(unsigned num, const wchar_t *s); // for Mid
336cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(unsigned num, const UString &s); // for Left
337cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(const UString &s, wchar_t c); // it's for String + char
338cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2);
339cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
340cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend UString operator+(const UString &s, wchar_t c) { return UString(s, c); } ;
341cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // friend UString operator+(wchar_t c, const UString &s); // is not supported
342cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
343cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend UString operator+(const UString &s1, const UString &s2);
344cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend UString operator+(const UString &s1, const wchar_t *s2);
345cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  friend UString operator+(const wchar_t *s1, const UString &s2);
346baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
347cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
348cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString();
349cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(wchar_t c);
350cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(const wchar_t *s);
351cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString(const UString &s);
352cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  ~UString() { MY_STRING_DELETE(_chars); }
353cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
354cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  unsigned Len() const { return _len; }
355cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsEmpty() const { return _len == 0; }
356cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Empty() { _len = 0; _chars[0] = 0; }
357cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
358cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  operator const wchar_t *() const { return _chars; }
359cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const wchar_t *Ptr() const { return _chars; }
360cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const wchar_t *Ptr(unsigned pos) const { return _chars + pos; }
361cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const wchar_t *RightPtr(unsigned num) const { return _chars + _len - num; }
362cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  wchar_t Back() const { return _chars[_len - 1]; }
363cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
364cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReplaceOneCharAtPos(unsigned pos, wchar_t c) { _chars[pos] = c; }
365cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
366cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // The minimum size of the character buffer in characters.
367cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // This value does not include space for a null terminator.
368cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  wchar_t *GetBuffer(unsigned minBufLen)
369baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
370cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (minBufLen > _limit)
371cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ReAlloc(minBufLen);
372cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return _chars;
373baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
374cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); }
375cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReleaseBuffer(unsigned newLen) { _len = newLen; _chars[newLen] = 0; }
376cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
377cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator=(wchar_t c);
378cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator=(const wchar_t *s);
379cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator=(const UString &s);
380cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
381cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator+=(wchar_t c)
382baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
383cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (_limit == _len)
384cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      Grow_1();
385cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    unsigned len = _len;
386cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    wchar_t *chars = _chars;
387cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    chars[len++] = c;
388cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    chars[len] = 0;
389cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _len = len;
390cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return *this;
391baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
392cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
393cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator+=(const wchar_t *s);
394cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString &operator+=(const UString &s);
395cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
396cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetFrom(const wchar_t *s, unsigned len); // no check
397cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
398cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetFromAscii(const char *s);
399cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void AddAsciiStr(const char *s);
400cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
401cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString Mid(unsigned startIndex, unsigned count) const { return UString(count, _chars + startIndex); }
402cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString Left(unsigned count) const { return UString(count, *this); }
403cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
404cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void MakeUpper() { MyStringUpper(_chars); }
405cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void MakeUpper() { MyStringUpper_Ascii(_chars); }
406cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void MakeUpper_Ascii() { MyStringUpper_Ascii(_chars); }
407cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void MakeLower_Ascii() { MyStringLower_Ascii(_chars); }
408cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
409cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsEqualTo(const char *s) const { return StringsAreEqual_Ascii(_chars, s); }
410cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsEqualToNoCase(const wchar_t *s) const { return StringsAreEqualNoCase(_chars, s); }
411cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Compare(const wchar_t *s) const { return wcscmp(_chars, s); }
412cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int Compare(const UString &s) const { return MyStringCompare(_chars, s._chars); }
413cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int CompareNoCase(const wchar_t *s) const { return MyStringCompareNoCase(_chars, s); }
414cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // int CompareNoCase(const UString &s) const { return MyStringCompareNoCase(_chars, s._chars); }
415cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsPrefixedBy(const wchar_t *s) const { return IsString1PrefixedByString2(_chars, s); };
416cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw();
417cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
418cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(wchar_t c) const { return FindCharPosInString(_chars, c); }
419cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(wchar_t c, unsigned startIndex) const
420baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
421cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    int pos = FindCharPosInString(_chars + startIndex, c);
422cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return pos < 0 ? -1 : (int)startIndex + pos;
423baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
424cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(const UString &s) const { return Find(s, 0); }
425cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Find(const UString &s, unsigned startIndex) const throw();
426cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int ReverseFind(wchar_t c) const throw();
427cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
428cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void TrimLeft() throw();
429cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void TrimRight() throw();
430baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  void Trim()
431baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
432baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    TrimRight();
433baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    TrimLeft();
434baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
435baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
436cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InsertAtFront(wchar_t c);
437cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // void Insert(unsigned index, wchar_t c);
438cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Insert(unsigned index, const wchar_t *s);
439cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Insert(unsigned index, const UString &s);
440baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
441cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void RemoveChar(wchar_t ch) throw();
442cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Replace(wchar_t oldChar, wchar_t newChar) throw();
443cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Replace(const UString &oldString, const UString &newString);
444cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
445cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Delete(unsigned index) throw();
446cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Delete(unsigned index, unsigned count) throw();
447cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteFrontal(unsigned num) throw();
448cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteBack() { _chars[--_len] = 0; }
449cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void DeleteFrom(unsigned index)
450baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
451cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (index < _len)
452baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
453cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _len = index;
454cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      _chars[index] = 0;
455baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
456baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
457baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
458baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
459cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator<(const UString &s1, const UString &s2);
460cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator>(const UString &s1, const UString &s2);
461baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
462cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const UString &s1, const UString &s2) { return s1.Len() == s2.Len() && wcscmp(s1, s2) == 0; }
463cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) == 0; }
464cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator==(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) == 0; }
465baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
466cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const UString &s1, const UString &s2) { return s1.Len() != s2.Len() || wcscmp(s1, s2) != 0; }
467cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) != 0; }
468cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyinline bool operator!=(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) != 0; }
469baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
470baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
471cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjectVector<AString> AStringVector;
472cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjectVector<UString> UStringVector;
473baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
474cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef _UNICODE
475cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef UString CSysString;
476cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#else
477cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef AString CSysString;
478cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
479baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
480cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjectVector<CSysString> CSysStringVector;
481baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
482baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
483cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// ---------- FString ----------
484baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
485cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef _WIN32
486cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define USE_UNICODE_FSTRING
487cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
488baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
489cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef USE_UNICODE_FSTRING
490baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
491cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define __FTEXT(quote) L##quote
492baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
493cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef wchar_t FChar;
494cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef UString FString;
495baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
496cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define fs2us(_x_) (_x_)
497cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define us2fs(_x_) (_x_)
498cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FString fas2fs(const AString &s);
499cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  AString fs2fas(const FChar *s);
500baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
501baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#else
502cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
503cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define __FTEXT(quote) quote
504cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
505cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef char FChar;
506cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  typedef AString FString;
507cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
508cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString fs2us(const FString &s);
509cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FString us2fs(const wchar_t *s);
510cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define fas2fs(_x_) (_x_)
511cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #define fs2fas(_x_) (_x_)
512cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
513baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
514baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
515cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define FTEXT(quote) __FTEXT(quote)
516cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
517cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define FCHAR_PATH_SEPARATOR FTEXT(CHAR_PATH_SEPARATOR)
518cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define FSTRING_PATH_SEPARATOR FTEXT(STRING_PATH_SEPARATOR)
519cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define FCHAR_ANY_MASK FTEXT('*')
520cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define FSTRING_ANY_MASK FTEXT("*")
521cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef const FChar *CFSTR;
522cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
523cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjectVector<FString> FStringVector;
524baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
525baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
526