Coverage Report

Created: 2023-06-07 06:25

/src/boost/boost/json/impl/parser.ipp
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.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/json
8
//
9
10
#ifndef BOOST_JSON_IMPL_PARSER_IPP
11
#define BOOST_JSON_IMPL_PARSER_IPP
12
13
#include <boost/json/parser.hpp>
14
#include <boost/json/basic_parser_impl.hpp>
15
#include <boost/json/error.hpp>
16
#include <cstring>
17
#include <stdexcept>
18
#include <utility>
19
20
namespace boost {
21
namespace json {
22
23
parser::
24
parser(
25
    storage_ptr sp,
26
    parse_options const& opt,
27
    unsigned char* buffer,
28
    std::size_t size) noexcept
29
    : p_(
30
        opt,
31
        std::move(sp),
32
        buffer,
33
        size)
34
6.85k
{
35
6.85k
    reset();
36
6.85k
}
37
38
parser::
39
parser(
40
    storage_ptr sp,
41
    parse_options const& opt) noexcept
42
    : p_(
43
        opt,
44
        std::move(sp),
45
        nullptr,
46
        0)
47
0
{
48
0
    reset();
49
0
}
50
51
void
52
parser::
53
reset(storage_ptr sp) noexcept
54
13.7k
{
55
13.7k
    p_.reset();
56
13.7k
    p_.handler().st.reset(sp);
57
13.7k
}
58
59
std::size_t
60
parser::
61
write_some(
62
    char const* data,
63
    std::size_t size,
64
    error_code& ec)
65
6.85k
{
66
6.85k
    auto const n = p_.write_some(
67
6.85k
        false, data, size, ec);
68
6.85k
    BOOST_ASSERT(ec || p_.done());
69
6.85k
    return n;
70
6.85k
}
71
72
std::size_t
73
parser::
74
write_some(
75
    char const* data,
76
    std::size_t size,
77
    std::error_code& ec)
78
0
{
79
0
    error_code jec;
80
0
    std::size_t const result = write_some(data, size, jec);
81
0
    ec = jec;
82
0
    return result;
83
0
}
84
85
std::size_t
86
parser::
87
write_some(
88
    char const* data,
89
    std::size_t size)
90
0
{
91
0
    error_code ec;
92
0
    auto const n = write_some(
93
0
        data, size, ec);
94
0
    if(ec)
95
0
        detail::throw_system_error( ec );
96
0
    return n;
97
0
}
98
99
std::size_t
100
parser::
101
write(
102
    char const* data,
103
    std::size_t size,
104
    error_code& ec)
105
6.85k
{
106
6.85k
    auto const n = write_some(
107
6.85k
        data, size, ec);
108
6.85k
    if(! ec && n < size)
109
489
    {
110
489
        BOOST_JSON_FAIL(ec, error::extra_data);
111
489
        p_.fail(ec);
112
489
    }
113
6.85k
    return n;
114
6.85k
}
115
116
std::size_t
117
parser::
118
write(
119
    char const* data,
120
    std::size_t size,
121
    std::error_code& ec)
122
0
{
123
0
    error_code jec;
124
0
    std::size_t const result = write(data, size, jec);
125
0
    ec = jec;
126
0
    return result;
127
0
}
128
129
std::size_t
130
parser::
131
write(
132
    char const* data,
133
    std::size_t size)
134
0
{
135
0
    error_code ec;
136
0
    auto const n = write(
137
0
        data, size, ec);
138
0
    if(ec)
139
0
        detail::throw_system_error( ec );
140
0
    return n;
141
0
}
142
143
value
144
parser::
145
release()
146
2.11k
{
147
2.11k
    if( ! p_.done())
148
0
    {
149
        // prevent undefined behavior
150
0
        if(! p_.last_error())
151
0
        {
152
0
            error_code ec;
153
0
            BOOST_JSON_FAIL(ec, error::incomplete);
154
0
            p_.fail(ec);
155
0
        }
156
0
        detail::throw_system_error(
157
0
            p_.last_error());
158
0
    }
159
2.11k
    return p_.handler().st.release();
160
2.11k
}
161
162
} // namespace json
163
} // namespace boost
164
165
#endif