Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_number_conversions.h" | 5 #include "base/strings/string_number_conversions.h" |
| 6 | 6 |
| 7 #include <ctype.h> | 7 #include <ctype.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <wctype.h> | 10 #include <wctype.h> |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 typedef typename traits::value_type value_type; | 133 typedef typename traits::value_type value_type; |
| 134 | 134 |
| 135 // Generalized iterator-range-to-number conversion. | 135 // Generalized iterator-range-to-number conversion. |
| 136 // | 136 // |
| 137 static bool Invoke(const_iterator begin, | 137 static bool Invoke(const_iterator begin, |
| 138 const_iterator end, | 138 const_iterator end, |
| 139 value_type* output) { | 139 value_type* output) { |
| 140 bool valid = true; | 140 bool valid = true; |
| 141 | 141 |
| 142 while (begin != end && LocalIsWhitespace(*begin)) { | 142 while (begin != end && LocalIsWhitespace(*begin)) { |
| 143 valid = false; | 143 valid = false; |
|
Nico
2016/02/11 21:40:31
this also can return false and doesn't write to ou
davidben
2016/02/11 21:47:22
This just falls through to later, so I think it's
| |
| 144 ++begin; | 144 ++begin; |
| 145 } | 145 } |
| 146 | 146 |
| 147 if (begin != end && *begin == '-') { | 147 if (begin != end && *begin == '-') { |
| 148 if (!std::numeric_limits<value_type>::is_signed) { | 148 if (!std::numeric_limits<value_type>::is_signed) { |
| 149 *output = 0; | |
| 149 valid = false; | 150 valid = false; |
| 150 } else if (!Negative::Invoke(begin + 1, end, output)) { | 151 } else if (!Negative::Invoke(begin + 1, end, output)) { |
| 151 valid = false; | 152 valid = false; |
| 152 } | 153 } |
| 153 } else { | 154 } else { |
| 154 if (begin != end && *begin == '+') { | 155 if (begin != end && *begin == '+') { |
| 155 ++begin; | 156 ++begin; |
| 156 } | 157 } |
| 157 if (!Positive::Invoke(begin, end, output)) { | 158 if (!Positive::Invoke(begin, end, output)) { |
| 158 valid = false; | 159 valid = false; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 HexIteratorRangeToInt64Traits; | 281 HexIteratorRangeToInt64Traits; |
| 281 | 282 |
| 282 typedef BaseHexIteratorRangeToUInt64Traits<StringPiece::const_iterator> | 283 typedef BaseHexIteratorRangeToUInt64Traits<StringPiece::const_iterator> |
| 283 HexIteratorRangeToUInt64Traits; | 284 HexIteratorRangeToUInt64Traits; |
| 284 | 285 |
| 285 template <typename STR> | 286 template <typename STR> |
| 286 bool HexStringToBytesT(const STR& input, std::vector<uint8_t>* output) { | 287 bool HexStringToBytesT(const STR& input, std::vector<uint8_t>* output) { |
| 287 DCHECK_EQ(output->size(), 0u); | 288 DCHECK_EQ(output->size(), 0u); |
| 288 size_t count = input.size(); | 289 size_t count = input.size(); |
| 289 if (count == 0 || (count % 2) != 0) | 290 if (count == 0 || (count % 2) != 0) |
| 290 return false; | 291 return false; |
|
Nico
2016/02/11 21:40:31
(this also doesn't write to output from what i can
davidben
2016/02/11 21:47:22
Hrm. I dunno. I don't have strong opinions about w
| |
| 291 for (uintptr_t i = 0; i < count / 2; ++i) { | 292 for (uintptr_t i = 0; i < count / 2; ++i) { |
| 292 uint8_t msb = 0; // most significant 4 bits | 293 uint8_t msb = 0; // most significant 4 bits |
| 293 uint8_t lsb = 0; // least significant 4 bits | 294 uint8_t lsb = 0; // least significant 4 bits |
| 294 if (!CharToDigit<16>(input[i * 2], &msb) || | 295 if (!CharToDigit<16>(input[i * 2], &msb) || |
| 295 !CharToDigit<16>(input[i * 2 + 1], &lsb)) | 296 !CharToDigit<16>(input[i * 2 + 1], &lsb)) |
| 296 return false; | 297 return false; |
| 297 output->push_back((msb << 4) | lsb); | 298 output->push_back((msb << 4) | lsb); |
| 298 } | 299 } |
| 299 return true; | 300 return true; |
| 300 } | 301 } |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 bool HexStringToUInt64(const StringPiece& input, uint64_t* output) { | 477 bool HexStringToUInt64(const StringPiece& input, uint64_t* output) { |
| 477 return IteratorRangeToNumber<HexIteratorRangeToUInt64Traits>::Invoke( | 478 return IteratorRangeToNumber<HexIteratorRangeToUInt64Traits>::Invoke( |
| 478 input.begin(), input.end(), output); | 479 input.begin(), input.end(), output); |
| 479 } | 480 } |
| 480 | 481 |
| 481 bool HexStringToBytes(const std::string& input, std::vector<uint8_t>* output) { | 482 bool HexStringToBytes(const std::string& input, std::vector<uint8_t>* output) { |
| 482 return HexStringToBytesT(input, output); | 483 return HexStringToBytesT(input, output); |
| 483 } | 484 } |
| 484 | 485 |
| 485 } // namespace base | 486 } // namespace base |
| OLD | NEW |