Chromium Code Reviews| 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 // This file defines utility functions for working with strings. | 5 // This file defines utility functions for working with strings. |
| 6 | 6 |
| 7 #ifndef BASE_STRINGS_STRING_UTIL_H_ | 7 #ifndef BASE_STRINGS_STRING_UTIL_H_ |
| 8 #define BASE_STRINGS_STRING_UTIL_H_ | 8 #define BASE_STRINGS_STRING_UTIL_H_ |
| 9 | 9 |
| 10 #include <ctype.h> | 10 #include <ctype.h> |
| 11 #include <stdarg.h> // va_list | 11 #include <stdarg.h> // va_list |
| 12 | 12 |
| 13 #include <string> | 13 #include <string> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| 16 #include "base/base_export.h" | 16 #include "base/base_export.h" |
| 17 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/strings/string16.h" | 19 #include "base/strings/string16.h" |
| 20 #include "base/strings/string_piece.h" // For implicit conversions. | 20 #include "base/strings/string_piece.h" // For implicit conversions. |
| 21 | 21 |
| 22 namespace base { | 22 namespace base { |
| 23 | 23 |
| 24 // C standard-library functions like "strncasecmp" and "snprintf" that aren't | 24 // C standard-library functions that aren't cross-platform are provided as |
| 25 // cross-platform are provided as "base::strncasecmp", and their prototypes | 25 // "base::...", and their prototypes are listed below. These functions are |
| 26 // are listed below. These functions are then implemented as inline calls | 26 // then implemented as inline calls to the platform-specific equivalents in the |
| 27 // to the platform-specific equivalents in the platform-specific headers. | 27 // platform-specific headers. |
| 28 | |
| 29 // Compares the two strings s1 and s2 without regard to case using | |
| 30 // the current locale; returns 0 if they are equal, 1 if s1 > s2, and -1 if | |
| 31 // s2 > s1 according to a lexicographic comparison. | |
| 32 int strcasecmp(const char* s1, const char* s2); | |
| 33 | |
| 34 // Compares up to count characters of s1 and s2 without regard to case using | |
| 35 // the current locale; returns 0 if they are equal, 1 if s1 > s2, and -1 if | |
| 36 // s2 > s1 according to a lexicographic comparison. | |
| 37 int strncasecmp(const char* s1, const char* s2, size_t count); | |
| 38 | 28 |
| 39 // Same as strncmp but for char16 strings. | 29 // Same as strncmp but for char16 strings. |
| 40 int strncmp16(const char16* s1, const char16* s2, size_t count); | 30 int strncmp16(const char16* s1, const char16* s2, size_t count); |
| 41 | 31 |
| 42 // Wrapper for vsnprintf that always null-terminates and always returns the | 32 // Wrapper for vsnprintf that always null-terminates and always returns the |
| 43 // number of characters that would be in an untruncated formatted | 33 // number of characters that would be in an untruncated formatted |
| 44 // string, even when truncation occurs. | 34 // string, even when truncation occurs. |
| 45 int vsnprintf(char* buffer, size_t size, const char* format, va_list arguments) | 35 int vsnprintf(char* buffer, size_t size, const char* format, va_list arguments) |
| 46 PRINTF_FORMAT(3, 0); | 36 PRINTF_FORMAT(3, 0); |
| 47 | 37 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 } | 88 } |
| 99 | 89 |
| 100 // ASCII-specific toupper. The standard library's toupper is locale sensitive, | 90 // ASCII-specific toupper. The standard library's toupper is locale sensitive, |
| 101 // so we don't want to use it here. | 91 // so we don't want to use it here. |
| 102 template <class Char> inline Char ToUpperASCII(Char c) { | 92 template <class Char> inline Char ToUpperASCII(Char c) { |
| 103 return (c >= 'a' && c <= 'z') ? (c + ('A' - 'a')) : c; | 93 return (c >= 'a' && c <= 'z') ? (c + ('A' - 'a')) : c; |
| 104 } | 94 } |
| 105 | 95 |
| 106 // Function objects to aid in comparing/searching strings. | 96 // Function objects to aid in comparing/searching strings. |
| 107 | 97 |
| 98 // DO NOT USE. tolower() will given incorrect results for non-ASCII characters. | |
|
Nico
2015/07/08 21:58:23
suggest what to do instead?
| |
| 108 template<typename Char> struct CaseInsensitiveCompare { | 99 template<typename Char> struct CaseInsensitiveCompare { |
| 109 public: | 100 public: |
| 110 bool operator()(Char x, Char y) const { | 101 bool operator()(Char x, Char y) const { |
| 111 // TODO(darin): Do we really want to do locale sensitive comparisons here? | 102 // TODO(darin): Do we really want to do locale sensitive comparisons here? |
| 112 // See http://crbug.com/24917 | 103 // See http://crbug.com/24917 |
| 113 return tolower(x) == tolower(y); | 104 return tolower(x) == tolower(y); |
| 114 } | 105 } |
| 115 }; | 106 }; |
| 116 | 107 |
| 117 template<typename Char> struct CaseInsensitiveCompareASCII { | 108 template<typename Char> struct CaseInsensitiveCompareASCII { |
| 118 public: | 109 public: |
| 119 bool operator()(Char x, Char y) const { | 110 bool operator()(Char x, Char y) const { |
| 120 return ToLowerASCII(x) == ToLowerASCII(y); | 111 return ToLowerASCII(x) == ToLowerASCII(y); |
| 121 } | 112 } |
| 122 }; | 113 }; |
| 123 | 114 |
| 115 // Like strcasecmp for case-insensitive ASCII characters only. Returns: | |
| 116 // -1 (a < b) | |
| 117 // 0 (a == b) | |
| 118 // 1 (a > b) | |
| 119 // (unlike strcasecmp which can return values greater or less than 1/-1). For | |
| 120 // full Unicode support, use base::i18n::ToLower or base::i18h::FoldCase | |
| 121 // and then just call the normal string operators on the result. | |
| 122 BASE_EXPORT int CompareCaseInsensitiveASCII(StringPiece a, StringPiece b); | |
| 123 BASE_EXPORT int CompareCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b); | |
| 124 | |
| 125 // Equality for ASCII case-insensitive comparisons. For full Unicode support, | |
| 126 // use base::i18n::ToLower or base::i18h::FoldCase and then compare with either | |
| 127 // == or !=. | |
| 128 BASE_EXPORT bool EqualsCaseInsensitiveASCII(StringPiece a, StringPiece b); | |
| 129 BASE_EXPORT bool EqualsCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b); | |
| 130 | |
| 124 // These threadsafe functions return references to globally unique empty | 131 // These threadsafe functions return references to globally unique empty |
| 125 // strings. | 132 // strings. |
| 126 // | 133 // |
| 127 // It is likely faster to construct a new empty string object (just a few | 134 // It is likely faster to construct a new empty string object (just a few |
| 128 // instructions to set the length to 0) than to get the empty string singleton | 135 // instructions to set the length to 0) than to get the empty string singleton |
| 129 // returned by these functions (which requires threadsafe singleton access). | 136 // returned by these functions (which requires threadsafe singleton access). |
| 130 // | 137 // |
| 131 // Therefore, DO NOT USE THESE AS A GENERAL-PURPOSE SUBSTITUTE FOR DEFAULT | 138 // Therefore, DO NOT USE THESE AS A GENERAL-PURPOSE SUBSTITUTE FOR DEFAULT |
| 132 // CONSTRUCTORS. There is only one case where you should use these: functions | 139 // CONSTRUCTORS. There is only one case where you should use these: functions |
| 133 // which need to return a string by reference (e.g. as a class member | 140 // which need to return a string by reference (e.g. as a class member |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 520 const std::vector<std::string>& subst, | 527 const std::vector<std::string>& subst, |
| 521 std::vector<size_t>* offsets); | 528 std::vector<size_t>* offsets); |
| 522 | 529 |
| 523 // Single-string shortcut for ReplaceStringHolders. |offset| may be NULL. | 530 // Single-string shortcut for ReplaceStringHolders. |offset| may be NULL. |
| 524 BASE_EXPORT base::string16 ReplaceStringPlaceholders( | 531 BASE_EXPORT base::string16 ReplaceStringPlaceholders( |
| 525 const base::string16& format_string, | 532 const base::string16& format_string, |
| 526 const base::string16& a, | 533 const base::string16& a, |
| 527 size_t* offset); | 534 size_t* offset); |
| 528 | 535 |
| 529 #endif // BASE_STRINGS_STRING_UTIL_H_ | 536 #endif // BASE_STRINGS_STRING_UTIL_H_ |
| OLD | NEW |