OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/strings/string_util.h" | 5 #include "base/strings/string_util.h" |
6 | 6 |
7 #include <ctype.h> | 7 #include <ctype.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <math.h> | 9 #include <math.h> |
10 #include <stdarg.h> | 10 #include <stdarg.h> |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 | 347 |
348 while (char_index < src_len) { | 348 while (char_index < src_len) { |
349 int32 code_point; | 349 int32 code_point; |
350 CBU8_NEXT(src, char_index, src_len, code_point); | 350 CBU8_NEXT(src, char_index, src_len, code_point); |
351 if (!IsValidCharacter(code_point)) | 351 if (!IsValidCharacter(code_point)) |
352 return false; | 352 return false; |
353 } | 353 } |
354 return true; | 354 return true; |
355 } | 355 } |
356 | 356 |
357 template<typename StringType> | 357 } // namespace base |
358 static inline bool DoLowerCaseEqualsASCII(BasicStringPiece<StringType> str, | 358 |
359 const char* lower_cased_cmp) { | 359 template<typename Iter> |
360 for (typename BasicStringPiece<StringType>::const_iterator it = str.begin(); | 360 static inline bool DoLowerCaseEqualsASCII(Iter a_begin, |
361 it != str.end(); ++it, ++lower_cased_cmp) { | 361 Iter a_end, |
362 if (!*lower_cased_cmp || base::ToLowerASCII(*it) != *lower_cased_cmp) | 362 const char* b) { |
| 363 for (Iter it = a_begin; it != a_end; ++it, ++b) { |
| 364 if (!*b || base::ToLowerASCII(*it) != *b) |
363 return false; | 365 return false; |
364 } | 366 } |
365 return *lower_cased_cmp == 0; | 367 return *b == 0; |
366 } | 368 } |
367 | 369 |
368 // Front-ends for LowerCaseEqualsASCII. | 370 // Front-ends for LowerCaseEqualsASCII. |
369 bool LowerCaseEqualsASCII(StringPiece str, const char* lower_cased_cmp) { | 371 bool LowerCaseEqualsASCII(const std::string& a, const char* b) { |
370 return DoLowerCaseEqualsASCII(str, lower_cased_cmp); | 372 return DoLowerCaseEqualsASCII(a.begin(), a.end(), b); |
371 } | 373 } |
372 | 374 |
373 bool LowerCaseEqualsASCII(StringPiece16 str, const char* lower_cased_cmp) { | 375 bool LowerCaseEqualsASCII(const string16& a, const char* b) { |
374 return DoLowerCaseEqualsASCII(str, lower_cased_cmp); | 376 return DoLowerCaseEqualsASCII(a.begin(), a.end(), b); |
375 } | 377 } |
376 | 378 |
377 bool LowerCaseEqualsASCII(std::string::const_iterator a_begin, | 379 bool LowerCaseEqualsASCII(std::string::const_iterator a_begin, |
378 std::string::const_iterator a_end, | 380 std::string::const_iterator a_end, |
379 const char* b) { | 381 const char* b) { |
380 const char* a = &*a_begin; | 382 return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
381 return LowerCaseEqualsASCII(StringPiece(a, a_end - a_begin), b); | |
382 } | 383 } |
383 | 384 |
384 bool LowerCaseEqualsASCII(string16::const_iterator a_begin, | 385 bool LowerCaseEqualsASCII(string16::const_iterator a_begin, |
385 string16::const_iterator a_end, | 386 string16::const_iterator a_end, |
386 const char* b) { | 387 const char* b) { |
387 const char16* a = &*a_begin; | 388 return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
388 return LowerCaseEqualsASCII(StringPiece16(a, a_end - a_begin), b); | |
389 } | 389 } |
390 | 390 |
391 // TODO(port): Resolve wchar_t/iterator issues that require OS_ANDROID here. | 391 // TODO(port): Resolve wchar_t/iterator issues that require OS_ANDROID here. |
392 #if !defined(OS_ANDROID) | 392 #if !defined(OS_ANDROID) |
393 bool LowerCaseEqualsASCII(const char* a_begin, | 393 bool LowerCaseEqualsASCII(const char* a_begin, |
394 const char* a_end, | 394 const char* a_end, |
395 const char* b) { | 395 const char* b) { |
396 return DoLowerCaseEqualsASCII(StringPiece(a_begin, a_end - a_begin), b); | 396 return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
397 } | 397 } |
398 | 398 |
399 bool LowerCaseEqualsASCII(const char16* a_begin, | 399 bool LowerCaseEqualsASCII(const char16* a_begin, |
400 const char16* a_end, | 400 const char16* a_end, |
401 const char* b) { | 401 const char* b) { |
402 return DoLowerCaseEqualsASCII(StringPiece16(a_begin, a_end - a_begin), b); | 402 return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
403 } | 403 } |
| 404 |
404 #endif // !defined(OS_ANDROID) | 405 #endif // !defined(OS_ANDROID) |
405 | 406 |
406 } // namespace base | |
407 | |
408 bool EqualsASCII(const string16& a, const base::StringPiece& b) { | 407 bool EqualsASCII(const string16& a, const base::StringPiece& b) { |
409 if (a.length() != b.length()) | 408 if (a.length() != b.length()) |
410 return false; | 409 return false; |
411 return std::equal(b.begin(), b.end(), a.begin()); | 410 return std::equal(b.begin(), b.end(), a.begin()); |
412 } | 411 } |
413 | 412 |
414 bool StartsWithASCII(const std::string& str, | 413 bool StartsWithASCII(const std::string& str, |
415 const std::string& search, | 414 const std::string& search, |
416 bool case_sensitive) { | 415 bool case_sensitive) { |
417 if (case_sensitive) | 416 if (case_sensitive) |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 } | 883 } |
885 | 884 |
886 } // namespace | 885 } // namespace |
887 | 886 |
888 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { | 887 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { |
889 return lcpyT<char>(dst, src, dst_size); | 888 return lcpyT<char>(dst, src, dst_size); |
890 } | 889 } |
891 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { | 890 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { |
892 return lcpyT<wchar_t>(dst, src, dst_size); | 891 return lcpyT<wchar_t>(dst, src, dst_size); |
893 } | 892 } |
OLD | NEW |