This is an automated email from the ASF dual-hosted git repository.

bneradt pushed a commit to branch dev-1-2-13
in repository https://gitbox.apache.org/repos/asf/trafficserver-libswoc.git

commit 85b5f2d090d547d9126173945733db29da810ae4
Author: Alan M. Carroll <a...@apache.org>
AuthorDate: Thu Nov 5 14:49:53 2020 -0600

    Add "0b" for binary prefix checking to svtoi.
---
 code/src/TextView.cc        | 28 ++++++++++++++++++----------
 unit_tests/test_TextView.cc |  1 +
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/code/src/TextView.cc b/code/src/TextView.cc
index 5ae6863..4759f2a 100644
--- a/code/src/TextView.cc
+++ b/code/src/TextView.cc
@@ -86,7 +86,7 @@ intmax_t
 svtoi(TextView src, TextView *out, int base) {
   intmax_t zret = 0;
 
-  if (src.ltrim_if(&isspace) && src) {
+  if (src.ltrim_if(&isspace)) {
     TextView parsed;
     const char *start = src.data();
     bool neg = false;
@@ -128,21 +128,29 @@ svtou(TextView src, TextView *out, int base) {
       if ('0' == *src) {
         ++src;
         base = 8;
-        if (src && ('x' == *src || 'X' == *src)) {
-          ++src;
-          base = 16;
+        if (src) {
+          switch (*src) {
+            case 'x':
+            case 'X':
+              ++src;
+              base = 16;
+              break;
+            case 'b':
+            case 'B':
+              ++src;
+              base = 2;
+              break;
+          }
         }
       }
     }
 
     // For performance in common cases, use the templated conversion.
     switch (base) {
-      case 8:zret = svto_radix<8>(src);
-        break;
-      case 10:zret = svto_radix<10>(src);
-        break;
-      case 16:zret = svto_radix<16>(src);
-        break;
+      case 2: zret = svto_radix<2>(src); break;
+      case 8: zret = svto_radix<8>(src); break;
+      case 10: zret = svto_radix<10>(src); break;
+      case 16: zret = svto_radix<16>(src); break;
       default:
         while (src.size() && (0 <= (v = svtoi_convert[static_cast<unsigned 
char>(*src)])) &&
                v < base) {
diff --git a/unit_tests/test_TextView.cc b/unit_tests/test_TextView.cc
index 4b914f3..b8a29e5 100644
--- a/unit_tests/test_TextView.cc
+++ b/unit_tests/test_TextView.cc
@@ -385,6 +385,7 @@ TEST_CASE("TextView Conversions", "[libswoc][TextView]")
   REQUIRE(2345679 == svtoi(n8));
   REQUIRE(2345679 == svtoi(n8, &x));
   REQUIRE(x == n8);
+  REQUIRE(0b10111 == svtoi("0b10111"_tv));
 
   x = n4;
   REQUIRE(13 == swoc::svto_radix<10>(x));

Reply via email to