aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp')
-rw-r--r--thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp289
1 files changed, 0 insertions, 289 deletions
diff --git a/thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp b/thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp
deleted file mode 100644
index 6c22b1e6e..000000000
--- a/thirdparty/ryml/test/test_suite/test_suite_events_emitter.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-#ifndef RYML_SINGLE_HEADER
-#include <c4/yml/std/string.hpp>
-#endif
-#include "test_suite_events.hpp"
-
-namespace c4 {
-namespace yml {
-
-struct EventsEmitter
-{
- substr buf;
- size_t pos;
- std::string tagbuf;
- Tree const* C4_RESTRICT m_tree;
- EventsEmitter(Tree const& tree, substr buf_) : buf(buf_), pos(), m_tree(&tree) {}
- void emit_tag(csubstr tag, size_t node);
- void emit_scalar(csubstr val, bool quoted);
- void emit_key_anchor_tag(size_t node);
- void emit_val_anchor_tag(size_t node);
- void emit_events(size_t node);
- void emit_doc(size_t node);
- void emit_events();
- template<size_t N>
- C4_ALWAYS_INLINE void pr(const char (&s)[N])
- {
- if(pos + N-1 <= buf.len)
- memcpy(buf.str + pos, s, N-1);
- pos += N-1;
- }
- C4_ALWAYS_INLINE void pr(csubstr s)
- {
- if(pos + s.len <= buf.len)
- memcpy(buf.str + pos, s.str, s.len);
- pos += s.len;
- }
- C4_ALWAYS_INLINE void pr(char c)
- {
- if(pos + 1 <= buf.len)
- buf[pos] = c;
- ++pos;
- }
- C4_ALWAYS_INLINE size_t emit_to_esc(csubstr val, size_t prev, size_t i, char c)
- {
- pr(val.range(prev, i));
- pr('\\');
- pr(c);
- return i+1;
- }
- C4_ALWAYS_INLINE size_t emit_to_esc(csubstr val, size_t prev, size_t i, csubstr repl)
- {
- pr(val.range(prev, i));
- pr(repl);
- return i+1;
- }
-};
-
-void EventsEmitter::emit_scalar(csubstr val, bool quoted)
-{
- constexpr const char openchar[] = {':', '\''};
- pr(openchar[quoted]);
- size_t prev = 0;
- uint8_t const* C4_RESTRICT s = (uint8_t const* C4_RESTRICT) val.str;
- for(size_t i = 0; i < val.len; ++i)
- {
- switch(s[i])
- {
- case UINT8_C(0x0a): // \n
- prev = emit_to_esc(val, prev, i, 'n'); break;
- case UINT8_C(0x5c): // '\\'
- prev = emit_to_esc(val, prev, i, '\\'); break;
- case UINT8_C(0x09): // \t
- prev = emit_to_esc(val, prev, i, 't'); break;
- case UINT8_C(0x0d): // \r
- prev = emit_to_esc(val, prev, i, 'r'); break;
- case UINT8_C(0x00): // \0
- prev = emit_to_esc(val, prev, i, '0'); break;
- case UINT8_C(0x0c): // \f (form feed)
- prev = emit_to_esc(val, prev, i, 'f'); break;
- case UINT8_C(0x08): // \b (backspace)
- prev = emit_to_esc(val, prev, i, 'b'); break;
- case UINT8_C(0x07): // \a (bell)
- prev = emit_to_esc(val, prev, i, 'a'); break;
- case UINT8_C(0x0b): // \v (vertical tab)
- prev = emit_to_esc(val, prev, i, 'v'); break;
- case UINT8_C(0x1b): // \e (escape)
- prev = emit_to_esc(val, prev, i, "\\e"); break;
- case UINT8_C(0xc2):
- if(i+1 < val.len)
- {
- uint8_t np1 = s[i+1];
- if(np1 == UINT8_C(0xa0))
- prev = 1u + emit_to_esc(val, prev, i++, "\\_");
- else if(np1 == UINT8_C(0x85))
- prev = 1u + emit_to_esc(val, prev, i++, "\\N");
- }
- break;
- case UINT8_C(0xe2):
- if(i+2 < val.len)
- {
- if(s[i+1] == UINT8_C(0x80))
- {
- if(s[i+2] == UINT8_C(0xa8))
- {
- prev = 2u + emit_to_esc(val, prev, i, "\\L");
- i += 2u;
- }
- else if(s[i+2] == UINT8_C(0xa9))
- {
- prev = 2u + emit_to_esc(val, prev, i, "\\P");
- i += 2u;
- }
- }
- }
- break;
- }
- }
- pr(val.sub(prev)); // print remaining portion
-}
-
-void EventsEmitter::emit_tag(csubstr tag, size_t node)
-{
- size_t tagsize = m_tree->resolve_tag(to_substr(tagbuf), tag, node);
- if(tagsize)
- {
- if(tagsize > tagbuf.size())
- {
- tagbuf.resize(tagsize);
- tagsize = m_tree->resolve_tag(to_substr(tagbuf), tag, node);
- }
- pr(to_substr(tagbuf).first(tagsize));
- }
- else
- {
- csubstr ntag = normalize_tag_long(tag);
- if(ntag.begins_with('<'))
- {
- pr(ntag);
- }
- else
- {
- pr('<');
- pr(ntag);
- pr('>');
- }
- }
-}
-
-void EventsEmitter::emit_key_anchor_tag(size_t node)
-{
- if(m_tree->has_key_anchor(node))
- {
- pr(" &");
- pr(m_tree->key_anchor(node));
- }
- if(m_tree->has_key_tag(node))
- {
- pr(' ');
- emit_tag(m_tree->key_tag(node), node);
- }
-}
-
-void EventsEmitter::emit_val_anchor_tag(size_t node)
-{
- if(m_tree->has_val_anchor(node))
- {
- pr(" &");
- pr(m_tree->val_anchor(node));
- }
- if(m_tree->has_val_tag(node))
- {
- pr(' ');
- emit_tag(m_tree->val_tag(node), node);
- }
-}
-
-void EventsEmitter::emit_events(size_t node)
-{
- if(m_tree->has_key(node))
- {
- if(m_tree->is_key_ref(node))
- {
- csubstr k = m_tree->key(node);
- if(k != "<<")
- {
- pr("=ALI ");
- pr(k);
- pr('\n');
- }
- else
- {
- pr("=VAL :");
- pr(k);
- pr('\n');
- }
- }
- else
- {
- pr("=VAL");
- emit_key_anchor_tag(node);
- pr(' ');
- emit_scalar(m_tree->key(node), m_tree->is_key_quoted(node));
- pr('\n');
- }
- }
- if(m_tree->has_val(node))
- {
- if(m_tree->is_val_ref(node))
- {
- pr("=ALI ");
- pr(m_tree->val(node));
- pr('\n');
- }
- else
- {
- pr("=VAL");
- emit_val_anchor_tag(node);
- pr(' ');
- emit_scalar(m_tree->val(node), m_tree->is_val_quoted(node));
- pr('\n');
- }
- }
- else if(m_tree->is_map(node))
- {
- pr("+MAP");
- emit_val_anchor_tag(node);
- pr('\n');
- for(size_t child = m_tree->first_child(node); child != NONE; child = m_tree->next_sibling(child))
- emit_events(child);
- pr("-MAP\n");
- }
- else if(m_tree->is_seq(node))
- {
- pr("+SEQ");
- emit_val_anchor_tag(node);
- pr('\n');
- for(size_t child = m_tree->first_child(node); child != NONE; child = m_tree->next_sibling(child))
- emit_events(child);
- pr("-SEQ\n");
- }
-}
-
-void EventsEmitter::emit_doc(size_t node)
-{
- if(m_tree->type(node) == NOTYPE)
- return;
- if(m_tree->has_parent(node))
- pr("+DOC ---"); // parent must be a stream
- else
- pr("+DOC");
- if(m_tree->is_val(node))
- {
- pr("\n=VAL");
- emit_val_anchor_tag(node);
- pr(' ');
- emit_scalar(m_tree->val(node), m_tree->is_val_quoted(node));
- pr('\n');
- }
- else
- {
- pr('\n');
- emit_events(node);
- }
- pr("-DOC\n");
-}
-
-void EventsEmitter::emit_events()
-{
- pr("+STR\n");
- if(!m_tree->empty())
- {
- size_t root = m_tree->root_id();
- if(m_tree->is_stream(root))
- for(size_t node = m_tree->first_child(root); node != NONE; node = m_tree->next_sibling(node))
- emit_doc(node);
- else
- emit_doc(root);
- }
- pr("-STR\n");
-}
-
-size_t emit_events(substr buf, Tree const& C4_RESTRICT tree)
-{
- EventsEmitter e(tree, buf);
- e.emit_events();
- return e.pos;
-}
-
-} // namespace yml
-} // namespace c4