Path: blob/master/dep/rapidyaml/include/c4/yml/detail/parser_dbg.hpp
4270 views
#ifndef _C4_YML_DETAIL_PARSER_DBG_HPP_1#define _C4_YML_DETAIL_PARSER_DBG_HPP_23#ifndef _C4_YML_COMMON_HPP_4#include "../common.hpp"5#endif6#include <cstdio>78//-----------------------------------------------------------------------------9// some debugging scaffolds1011#if defined(_MSC_VER)12# pragma warning(push)13# pragma warning(disable: 4068/*unknown pragma*/)14#endif1516#pragma GCC diagnostic push17#pragma GCC diagnostic ignored "-Wunknown-pragmas"18//#pragma GCC diagnostic ignored "-Wpragma-system-header-outside-header"19#pragma GCC system_header2021#pragma clang diagnostic push22#pragma clang diagnostic ignored "-Werror"23#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"2425// some debugging scaffolds26#ifdef RYML_DBG27#include <c4/dump.hpp>28namespace c4 {29inline void _dbg_dumper(csubstr s) { fwrite(s.str, 1, s.len, stdout); };30template<class ...Args>31void _dbg_printf(c4::csubstr fmt, Args&& ...args)32{33static char writebuf[256];34auto results = c4::format_dump_resume<&_dbg_dumper>(writebuf, fmt, std::forward<Args>(args)...);35// resume writing if the results failed to fit the buffer36if(C4_UNLIKELY(results.bufsize > sizeof(writebuf))) // bufsize will be that of the largest element serialized. Eg int(1), will require 1 byte.37{38results = format_dump_resume<&_dbg_dumper>(results, writebuf, fmt, std::forward<Args>(args)...);39if(C4_UNLIKELY(results.bufsize > sizeof(writebuf)))40{41results = format_dump_resume<&_dbg_dumper>(results, writebuf, fmt, std::forward<Args>(args)...);42}43}44}45} // namespace c44647# define _c4dbgt(fmt, ...) this->_dbg ("{}:{}: " fmt , __FILE__, __LINE__, ## __VA_ARGS__)48# define _c4dbgpf(fmt, ...) _dbg_printf("{}:{}: " fmt "\n", __FILE__, __LINE__, ## __VA_ARGS__)49# define _c4dbgp(msg) _dbg_printf("{}:{}: " msg "\n", __FILE__, __LINE__ )50# define _c4dbgq(msg) _dbg_printf(msg "\n")51# define _c4err(fmt, ...) \52do { if(c4::is_debugger_attached()) { C4_DEBUG_BREAK(); } \53this->_err("ERROR:\n" "{}:{}: " fmt, __FILE__, __LINE__, ## __VA_ARGS__); } while(0)54#else55# define _c4dbgt(fmt, ...)56# define _c4dbgpf(fmt, ...)57# define _c4dbgp(msg)58# define _c4dbgq(msg)59# define _c4err(fmt, ...) \60do { if(c4::is_debugger_attached()) { C4_DEBUG_BREAK(); } \61this->_err("ERROR: " fmt, ## __VA_ARGS__); } while(0)62#endif6364#define _c4prsp(sp) sp65#define _c4presc(s) __c4presc(s.str, s.len)66inline c4::csubstr _c4prc(const char &C4_RESTRICT c)67{68switch(c)69{70case '\n': return c4::csubstr("\\n");71case '\t': return c4::csubstr("\\t");72case '\0': return c4::csubstr("\\0");73case '\r': return c4::csubstr("\\r");74case '\f': return c4::csubstr("\\f");75case '\b': return c4::csubstr("\\b");76case '\v': return c4::csubstr("\\v");77case '\a': return c4::csubstr("\\a");78default: return c4::csubstr(&c, 1);79}80}81inline void __c4presc(const char *s, size_t len)82{83size_t prev = 0;84for(size_t i = 0; i < len; ++i)85{86switch(s[i])87{88case '\n' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('n'); putchar('\n'); prev = i+1; break;89case '\t' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('t'); prev = i+1; break;90case '\0' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('0'); prev = i+1; break;91case '\r' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('r'); prev = i+1; break;92case '\f' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('f'); prev = i+1; break;93case '\b' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('b'); prev = i+1; break;94case '\v' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('v'); prev = i+1; break;95case '\a' : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('a'); prev = i+1; break;96case '\x1b': fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('e'); prev = i+1; break;97case -0x3e/*0xc2u*/:98if(i+1 < len)99{100if(s[i+1] == -0x60/*0xa0u*/)101{102fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('_'); prev = i+2; ++i;103}104else if(s[i+1] == -0x7b/*0x85u*/)105{106fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('N'); prev = i+2; ++i;107}108break;109}110case -0x1e/*0xe2u*/:111if(i+2 < len && s[i+1] == -0x80/*0x80u*/)112{113if(s[i+2] == -0x58/*0xa8u*/)114{115fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('L'); prev = i+3; i += 2;116}117else if(s[i+2] == -0x57/*0xa9u*/)118{119fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('P'); prev = i+3; i += 2;120}121break;122}123}124}125fwrite(s + prev, 1, len - prev, stdout);126}127128#pragma clang diagnostic pop129#pragma GCC diagnostic pop130131#if defined(_MSC_VER)132# pragma warning(pop)133#endif134135136#endif /* _C4_YML_DETAIL_PARSER_DBG_HPP_ */137138139