rapidyaml  0.16.0
parseandemitYAML,anddoitfast
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_
12 #include "c4/yml/escape_scalar.hpp"
13 #endif
14 
15 #ifndef C4_YML_EXTRA_INTS_UTILS_HPP_
17 #endif
18 
19 
20 C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wold-style-cast")
21 C4_SUPPRESS_WARNING_CLANG_WITH_PUSH("-Wold-style-cast")
22 // NOLINTBEGIN(hicpp-signed-bitwise,*avoid-c-style-cast)
23 
24 //-----------------------------------------------------------------------------
25 //-----------------------------------------------------------------------------
26 //-----------------------------------------------------------------------------
27 
28 namespace c4 {
29 namespace yml {
30 namespace extra {
31 
32 C4_NODISCARD RYML_EXPORT
33 size_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)
192 C4_SUPPRESS_WARNING_CLANG_POP
193 C4_SUPPRESS_WARNING_GCC_POP
begin doc (+DOC in test suite events)
begin seq (+SEQ in test suite events)
WithSTRing: mask of all events that encode a string following the event. For such events...
C * str
a restricted pointer to the first character of the substring
Definition: substr.hpp:216
scalar: block folded (>)
const char * str
Definition: node_type.cpp:70
size_t escape_scalar(substr buffer, csubstr scalar, bool keep_newlines=false)
Escape a scalar to an existing buffer, using escape_scalar_fn.
scalar: block literal (|)
basic_substring sub(size_t first) const noexcept
return [first,len[
Definition: substr.hpp:502
scalar: single-quoted (')
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.
end seq (-SEQ in test suite events)
end stream (-STR in test suite events)
size_t len
the length of the substring
Definition: substr.hpp:218
end doc (-DOC in test suite events)
scalar: double-quoted ("")
begin map (+MAP in test suite events)
container: flow: [] for seqs or {} for maps
int32_t evt_bits
data type for integer events bits.
Special flag to mark events whose string was placed in the arena. This happens when the filtered stri...
basic_substring last(size_t num) const noexcept
return the last num elements: [len-num,len[
Definition: substr.hpp:536
--- (with BDOC) or ... (with EDOC)
#define RYML_EXPORT
Definition: export.hpp:18
scalar (=VAL in test suite events)
bool begins_with(const C c) const noexcept
true if the first character of the string is c
Definition: substr.hpp:850
end map (-MAP in test suite events)
begin stream (+STR in test suite events)