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/utf_offset_string_conversions.h" | 5 #include "base/utf_offset_string_conversions.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/string_piece.h" | 10 #include "base/string_piece.h" |
11 #include "base/utf_string_conversion_utils.h" | 11 #include "base/utf_string_conversion_utils.h" |
12 | 12 |
13 using base::PrepareForUTF16Or32Output; | 13 using base::PrepareForUTF16Or32Output; |
| 14 using base::PrepareForUTF8Output; |
14 using base::ReadUnicodeCharacter; | 15 using base::ReadUnicodeCharacter; |
15 using base::WriteUnicodeCharacter; | 16 using base::WriteUnicodeCharacter; |
16 | 17 |
17 // Converts the given source Unicode character type to the given destination | 18 // Converts the given source Unicode character type to the given destination |
18 // Unicode character type as a STL string. The given input buffer and size | 19 // Unicode character type as a STL string. The given input buffer and size |
19 // determine the source, and the given output STL string will be replaced by | 20 // determine the source, and the given output STL string will be replaced by |
20 // the result. | 21 // the result. |
21 bool ConvertUnicode(const char* src, | 22 template<typename SrcChar, typename DestStdString> |
| 23 bool ConvertUnicode(const SrcChar* src, |
22 size_t src_len, | 24 size_t src_len, |
23 string16* output, | 25 DestStdString* output, |
24 std::vector<size_t>* offsets_for_adjustment) { | 26 std::vector<size_t>* offsets_for_adjustment) { |
25 if (offsets_for_adjustment) { | 27 if (offsets_for_adjustment) { |
26 std::for_each(offsets_for_adjustment->begin(), | 28 std::for_each(offsets_for_adjustment->begin(), |
27 offsets_for_adjustment->end(), | 29 offsets_for_adjustment->end(), |
28 LimitOffset<string16>(src_len)); | 30 LimitOffset<DestStdString>(src_len)); |
29 } | 31 } |
30 | 32 |
31 // ICU requires 32-bit numbers. | 33 // ICU requires 32-bit numbers. |
32 bool success = true; | 34 bool success = true; |
33 OffsetAdjuster offset_adjuster(offsets_for_adjustment); | 35 OffsetAdjuster offset_adjuster(offsets_for_adjustment); |
34 int32 src_len32 = static_cast<int32>(src_len); | 36 int32 src_len32 = static_cast<int32>(src_len); |
35 for (int32 i = 0; i < src_len32; i++) { | 37 for (int32 i = 0; i < src_len32; i++) { |
36 uint32 code_point; | 38 uint32 code_point; |
37 size_t original_i = i; | 39 size_t original_i = i; |
38 size_t chars_written = 0; | 40 size_t chars_written = 0; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 93 |
92 string16 UTF8ToUTF16AndAdjustOffsets( | 94 string16 UTF8ToUTF16AndAdjustOffsets( |
93 const base::StringPiece& utf8, | 95 const base::StringPiece& utf8, |
94 std::vector<size_t>* offsets_for_adjustment) { | 96 std::vector<size_t>* offsets_for_adjustment) { |
95 string16 result; | 97 string16 result; |
96 UTF8ToUTF16AndAdjustOffsets(utf8.data(), utf8.length(), &result, | 98 UTF8ToUTF16AndAdjustOffsets(utf8.data(), utf8.length(), &result, |
97 offsets_for_adjustment); | 99 offsets_for_adjustment); |
98 return result; | 100 return result; |
99 } | 101 } |
100 | 102 |
| 103 bool UTF16ToUTF8AndAdjustOffset(const char16* src, |
| 104 size_t src_len, |
| 105 std::string* output, |
| 106 size_t* offset_for_adjustment) { |
| 107 std::vector<size_t> offsets; |
| 108 if (offset_for_adjustment) |
| 109 offsets.push_back(*offset_for_adjustment); |
| 110 bool ret = UTF16ToUTF8AndAdjustOffsets(src, src_len, output, &offsets); |
| 111 if (offset_for_adjustment) |
| 112 *offset_for_adjustment = offsets[0]; |
| 113 return ret; |
| 114 } |
| 115 |
| 116 bool UTF16ToUTF8AndAdjustOffsets(const char16* src, |
| 117 size_t src_len, |
| 118 std::string* output, |
| 119 std::vector<size_t>* offsets_for_adjustment) { |
| 120 PrepareForUTF8Output(src, src_len, output); |
| 121 return ConvertUnicode(src, src_len, output, offsets_for_adjustment); |
| 122 } |
| 123 |
| 124 std::string UTF16ToUTF8AndAdjustOffset( |
| 125 const base::StringPiece16& utf16, |
| 126 size_t* offset_for_adjustment) { |
| 127 std::vector<size_t> offsets; |
| 128 if (offset_for_adjustment) |
| 129 offsets.push_back(*offset_for_adjustment); |
| 130 std::string result; |
| 131 UTF16ToUTF8AndAdjustOffsets(utf16.data(), utf16.length(), &result, |
| 132 &offsets); |
| 133 if (offset_for_adjustment) |
| 134 *offset_for_adjustment = offsets[0]; |
| 135 return result; |
| 136 } |
| 137 |
| 138 std::string UTF16ToUTF8AndAdjustOffsets( |
| 139 const base::StringPiece16& utf16, |
| 140 std::vector<size_t>* offsets_for_adjustment) { |
| 141 std::string result; |
| 142 UTF16ToUTF8AndAdjustOffsets(utf16.data(), utf16.length(), &result, |
| 143 offsets_for_adjustment); |
| 144 return result; |
| 145 } |
| 146 |
| 147 |
101 OffsetAdjuster::Adjustment::Adjustment(size_t original_offset, | 148 OffsetAdjuster::Adjustment::Adjustment(size_t original_offset, |
102 size_t original_length, | 149 size_t original_length, |
103 size_t output_length) | 150 size_t output_length) |
104 : original_offset(original_offset), | 151 : original_offset(original_offset), |
105 original_length(original_length), | 152 original_length(original_length), |
106 output_length(output_length) { | 153 output_length(output_length) { |
107 } | 154 } |
108 | 155 |
109 OffsetAdjuster::OffsetAdjuster(std::vector<size_t>* offsets_for_adjustment) | 156 OffsetAdjuster::OffsetAdjuster(std::vector<size_t>* offsets_for_adjustment) |
110 : offsets_for_adjustment_(offsets_for_adjustment) { | 157 : offsets_for_adjustment_(offsets_for_adjustment) { |
(...skipping 24 matching lines...) Expand all Loading... |
135 if (*offset <= i->original_offset) | 182 if (*offset <= i->original_offset) |
136 break; | 183 break; |
137 if (*offset < (i->original_offset + i->original_length)) { | 184 if (*offset < (i->original_offset + i->original_length)) { |
138 *offset = string16::npos; | 185 *offset = string16::npos; |
139 return; | 186 return; |
140 } | 187 } |
141 adjustment += (i->original_length - i->output_length); | 188 adjustment += (i->original_length - i->output_length); |
142 } | 189 } |
143 *offset -= adjustment; | 190 *offset -= adjustment; |
144 } | 191 } |
OLD | NEW |