OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/string_util.h" | 5 #include "base/string_util.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #include <ctype.h> | 9 #include <ctype.h> |
10 #include <errno.h> | 10 #include <errno.h> |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 } | 808 } |
809 | 809 |
810 string16 JoinString(const std::vector<string16>& parts, char16 sep) { | 810 string16 JoinString(const std::vector<string16>& parts, char16 sep) { |
811 return JoinStringT(parts, sep); | 811 return JoinStringT(parts, sep); |
812 } | 812 } |
813 | 813 |
814 template<class FormatStringType, class OutStringType> | 814 template<class FormatStringType, class OutStringType> |
815 OutStringType DoReplaceStringPlaceholders(const FormatStringType& format_string, | 815 OutStringType DoReplaceStringPlaceholders(const FormatStringType& format_string, |
816 const std::vector<OutStringType>& subst, std::vector<size_t>* offsets) { | 816 const std::vector<OutStringType>& subst, std::vector<size_t>* offsets) { |
817 size_t substitutions = subst.size(); | 817 size_t substitutions = subst.size(); |
818 DCHECK(substitutions < 10); | |
819 | 818 |
820 size_t sub_length = 0; | 819 size_t sub_length = 0; |
821 for (typename std::vector<OutStringType>::const_iterator iter = subst.begin(); | 820 for (typename std::vector<OutStringType>::const_iterator iter = subst.begin(); |
822 iter != subst.end(); ++iter) { | 821 iter != subst.end(); ++iter) { |
823 sub_length += iter->length(); | 822 sub_length += iter->length(); |
824 } | 823 } |
825 | 824 |
826 OutStringType formatted; | 825 OutStringType formatted; |
827 formatted.reserve(format_string.length() + sub_length); | 826 formatted.reserve(format_string.length() + sub_length); |
828 | 827 |
829 std::vector<ReplacementOffset> r_offsets; | 828 std::vector<ReplacementOffset> r_offsets; |
830 for (typename FormatStringType::const_iterator i = format_string.begin(); | 829 for (typename FormatStringType::const_iterator i = format_string.begin(); |
831 i != format_string.end(); ++i) { | 830 i != format_string.end(); ++i) { |
832 if ('$' == *i) { | 831 if ('$' == *i) { |
833 if (i + 1 != format_string.end()) { | 832 if (i + 1 != format_string.end()) { |
834 ++i; | 833 ++i; |
835 DCHECK('$' == *i || '1' <= *i) << "Invalid placeholder: " << *i; | 834 DCHECK('$' == *i || '1' <= *i) << "Invalid placeholder: " << *i; |
836 if ('$' == *i) { | 835 if ('$' == *i) { |
837 while (i != format_string.end() && '$' == *i) { | 836 while (i != format_string.end() && '$' == *i) { |
838 formatted.push_back('$'); | 837 formatted.push_back('$'); |
839 ++i; | 838 ++i; |
840 } | 839 } |
841 --i; | 840 --i; |
842 } else { | 841 } else { |
843 uintptr_t index = *i - '1'; | 842 uintptr_t index = 0; |
| 843 while (i != format_string.end() && '0' <= *i && *i <= '9') { |
| 844 index *= 10; |
| 845 index += *i - '0'; |
| 846 ++i; |
| 847 } |
| 848 --i; |
| 849 index -= 1; |
844 if (offsets) { | 850 if (offsets) { |
845 ReplacementOffset r_offset(index, | 851 ReplacementOffset r_offset(index, |
846 static_cast<int>(formatted.size())); | 852 static_cast<int>(formatted.size())); |
847 r_offsets.insert(std::lower_bound(r_offsets.begin(), | 853 r_offsets.insert(std::lower_bound(r_offsets.begin(), |
848 r_offsets.end(), | 854 r_offsets.end(), |
849 r_offset, | 855 r_offset, |
850 &CompareParameter), | 856 &CompareParameter), |
851 r_offset); | 857 r_offset); |
852 } | 858 } |
853 if (index < substitutions) | 859 if (index < substitutions) |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 } | 1078 } |
1073 | 1079 |
1074 } // namespace | 1080 } // namespace |
1075 | 1081 |
1076 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { | 1082 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { |
1077 return lcpyT<char>(dst, src, dst_size); | 1083 return lcpyT<char>(dst, src, dst_size); |
1078 } | 1084 } |
1079 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { | 1085 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { |
1080 return lcpyT<wchar_t>(dst, src, dst_size); | 1086 return lcpyT<wchar_t>(dst, src, dst_size); |
1081 } | 1087 } |
OLD | NEW |