mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef _C4_YML_DETAIL_PARSER_DBG_HPP_
 | |
| #define _C4_YML_DETAIL_PARSER_DBG_HPP_
 | |
| 
 | |
| #ifndef _C4_YML_COMMON_HPP_
 | |
| #include "../common.hpp"
 | |
| #endif
 | |
| #include <cstdio>
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // some debugging scaffolds
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| #   pragma warning(push)
 | |
| #   pragma warning(disable: 4068/*unknown pragma*/)
 | |
| #endif
 | |
| 
 | |
| #pragma GCC diagnostic push
 | |
| #pragma GCC diagnostic ignored "-Wunknown-pragmas"
 | |
| //#pragma GCC diagnostic ignored "-Wpragma-system-header-outside-header"
 | |
| #pragma GCC system_header
 | |
| 
 | |
| #pragma clang diagnostic push
 | |
| #pragma clang diagnostic ignored "-Werror"
 | |
| #pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
 | |
| 
 | |
| // some debugging scaffolds
 | |
| #ifdef RYML_DBG
 | |
| #include <c4/dump.hpp>
 | |
| namespace c4 {
 | |
| inline void _dbg_dumper(csubstr s) { fwrite(s.str, 1, s.len, stdout); };
 | |
| template<class ...Args>
 | |
| void _dbg_printf(c4::csubstr fmt, Args&& ...args)
 | |
| {
 | |
|     static char writebuf[256];
 | |
|     auto results = c4::format_dump_resume<&_dbg_dumper>(writebuf, fmt, std::forward<Args>(args)...);
 | |
|     // resume writing if the results failed to fit the buffer
 | |
|     if(C4_UNLIKELY(results.bufsize > sizeof(writebuf))) // bufsize will be that of the largest element serialized. Eg int(1), will require 1 byte.
 | |
|     {
 | |
|         results = format_dump_resume<&_dbg_dumper>(results, writebuf, fmt, std::forward<Args>(args)...);
 | |
|         if(C4_UNLIKELY(results.bufsize > sizeof(writebuf)))
 | |
|         {
 | |
|             results = format_dump_resume<&_dbg_dumper>(results, writebuf, fmt, std::forward<Args>(args)...);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| } // namespace c4
 | |
| 
 | |
| #   define _c4dbgt(fmt, ...)   this->_dbg ("{}:{}: "   fmt     , __FILE__, __LINE__, ## __VA_ARGS__)
 | |
| #   define _c4dbgpf(fmt, ...)  _dbg_printf("{}:{}: "   fmt "\n", __FILE__, __LINE__, ## __VA_ARGS__)
 | |
| #   define _c4dbgp(msg)        _dbg_printf("{}:{}: "   msg "\n", __FILE__, __LINE__                )
 | |
| #   define _c4dbgq(msg)        _dbg_printf(msg "\n")
 | |
| #   define _c4err(fmt, ...)   \
 | |
|     do { if(c4::is_debugger_attached()) { C4_DEBUG_BREAK(); } \
 | |
|          this->_err("ERROR:\n" "{}:{}: " fmt, __FILE__, __LINE__, ## __VA_ARGS__); } while(0)
 | |
| #else
 | |
| #   define _c4dbgt(fmt, ...)
 | |
| #   define _c4dbgpf(fmt, ...)
 | |
| #   define _c4dbgp(msg)
 | |
| #   define _c4dbgq(msg)
 | |
| #   define _c4err(fmt, ...)   \
 | |
|     do { if(c4::is_debugger_attached()) { C4_DEBUG_BREAK(); } \
 | |
|          this->_err("ERROR: " fmt, ## __VA_ARGS__); } while(0)
 | |
| #endif
 | |
| 
 | |
| #define _c4prsp(sp) sp
 | |
| #define _c4presc(s) __c4presc(s.str, s.len)
 | |
| inline c4::csubstr _c4prc(const char &C4_RESTRICT c)
 | |
| {
 | |
|     switch(c)
 | |
|     {
 | |
|     case '\n': return c4::csubstr("\\n");
 | |
|     case '\t': return c4::csubstr("\\t");
 | |
|     case '\0': return c4::csubstr("\\0");
 | |
|     case '\r': return c4::csubstr("\\r");
 | |
|     case '\f': return c4::csubstr("\\f");
 | |
|     case '\b': return c4::csubstr("\\b");
 | |
|     case '\v': return c4::csubstr("\\v");
 | |
|     case '\a': return c4::csubstr("\\a");
 | |
|     default: return c4::csubstr(&c, 1);
 | |
|     }
 | |
| }
 | |
| inline void __c4presc(const char *s, size_t len)
 | |
| {
 | |
|     size_t prev = 0;
 | |
|     for(size_t i = 0; i < len; ++i)
 | |
|     {
 | |
|         switch(s[i])
 | |
|         {
 | |
|         case '\n'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('n'); putchar('\n'); prev = i+1; break;
 | |
|         case '\t'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('t'); prev = i+1; break;
 | |
|         case '\0'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('0'); prev = i+1; break;
 | |
|         case '\r'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('r'); prev = i+1; break;
 | |
|         case '\f'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('f'); prev = i+1; break;
 | |
|         case '\b'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('b'); prev = i+1; break;
 | |
|         case '\v'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('v'); prev = i+1; break;
 | |
|         case '\a'  : fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('a'); prev = i+1; break;
 | |
|         case '\x1b': fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('e'); prev = i+1; break;
 | |
|         case -0x3e/*0xc2u*/:
 | |
|             if(i+1 < len)
 | |
|             {
 | |
|                 if(s[i+1] == -0x60/*0xa0u*/)
 | |
|                 {
 | |
|                     fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('_'); prev = i+2; ++i;
 | |
|                 }
 | |
|                 else if(s[i+1] == -0x7b/*0x85u*/)
 | |
|                 {
 | |
|                     fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('N'); prev = i+2; ++i;
 | |
|                 }
 | |
|                 break;
 | |
|             }
 | |
|         case -0x1e/*0xe2u*/:
 | |
|             if(i+2 < len && s[i+1] == -0x80/*0x80u*/)
 | |
|             {
 | |
|                 if(s[i+2] == -0x58/*0xa8u*/)
 | |
|                 {
 | |
|                     fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('L'); prev = i+3; i += 2;
 | |
|                 }
 | |
|                 else if(s[i+2] == -0x57/*0xa9u*/)
 | |
|                 {
 | |
|                     fwrite(s+prev, 1, i-prev, stdout); putchar('\\'); putchar('P'); prev = i+3; i += 2;
 | |
|                 }
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     fwrite(s + prev, 1, len - prev, stdout);
 | |
| }
 | |
| 
 | |
| #pragma clang diagnostic pop
 | |
| #pragma GCC diagnostic pop
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| #   pragma warning(pop)
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #endif /* _C4_YML_DETAIL_PARSER_DBG_HPP_ */
 | 
