Dbg prints: fix char sign problem in armv4/armv5

This commit is contained in:
Joao Paulo Magalhaes
2025-10-21 17:45:57 +01:00
parent 9a77f9d7ae
commit ca353d26fa
3 changed files with 18 additions and 22 deletions

View File

@@ -589,6 +589,16 @@ public:
(buf) = nullptr; \
} while(false)
namespace detail {
template<int8_t signedval, uint8_t unsignedval>
struct _charconstant_t // is there a better way to do this?
: public std::conditional<std::is_signed<char>::value,
std::integral_constant<int8_t, static_cast<int8_t>(unsignedval)>,
std::integral_constant<uint8_t, unsignedval>>::type
{};
#define _RYML_CHCONST(signedval, unsignedval) ::c4::yml::detail::_charconstant_t<INT8_C(signedval), UINT8_C(unsignedval)>::value
} // namespace detail
inline csubstr _c4prc(const char &C4_RESTRICT c) // pass by reference!
{
switch(c)
@@ -604,6 +614,7 @@ inline csubstr _c4prc(const char &C4_RESTRICT c) // pass by reference!
default: return csubstr(&c, 1);
}
}
/// @endcond
C4_SUPPRESS_WARNING_GCC_POP

View File

@@ -125,27 +125,27 @@ inline C4_NO_INLINE void __c4presc(csubstr s, bool keep_newlines=false)
case '\v' : _dbg_dumper(s.range(prev, i)); _dbg_dumper("\\v"); prev = i+1; break;
case '\a' : _dbg_dumper(s.range(prev, i)); _dbg_dumper("\\a"); prev = i+1; break;
case '\x1b': _dbg_dumper(s.range(prev, i)); _dbg_dumper("\\x1b"); prev = i+1; break;
case -0x3e/*0xc2u*/:
case _RYML_CHCONST(-0x3e, 0xc2):
if(i+1 < s.len)
{
if(s.str[i+1] == -0x60/*0xa0u*/)
if(s.str[i+1] == _RYML_CHCONST(-0x60, 0xa0))
{
_dbg_dumper(s.range(prev, i)); _dbg_dumper("\\_"); prev = i+1;
}
else if(s.str[i+1] == -0x7b/*0x85u*/)
else if(s.str[i+1] == _RYML_CHCONST(-0x7b,0x85))
{
_dbg_dumper(s.range(prev, i)); _dbg_dumper("\\N"); prev = i+1;
}
}
break;
case -0x1e/*0xe2u*/:
if(i+2 < s.len && s.str[i+1] == -0x80/*0x80u*/)
case _RYML_CHCONST(-0x1e, 0xe2):
if(i+2 < s.len && s.str[i+1] == _RYML_CHCONST(-0x80,0x80))
{
if(s.str[i+2] == -0x58/*0xa8u*/)
if(s.str[i+2] == _RYML_CHCONST(-0x58,0xa8))
{
_dbg_dumper(s.range(prev, i)); _dbg_dumper("\\L"); prev = i+1;
}
else if(s.str[i+2] == -0x57/*0xa9u*/)
else if(s.str[i+2] == _RYML_CHCONST(-0x57,0xa9))
{
_dbg_dumper(s.range(prev, i)); _dbg_dumper("\\P"); prev = i+1;
}

View File

@@ -2592,21 +2592,6 @@ FilterResult ParseEngine<EventHandler>::filter_scalar_squoted_in_place(substr ds
#define _c4dbgfdq(...)
#endif
/// @cond dev
namespace detail {
// is there a better way to do this?
template<int8_t signedval, uint8_t unsignedval>
struct _charconstant_t
: public std::conditional<std::is_signed<char>::value,
std::integral_constant<int8_t, static_cast<int8_t>(unsignedval)>,
std::integral_constant<uint8_t, unsignedval>>::type
{};
#define _RYML_CHCONST(signedval, unsignedval) ::c4::yml::detail::_charconstant_t<INT8_C(signedval), UINT8_C(unsignedval)>::value
} // namespace detail
/// @endcond
template<class EventHandler>
template<class FilterProcessor>
void ParseEngine<EventHandler>::_filter_nl_dquoted(FilterProcessor &C4_RESTRICT proc)