rapidyaml 0.15.2
parse and emit YAML, and do it fast
Loading...
Searching...
No Matches
ints_to_testsuite.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_ESCAPE_SCALAR_HPP_
13#endif
14
15#ifndef C4_YML_EXTRA_INTS_UTILS_HPP_
17#endif
18
19
20C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wold-style-cast")
21C4_SUPPRESS_WARNING_CLANG_WITH_PUSH("-Wold-style-cast")
22// NOLINTBEGIN(hicpp-signed-bitwise,*avoid-c-style-cast)
23
24//-----------------------------------------------------------------------------
25//-----------------------------------------------------------------------------
26//-----------------------------------------------------------------------------
27
28namespace c4 {
29namespace yml {
30namespace extra {
31
32C4_NODISCARD RYML_EXPORT
33size_t events_ints_to_testsuite(csubstr parsed_yaml, // NOLINT(*-use-internal-linkage)
34 csubstr arena,
35 ievt::evt_bits const* evts_ints,
36 ievt::evt_bits evts_ints_sz,
37 substr evts_test_suite)
38{
39 auto getstr = [&](ievt::evt_bits i){
40 bool in_arena = evts_ints[i] & ievt::AREN;
41 csubstr region = !in_arena ? parsed_yaml : arena;
42 return region.sub((size_t)evts_ints[i+1], (size_t)evts_ints[i+2]);
43 };
44 size_t sz = 0;
45 auto append = [&](csubstr s){
46 size_t next = sz + s.len;
47 if (s.len && (next <= evts_test_suite.len && evts_test_suite.len))
48 memcpy(evts_test_suite.str + sz, s.str, s.len);
49 sz = next;
50 };
51 bool has_tag = false;
52 csubstr tag;
53 auto maybe_append_tag = [&]{
54 if(has_tag)
55 {
56 if(tag.begins_with('<'))
57 {
58 append(" ");
59 append(tag);
60 }
61 else
62 {
63 RYML_ASSERT_BASIC_(tag.begins_with('!'));
64 append(" <");
65 append(tag);
66 append(">");
67 }
68 }
69 has_tag = false;
70 };
71 bool has_anchor = false;
72 csubstr anchor;
73 auto maybe_append_anchor = [&]{
74 if(has_anchor)
75 {
76 append(" &");
77 append(anchor);
78 }
79 has_anchor = false;
80 };
81 auto append_cont = [&](csubstr evt, csubstr style){
82 append(evt);
83 if(style.len)
84 {
85 append(" ");
86 append(style);
87 }
88 maybe_append_anchor();
89 maybe_append_tag();
90 append("\n");
91 };
92 auto append_esc = [&](csubstr str){
93 substr buf = sz <= evts_test_suite.len ? evts_test_suite.sub(sz) : evts_test_suite.last(0);
94 sz += escape_scalar(buf, str);
95 append("\n");
96 };
97 auto append_val = [&](csubstr evt, csubstr val){
98 append("=VAL");
99 maybe_append_anchor();
100 maybe_append_tag();
101 append(" ");
102 append(evt);
103 append_esc(val);
104 };
105 ievt::evt_bits evt = 0;
106 for(ievt::evt_bits i = 0; i < evts_ints_sz; i += (evt & ievt::WSTR) ? 3 : 1)
107 {
108 evt = evts_ints[i];
109 if(evt & ievt::SCLR)
110 {
111 csubstr s = getstr(i);
112 if(evt & ievt::SQUO)
113 append_val("'", s);
114 else if(evt & ievt::DQUO)
115 append_val("\"", s);
116 else if(evt & ievt::LITL)
117 append_val("|", s);
118 else if(evt & ievt::FOLD)
119 append_val(">", s);
120 else //if(evt & ievt::PLAI)
121 append_val(":", s);
122 }
123 else if((evt & ievt::BSEQ) == ievt::BSEQ)
124 {
125 if(evt & ievt::FLOW)
126 append_cont("+SEQ", "[]");
127 else
128 append_cont("+SEQ", "");
129 }
130 else if((evt & ievt::ESEQ) == ievt::ESEQ)
131 {
132 append("-SEQ\n");
133 }
134 else if((evt & ievt::BMAP) == ievt::BMAP)
135 {
136 if(evt & ievt::FLOW)
137 append_cont("+MAP", "{}");
138 else
139 append_cont("+MAP", "");
140 }
141 else if((evt & ievt::EMAP) == ievt::EMAP)
142 {
143 append("-MAP\n");
144 }
145 else if(evt & ievt::ALIA)
146 {
147 append("=ALI *");
148 append(getstr(i));
149 append("\n");
150 }
151 else if(evt & ievt::TAG_)
152 {
153 has_tag = true;
154 tag = getstr(i);
155 }
156 else if(evt & ievt::ANCH)
157 {
158 has_anchor = true;
159 anchor = getstr(i);
160 }
161 else if((evt & ievt::BDOC) == ievt::BDOC)
162 {
163 if(evt & ievt::EXPL)
164 append("+DOC ---\n");
165 else
166 append("+DOC\n");
167 }
168 else if((evt & ievt::EDOC) == ievt::EDOC)
169 {
170 if(evt & ievt::EXPL)
171 append("-DOC ...\n");
172 else
173 append("-DOC\n");
174 }
175 else if((evt & ievt::BSTR) == ievt::BSTR)
176 {
177 append("+STR\n");
178 }
179 else if((evt & ievt::ESTR) == ievt::ESTR)
180 {
181 append("-STR\n");
182 }
183 }
184 return sz;
185}
186
187} // namespace extra
188} // namespace yml
189} // namespace c4
190
191// NOLINTEND(hicpp-signed-bitwise,*avoid-c-style-cast)
192C4_SUPPRESS_WARNING_CLANG_POP
193C4_SUPPRESS_WARNING_GCC_POP
#define RYML_EXPORT
Definition export.hpp:18
size_t events_ints_to_testsuite(csubstr parsed_yaml, csubstr arena, ievt::evt_bits const *evts_ints, ievt::evt_bits evts_ints_sz, substr evts_test_suite)
Create a testsuite event string from integer events.
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
int32_t evt_bits
data type for integer events bits.
@ SCLR
scalar (=VAL in test suite events)
@ LITL
scalar: block literal (|)
@ EMAP
end map (-MAP in test suite events)
@ DQUO
scalar: double-quoted ("")
@ FOLD
scalar: block folded (>)
@ BMAP
begin map (+MAP in test suite events)
@ 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
@ 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...
@ EDOC
end doc (-DOC in test suite events)
@ EXPL
--- (with BDOC) or ... (with EDOC)
@ SQUO
scalar: single-quoted (')
size_t escape_scalar(substr buffer, csubstr scalar, bool keep_newlines=false)
Escape a scalar to an existing buffer, using escape_scalar_fn.
bool begins_with(const C c) const noexcept
true if the first character of the string is c
Definition substr.hpp:850
size_t len
the length of the substring
Definition substr.hpp:218
basic_substring last(size_t num) const noexcept
return the last num elements: [len-num,len[
Definition substr.hpp:536
basic_substring sub(size_t first) const noexcept
return [first,len[
Definition substr.hpp:502
C * str
a restricted pointer to the first character of the substring
Definition substr.hpp:216