ext-boost/boost/url/rfc/detail/impl/port_rule.ipp
2023-05-22 18:45:02 +10:00

107 lines
2.2 KiB
C++

//
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/url
//
#ifndef BOOST_URL_IMPL_PORT_RULE_IPP
#define BOOST_URL_IMPL_PORT_RULE_IPP
#include <boost/url/rfc/detail/port_rule.hpp>
#include <boost/url/grammar/parse.hpp>
#include <boost/url/grammar/token_rule.hpp>
#include <boost/url/grammar/unsigned_rule.hpp>
#include <boost/static_assert.hpp>
#include <type_traits>
namespace boost {
namespace urls {
namespace detail {
auto
port_rule::
parse(
char const*& it,
char const* end) const noexcept ->
result<value_type>
{
value_type t;
auto const start = it;
while(
it != end &&
*it == '0')
{
++it;
}
if (it != end)
{
grammar::unsigned_rule<std::uint16_t> r;
auto it0 = it;
auto rv = r.parse(it, end);
if (rv)
{
// number < max uint16_t
t.str = string_view(start, it);
t.has_number = true;
t.number = *rv;
return t;
}
it = it0;
if (grammar::digit_chars(*it))
{
// number > max uint16_t
while (
it != end &&
grammar::digit_chars(*it))
{
++it;
}
t.str = string_view(start, it);
t.has_number = true;
t.number = 0;
return t;
}
}
// no digits
t.str = string_view(start, it);
t.has_number = it != end;
t.number = 0;
return t;
}
auto
port_part_rule_t::
parse(
char const*& it,
char const* end) const noexcept ->
result<value_type>
{
value_type t;
if( it == end ||
*it != ':')
{
t.has_port = false;
return t;
}
++it;
auto rv = grammar::parse(
it, end, port_rule{});
if(! rv)
return rv.error();
t.has_port = true;
t.port = rv->str;
t.has_number = rv->has_number;
t.port_number = rv->number;
return t;
}
} // detail
} // urls
} // boost
#endif