00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "String.h"
00025 #include "Encoding.h"
00026 #include "Common/util.h"
00027
00028 namespace Tanl {
00029 namespace Text {
00030
00031
00032
00033 String::String(const String& s, const size_type p1, const size_type p2) :
00034 str(s.str, p1, p2)
00035 { }
00036
00037 String::String(const CharType* c) :
00038 str((UCS2*)c)
00039 { }
00040
00041 String::String(const CharType* c, const size_type l) :
00042 str((UCS2*)c, l)
00043 { }
00044
00045 String::String(const size_type l, const CharType c) :
00046 str(l, c)
00047 { }
00048
00049 String::String(const StringType& s) :
00050 str(s)
00051 { }
00052
00053 template<class InputIterator>
00054 String::String(InputIterator b, InputIterator e) :
00055 str(b, e)
00056 { }
00057
00058
00059
00060 int String::compare(const size_type, const size_type, const String&) const
00061 {
00062
00063 return 0;
00064 }
00065
00066 int String::compare(const size_type, const size_type, const String&,
00067 const size_type, const size_type) const
00068 {
00069
00070 return 0;
00071 }
00072
00073 int String::compare(const CharType*) const
00074 {
00075
00076 return 0;
00077 }
00078
00079 int String::compare(const size_type, const size_type,
00080 const CharType*) const
00081 {
00082
00083 return 0;
00084 }
00085
00086 int String::compare(const size_type, const size_type,
00087 const CharType*, const size_type) const
00088 {
00089
00090 return 0;
00091 }
00092
00093 String::CharType& String::operator[](const size_type p)
00094 {
00095 return *(CharType*)&str[p];
00096 }
00097
00098 String::CharType& String::at(const size_type p)
00099 {
00100 return *(CharType*)&str.at(p);
00101 }
00102
00103 String&
00104 String::assign(const String& s, const size_type p1, const size_type p2)
00105 {
00106 str.assign(s.str, p1, p2);
00107 return *this;
00108 }
00109
00110 String& String::assign(const CharType* c)
00111 {
00112 str.assign((UCS2*)c);
00113 return *this;
00114 }
00115
00116 String&
00117 String::assign(const CharType* c, const size_type l)
00118 {
00119 str.assign((UCS2*)c, l);
00120 return *this;
00121 }
00122
00123 String&
00124 String::assign(const size_type l, const CharType c)
00125 {
00126 str.assign(l, c);
00127 return *this;
00128 }
00129
00130 void String::swap(String& that) throw()
00131 {
00132 str.swap(that.str);
00133 }
00134
00135 String&
00136 String::append(const String& s, const size_type p1, const size_type p2)
00137 {
00138 size_type start = str.length();
00139 str.append(s.str, p1, p2);
00140 return *this;
00141 }
00142
00143 String&
00144 String::append(const CharType* c, const size_type l)
00145 {
00146 size_type start = str.length();
00147 str.append((UCS2*)c, l);
00148 return *this;
00149 }
00150
00151 String& String::append(const CharType* c)
00152 {
00153 str.append((UCS2*)c);
00154 return *this;
00155 }
00156
00157 String&
00158 String::append(const size_type l, const CharType c)
00159 {
00160 str.append(l, c);
00161 return *this;
00162 }
00163
00164 String&
00165 String::insert(const size_type p1, const String& s,
00166 const size_type p2, const size_type p3)
00167 {
00168 str.insert(p1, s.str, p2, p3);
00169 return *this;
00170 }
00171
00172 String&
00173 String::insert(const size_type p1,
00174 const CharType* c, const size_type p2)
00175 {
00176 str.insert(p1, (UCS2*)c, p2);
00177 return *this;
00178 }
00179
00180 String&
00181 String::insert(const size_type p1, const CharType* c)
00182 {
00183 size_type old_length = str.length();
00184 str.insert(p1, (UCS2*)c);
00185 return *this;
00186 }
00187
00188 String&
00189 String::insert(const size_type p1, const size_type p2,
00190 const CharType c)
00191 {
00192 str.insert(p1, p2, c);
00193 return *this;
00194 }
00195
00196 String&
00197 String::replace(const size_type p1, const size_type p2,
00198 const String& s,
00199 const size_type p3, const size_type p4)
00200 {
00201 str.replace(p1, p2, s.str, p3, p4);
00202 return *this;
00203 }
00204
00205 String&
00206 String::replace(const size_type p1, const size_type p2,
00207 const CharType* c, const size_type l)
00208 {
00209 str.replace(p1, p2, (UCS2*)c, l);
00210 return *this;
00211 }
00212
00213 String&
00214 String::replace(const size_type p1, const size_type p2,
00215 const CharType* c)
00216 {
00217 str.replace(p1, p2, (UCS2*)c);
00218 return *this;
00219 }
00220
00221 String&
00222 String::replace(const size_type p1, const size_type p2,
00223 const size_type p3, CharType c)
00224 {
00225 str.replace(p1, p2, p3, c);
00226 return *this;
00227 }
00228
00229 void String::resize(const size_type l)
00230 {
00231 str.resize(l);
00232 }
00233
00234 void String::resize(const size_type l, CharType c)
00235 {
00236 str.resize(l, c);
00237 }
00238
00239 void String::clear()
00240 {
00241 str.clear();
00242 }
00243
00244 String& String::erase()
00245 {
00246 str.erase();
00247 return *this;
00248 }
00249
00250 String& String::erase(const size_type i)
00251 {
00252 str.erase(i);
00253 return *this;
00254 }
00255
00256 String& String::erase(const size_type i, const size_type l)
00257 {
00258 str.erase(i, l);
00259 return *this;
00260 }
00261
00262 String& String::erase(iterator b, iterator e)
00263 {
00264 str.erase(b, e);
00265 return *this;
00266 }
00267
00268 String::String(const std::string& s, const size_t pos,
00269 const std::string encoding)
00270 {
00271 convert(s.data(), pos, s.length(), encoding);
00272 }
00273
00274 String::String(const char* c, const std::string encoding)
00275 {
00276 convert(c, 0, ::strlen(c), encoding);
00277 }
00278
00279 String::String(const char* c, const size_t len, const std::string encoding)
00280 {
00281 convert(c, 0, len, encoding);
00282 }
00283
00284 std::string String::convert(const std::string& encoding) const
00285 {
00286 Encoding* e = Encoding::get(encoding.c_str());
00287 Encoding* ucs2 = Encoding::get("UCS-2");
00288 size_t clen = size_t(length() * e->maxBytesPerChar);
00289 char* converted = new char[clen];
00290 size_t len = e->Encode(ucs2, (char const*)str.data(),
00291 length() * sizeof(UCS2), converted, clen);
00292 std::string result(converted, len);
00293 delete [] converted;
00294 return result;
00295 }
00296
00297 size_t String::convert(const char* s, const size_t start, const size_t end,
00298 const std::string& encoding)
00299 throw (std::length_error)
00300 {
00301 clear();
00302 size_t len = end - start;
00303 if (len >= max_size())
00304 throw (std::length_error("Input String too long."));
00305 Encoding* e = Encoding::get(encoding.c_str());
00306 Encoding* ucs2 = Encoding::get("UCS-2");
00307 char* converted = new char[len * sizeof(UCS2)];
00308 size_t clen = ucs2->Encode(e, s + start, len, converted, len * sizeof(UCS2));
00309 assign((Char*)converted, clen / sizeof(UCS2));
00310 delete [] converted;
00311 return clen / sizeof(UCS2);
00312 }
00313
00314 bool String::StartsWith(const char* c) const
00315 {
00316 UCS2* uc = (UCS2*)c;
00317 FOR_EACH(StringType, str, cib) {
00318 if (*uc == 0)
00319 return false;
00320 if (*uc++ != *cib)
00321 return false;
00322 }
00323 return false;
00324 }
00325
00326 bool String::StartsWithNoCase(const char* c) const
00327 {
00328 UCS2* uc = (UCS2*)c;
00329 FOR_EACH(StringType, str, cib) {
00330 if (*uc == 0)
00331 return false;
00332 if (Char(*uc++).ToLower() != *cib)
00333 return false;
00334 }
00335 return false;
00336 }
00337
00338 bool String::contains(const char* c) const
00339 {
00340 return find(c) != std::string::npos;
00341 }
00342
00343 String::size_type String::find(const char* c) const {
00344 FOR_EACH (StringType, str, it) {
00345 String::const_iterator sit(it);
00346 const char* s = c;
00347 for (; *s; s++) {
00348 if (sit == end())
00349 return std::string::npos;
00350 if (*s != *sit++)
00351 break;
00352 }
00353 if (*s == '\0')
00354 return it - str.begin();
00355 }
00356 return std::string::npos;
00357 }
00358
00359 String String::ToLower() const {
00360 String lower(length(), ' ');
00361 int i = 0;
00362 FOR_EACH (StringType, str, it)
00363 lower[i++] = CharType(*it).ToLower();
00364 return lower;
00365 }
00366
00367 String String::ToLower() {
00368 TO_EACH (StringType, str, it)
00369 *it = CharType(*it).ToLower();
00370 return *this;
00371 }
00372
00373
00374 }
00375 }