LCOV - code coverage report
Current view: top level - libs/url/src/rfc/detail - port_rule.cpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 43 44 97.7 %
Date: 2024-03-13 19:32:03 Functions: 2 2 100.0 %

          Line data    Source code
       1             : //
       2             : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
       3             : //
       4             : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5             : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6             : //
       7             : // Official repository: https://github.com/boostorg/url
       8             : //
       9             : 
      10             : 
      11             : #include <boost/url/detail/config.hpp>
      12             : #include "port_rule.hpp"
      13             : #include <boost/url/grammar/parse.hpp>
      14             : #include <boost/url/grammar/token_rule.hpp>
      15             : #include <boost/url/grammar/unsigned_rule.hpp>
      16             : #include <boost/static_assert.hpp>
      17             : #include <type_traits>
      18             : 
      19             : namespace boost {
      20             : namespace urls {
      21             : namespace detail {
      22             : 
      23             : auto
      24         362 : port_rule::
      25             : parse(
      26             :     char const*& it,
      27             :     char const* end) const noexcept ->
      28             :         system::result<value_type>
      29             : {
      30         362 :     value_type t;
      31         362 :     auto const start = it;
      32         128 :     while(
      33         490 :         it != end &&
      34         428 :         *it == '0')
      35             :     {
      36         128 :         ++it;
      37             :     }
      38             : 
      39         362 :     if (it != end)
      40             :     {
      41             :         grammar::unsigned_rule<std::uint16_t> r;
      42         300 :         auto it0 = it;
      43         300 :         auto rv = r.parse(it, end);
      44         300 :         if (rv)
      45             :         {
      46             :             // number < max uint16_t
      47         246 :             t.str = core::string_view(start, it);
      48         246 :             t.has_number = true;
      49         246 :             t.number = *rv;
      50         267 :             return t;
      51             :         }
      52          54 :         it = it0;
      53          54 :         if (grammar::digit_chars(*it))
      54             :         {
      55             :             // number > max uint16_t
      56         168 :             while (
      57         366 :                 it != end &&
      58         177 :                 grammar::digit_chars(*it))
      59             :             {
      60         168 :                 ++it;
      61             :             }
      62          21 :             t.str = core::string_view(start, it);
      63          21 :             t.has_number = true;
      64          21 :             t.number = 0;
      65          21 :             return t;
      66             :         }
      67             :     }
      68             :     // no digits
      69          95 :     t.str = core::string_view(start, it);
      70          95 :     t.has_number = it != end;
      71          95 :     t.number = 0;
      72          95 :     return t;
      73             : }
      74             : 
      75             : auto
      76        1875 : port_part_rule_t::
      77             : parse(
      78             :     char const*& it,
      79             :     char const* end) const noexcept ->
      80             :         system::result<value_type>
      81             : {
      82        1875 :     value_type t;
      83        1875 :     if( it == end ||
      84        1280 :         *it != ':')
      85             :     {
      86        1603 :         t.has_port = false;
      87        1603 :         return t;
      88             :     }
      89         272 :     ++it;
      90             :     auto rv = grammar::parse(
      91         272 :         it, end, port_rule{});
      92         272 :     if(! rv)
      93           0 :         return rv.error();
      94         272 :     t.has_port = true;
      95         272 :     t.port = rv->str;
      96         272 :     t.has_number = rv->has_number;
      97         272 :     t.port_number = rv->number;
      98         272 :     return t;
      99             : }
     100             : 
     101             : } // detail
     102             : } // urls
     103             : } // boost
     104             : 

Generated by: LCOV version 1.15