rapidyaml 0.15.2
parse and emit YAML, and do it fast
Loading...
Searching...
No Matches
ints_utils.cpp
Go to the documentation of this file.
1#ifdef RYML_SINGLE_HEADER_INTS
2 #ifndef _RYML_SINGLE_HEADER_AMALGAMATED_HPP_
3 #include <ryml_ints.hpp>
4 #endif
5#elif defined(RYML_SINGLE_HEADER)
6 #ifndef _RYML_SINGLE_HEADER_AMALGAMATED_HPP_
7 #include <ryml_all.hpp>
8 #endif
9#endif
10
11#ifndef C4_YML_EXTRA_INTS_UTILS_HPP_
13#endif
14
15
16C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wold-style-cast")
17C4_SUPPRESS_WARNING_CLANG_WITH_PUSH("-Wold-style-cast")
18// NOLINTBEGIN(hicpp-signed-bitwise,*avoid-c-style-cast)
19
20
21namespace c4 {
22namespace yml {
23namespace extra {
24namespace ievt {
25
26namespace {
27struct FlagSym { const char *str; EventBits flags; };
28const FlagSym flag_syms_[] = {
29 {"KEY_", KEY_},
30 {"VAL_", VAL_},
31 {"SCLR", SCLR},
32 {"BSEQ", BSEQ},
33 {"ESEQ", ESEQ},
34 {"BMAP", BMAP},
35 {"EMAP", EMAP},
36 {"ALIA", ALIA},
37 {"ANCH", ANCH},
38 {"TAG_", TAG_},
39 {"PLAI", PLAI},
40 {"SQUO", SQUO},
41 {"DQUO", DQUO},
42 {"LITL", LITL},
43 {"FOLD", FOLD},
44 {"FLOW", FLOW},
45 {"BLCK", BLCK},
46 {"BDOC", BDOC},
47 {"EDOC", EDOC},
48 {"BSTR", BSTR},
49 {"ESTR", ESTR},
50 {"EXPL", EXPL},
51 {"AREN", AREN},
52 {"PSTR", PSTR},
53 {"UNFILT", UNFILT},
54 {"YAML", YAML},
55 {"TAGH", TAGH},
56 {"TAGP", TAGP},
57};
58} // namespace
59
60size_t to_str(substr buf, ievt::evt_bits flags) noexcept
61{
62 detail::SubstrWriter_ writer(buf);
63 for(const FlagSym sym : flag_syms_)
64 {
65 if(flags & sym.flags)
66 {
67 if(writer.pos)
68 writer.append('|');
69 writer.append(sym.str);
70 flags &= ~sym.flags;
71 }
72 }
73 if(!writer.pos)
74 writer.append("NONE");
75 if(buf.len > writer.pos)
76 buf[writer.pos] = '\0';
77 return writer.pos;
78}
79
81{
82 size_t reqsize = ievt::to_str(buf, flags);
83 RYML_CHECK_BASIC_(reqsize > 0u);
84 RYML_CHECK_BASIC_(reqsize < buf.len);
85 return buf.first(reqsize);
86}
87
88
89} // namespace ievt
90} // namespace extra
91} // namespace yml
92} // namespace c4
93
94
95//-----------------------------------------------------------------------------
96//-----------------------------------------------------------------------------
97//-----------------------------------------------------------------------------
98
99namespace c4 {
100namespace yml {
101namespace extra {
102
103void events_ints_print(csubstr parsed_yaml, csubstr arena, ievt::evt_bits const* evts, ievt::evt_bits evts_sz)
104{
105 char buf[200];
106 for(ievt::evt_bits evtpos = 0, evtnumber = 0;
107 evtpos < evts_sz;
108 ++evtnumber,
109 evtpos += ((evts[evtpos] & ievt::WSTR) ? 3 : 1))
110 {
111 ievt::evt_bits evt = evts[evtpos];
112 csubstr flags = ievt::to_str_sub(buf, evt);
113 printf("[%d][%d] %.*s(0x%x)", evtnumber, evtpos, (int)flags.len, flags.str, evt);
114 if (evt & ievt::WSTR)
115 {
116 bool in_arena = evt & ievt::AREN;
117 csubstr region = !in_arena ? parsed_yaml : arena;
118 bool safe = (evts[evtpos + 1] >= 0)
119 && (evts[evtpos + 2] >= 0)
120 && (evts[evtpos + 1] <= (ievt::evt_bits)region.len) // NOLINT
121 && (evts[evtpos + 2] <= ((ievt::evt_bits)region.len - evts[evtpos + 1]));
122 const char *str = safe ? (region.str + evts[evtpos + 1]) : "ERR!!!";
123 ievt::evt_bits len = safe ? evts[evtpos + 2] : 6;
124 printf(": %d [%d]~~~%.*s~~~", evts[evtpos+1], evts[evtpos+2], len, str);
125 if(in_arena)
126 printf(" (arenasz=%zu)", arena.len);
127 else
128 printf(" (srcsz=%zu)", parsed_yaml.len);
129 }
130 printf("\n");
131 }
132}
133
134} // namespace extra
135} // namespace yml
136} // namespace c4
137
138// NOLINTEND(hicpp-signed-bitwise,*avoid-c-style-cast)
139C4_SUPPRESS_WARNING_CLANG_POP
140C4_SUPPRESS_WARNING_GCC_POP
void events_ints_print(csubstr parsed_yaml, csubstr arena, ievt::evt_bits const *evts, ievt::evt_bits evts_sz)
Print integer events to stdout.
basic_substring< char > substr
a mutable string view
Definition substr.hpp:2355
basic_substring< const char > csubstr
an immutable string view
Definition substr.hpp:2356
csubstr to_str_sub(substr buf, ievt::evt_bits flags)
Convert bit mask of ievt::EventBits to text.
size_t to_str(substr buf, ievt::evt_bits flags) noexcept
Convert bit mask of ievt::EventBits to text.
int32_t evt_bits
data type for integer events bits.
EventBits
enumeration of integer event bits.
@ PSTR
Special flag to enable look-back in the event array. It signifies that the previous event has a strin...
@ SCLR
scalar (=VAL in test suite events)
@ LITL
scalar: block literal (|)
@ UNFILT
Special flag to mark a scalar as unfiltered (when the parser is set not to filter).
@ EMAP
end map (-MAP in test suite events)
@ DQUO
scalar: double-quoted ("")
@ FOLD
scalar: block folded (>)
@ BMAP
begin map (+MAP in test suite events)
@ TAGH
tag directive, handle: \TAG <handle> ........
@ ESTR
end stream (-STR in test suite events)
@ BSTR
begin stream (+STR in test suite events)
@ BSEQ
begin seq (+SEQ in test suite events)
@ ESEQ
end seq (-SEQ in test suite events)
@ WSTR
WithSTRing: mask of all events that encode a string following the event. For such events,...
@ FLOW
container: flow: [] for seqs or {} for maps
@ TAGP
tag directive, prefix: \TAG ........ <prefix>
@ BDOC
begin doc (+DOC in test suite events)
@ AREN
Special flag to mark events whose string was placed in the arena. This happens when the filtered stri...
@ YAML
yaml directive: \YAML <version>
@ EDOC
end doc (-DOC in test suite events)
@ EXPL
--- (with BDOC) or ... (with EDOC)
@ SQUO
scalar: single-quoted (')
size_t len
the length of the substring
Definition substr.hpp:218
basic_substring first(size_t num) const noexcept
return the first num elements: [0,num[
Definition substr.hpp:529
C * str
a restricted pointer to the first character of the substring
Definition substr.hpp:216