rapidyaml  0.16.0
parseandemitYAML,anddoitfast
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 
16 C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wold-style-cast")
17 C4_SUPPRESS_WARNING_CLANG_WITH_PUSH("-Wold-style-cast")
18 // NOLINTBEGIN(hicpp-signed-bitwise,*avoid-c-style-cast)
19 
20 
21 namespace c4 {
22 namespace yml {
23 namespace extra {
24 namespace ievt {
25 
26 namespace {
27 struct FlagSym { const char *str; EventBits flags; };
28 const 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 
60 size_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 
99 namespace c4 {
100 namespace yml {
101 namespace extra {
102 
103 void 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)
139 C4_SUPPRESS_WARNING_CLANG_POP
140 C4_SUPPRESS_WARNING_GCC_POP
begin doc (+DOC in test suite events)
begin seq (+SEQ in test suite events)
Special flag to mark a scalar as unfiltered (when the parser is set not to filter).
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 (>)
EventBits flags
Definition: ints_utils.cpp:27
csubstr to_str_sub(substr buf, ievt::evt_bits flags)
Convert bit mask of ievt::EventBits to text.
Definition: ints_utils.cpp:80
size_t to_str(substr buf, ievt::evt_bits flags) noexcept
Convert bit mask of ievt::EventBits to text.
Definition: ints_utils.cpp:60
basic_substring first(size_t num) const noexcept
return the first num elements: [0,num[
Definition: substr.hpp:529
tag directive, handle: \TAG ........
void events_ints_print(csubstr parsed_yaml, csubstr arena, ievt::evt_bits const *evts, ievt::evt_bits evts_sz)
Print integer events to stdout.
Definition: ints_utils.cpp:103
Special flag to enable look-back in the event array. It signifies that the previous event has a strin...
tag directive, prefix: \TAG ........
scalar: block literal (|)
scalar: single-quoted (')
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...
const char * str
Definition: ints_utils.cpp:27
--- (with BDOC) or ... (with EDOC)
scalar (=VAL in test suite events)
EventBits
enumeration of integer event bits.
end map (-MAP in test suite events)
begin stream (+STR in test suite events)