| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 String::size_type len = value.length(); | 486 String::size_type len = value.length(); |
| 487 if (len == 0) | 487 if (len == 0) |
| 488 return 0; | 488 return 0; |
| 489 String::size_type pos = 0; | 489 String::size_type pos = 0; |
| 490 bool negative = std::numeric_limits<T>::is_signed && value[0] == u'-'; | 490 bool negative = std::numeric_limits<T>::is_signed && value[0] == u'-'; |
| 491 if (negative) | 491 if (negative) |
| 492 { | 492 { |
| 493 ++pos; | 493 ++pos; |
| 494 } | 494 } |
| 495 T result = 0; | 495 T result = 0; |
| 496 for (; pos < len && value[pos] >= u'0' && value[pos] <= u'9'; ++pos) | 496 for (; pos < len; ++pos) |
|
hub
2018/03/05 19:24:49
If the condition `value[pos] >= u'0' && value[pos]
sergei
2018/03/06 10:36:26
Done, but I'm not sure about "123 ", anyway we can
| |
| 497 { | 497 { |
| 498 // isDengerous is the optimization because there is no need for some check s | 498 auto c = value[pos]; |
|
hub
2018/03/05 19:24:49
isDangerous (typo)
sergei
2018/03/06 10:36:26
Done.
| |
| 499 if (c < u'0' || c > u'9') | |
| 500 return 0; | |
| 501 // isDangerous is the optimization because there is no need for some check s | |
| 499 // when the values are far from edge cases. | 502 // when the values are far from edge cases. |
| 500 // It targets the normal values, when a value is prefixed with several | 503 // It targets the normal values, when a value is prefixed with several |
| 501 // zeros additional checks start to work earlier than the actual value of | 504 // zeros additional checks start to work earlier than the actual value of |
| 502 // result reaches an edge case, but it does not affect the result. | 505 // result reaches an edge case, but it does not affect the result. |
| 503 bool isDangerous = pos >= std::numeric_limits<T>::digits10; | 506 bool isDangerous = pos >= std::numeric_limits<T>::digits10; |
|
hub
2018/03/06 14:45:53
this check on the number of digits could also be d
sergei
2018/03/06 15:41:32
This condition is satisfied but from a different p
hub
2018/03/06 15:56:45
Acknowledged.
| |
| 504 // It also invalidates the parsing of too big numbers in comparison with | 507 // It also invalidates the parsing of too big numbers in comparison with |
| 505 // stopping when it encounters a non numerical character. | 508 // stopping when it encounters a non numerical character. |
| 506 // cast<uint8_t>(u"1230"_str) -> 0 | 509 // cast<uint8_t>(u"1230"_str) -> 0 |
| 507 // cast<uint8_t>(u"123E"_str) -> 123 | 510 // cast<uint8_t>(u"123E"_str) -> 123 |
| 508 if (isDangerous && std::numeric_limits<T>::max() / 10 < result) | 511 if (isDangerous && std::numeric_limits<T>::max() / 10 < result) |
| 509 { | 512 { |
| 510 return 0; | 513 return 0; |
| 511 } | 514 } |
| 512 result *= 10; | 515 result *= 10; |
| 513 uint8_t digit = value[pos] - u'0'; | 516 uint8_t digit = c - u'0'; |
| 514 if (isDangerous && (std::numeric_limits<T>::max() - digit < result - (nega tive ? 1 : 0))) | 517 if (isDangerous && (std::numeric_limits<T>::max() - digit < result - (nega tive ? 1 : 0))) |
| 515 { | 518 { |
| 516 return 0; | 519 return 0; |
| 517 } | 520 } |
| 518 result += digit; | 521 result += digit; |
| 519 } | 522 } |
| 520 return negative ? -result : result; | 523 return negative ? -result : result; |
| 521 } | 524 } |
| 522 }; | 525 }; |
| 523 | 526 |
| 524 template<> | 527 template<> |
| 525 inline OwnedString lexical_cast<OwnedString>(const String& value) | 528 inline OwnedString lexical_cast<OwnedString>(const String& value) |
| 526 { | 529 { |
| 527 return OwnedString{value}; | 530 return OwnedString{value}; |
| 528 } | 531 } |
| 529 | 532 |
| 530 DependentString TrimSpaces(const String& value); | 533 DependentString TrimSpaces(const String& value); |
| 531 | 534 |
| 532 // Splits the `value` string into two `DependentString`s excluding the character staying at `separatorPos`. | 535 // Splits the `value` string into two `DependentString`s excluding the character staying at `separatorPos`. |
| 533 // Useful for parsing. | 536 // Useful for parsing. |
| 534 std::pair<DependentString, DependentString> SplitString(const String& value, Str ing::size_type separatorPos); | 537 std::pair<DependentString, DependentString> SplitString(const String& value, Str ing::size_type separatorPos); |
| 535 | 538 |
| 536 ABP_NS_END | 539 ABP_NS_END |
| LEFT | RIGHT |