mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-16 13:35:45 -04:00
dep: Add rapidyaml
This commit is contained in:
221
dep/rapidyaml/src/c4/base64.cpp
Normal file
221
dep/rapidyaml/src/c4/base64.cpp
Normal file
@ -0,0 +1,221 @@
|
||||
#include "c4/base64.hpp"
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wchar-subscripts" // array subscript is of type 'char'
|
||||
# pragma clang diagnostic ignored "-Wold-style-cast"
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wchar-subscripts"
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
# pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#endif
|
||||
|
||||
namespace c4 {
|
||||
|
||||
namespace detail {
|
||||
|
||||
constexpr static const char base64_sextet_to_char_[64] = {
|
||||
/* 0/ 65*/ 'A', /* 1/ 66*/ 'B', /* 2/ 67*/ 'C', /* 3/ 68*/ 'D',
|
||||
/* 4/ 69*/ 'E', /* 5/ 70*/ 'F', /* 6/ 71*/ 'G', /* 7/ 72*/ 'H',
|
||||
/* 8/ 73*/ 'I', /* 9/ 74*/ 'J', /*10/ 75*/ 'K', /*11/ 74*/ 'L',
|
||||
/*12/ 77*/ 'M', /*13/ 78*/ 'N', /*14/ 79*/ 'O', /*15/ 78*/ 'P',
|
||||
/*16/ 81*/ 'Q', /*17/ 82*/ 'R', /*18/ 83*/ 'S', /*19/ 82*/ 'T',
|
||||
/*20/ 85*/ 'U', /*21/ 86*/ 'V', /*22/ 87*/ 'W', /*23/ 88*/ 'X',
|
||||
/*24/ 89*/ 'Y', /*25/ 90*/ 'Z', /*26/ 97*/ 'a', /*27/ 98*/ 'b',
|
||||
/*28/ 99*/ 'c', /*29/100*/ 'd', /*30/101*/ 'e', /*31/102*/ 'f',
|
||||
/*32/103*/ 'g', /*33/104*/ 'h', /*34/105*/ 'i', /*35/106*/ 'j',
|
||||
/*36/107*/ 'k', /*37/108*/ 'l', /*38/109*/ 'm', /*39/110*/ 'n',
|
||||
/*40/111*/ 'o', /*41/112*/ 'p', /*42/113*/ 'q', /*43/114*/ 'r',
|
||||
/*44/115*/ 's', /*45/116*/ 't', /*46/117*/ 'u', /*47/118*/ 'v',
|
||||
/*48/119*/ 'w', /*49/120*/ 'x', /*50/121*/ 'y', /*51/122*/ 'z',
|
||||
/*52/ 48*/ '0', /*53/ 49*/ '1', /*54/ 50*/ '2', /*55/ 51*/ '3',
|
||||
/*56/ 52*/ '4', /*57/ 53*/ '5', /*58/ 54*/ '6', /*59/ 55*/ '7',
|
||||
/*60/ 56*/ '8', /*61/ 57*/ '9', /*62/ 43*/ '+', /*63/ 47*/ '/',
|
||||
};
|
||||
|
||||
// https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
|
||||
constexpr static const char base64_char_to_sextet_[128] = {
|
||||
#define __ char(-1) // undefined below
|
||||
/* 0 NUL*/ __, /* 1 SOH*/ __, /* 2 STX*/ __, /* 3 ETX*/ __,
|
||||
/* 4 EOT*/ __, /* 5 ENQ*/ __, /* 6 ACK*/ __, /* 7 BEL*/ __,
|
||||
/* 8 BS */ __, /* 9 TAB*/ __, /* 10 LF */ __, /* 11 VT */ __,
|
||||
/* 12 FF */ __, /* 13 CR */ __, /* 14 SO */ __, /* 15 SI */ __,
|
||||
/* 16 DLE*/ __, /* 17 DC1*/ __, /* 18 DC2*/ __, /* 19 DC3*/ __,
|
||||
/* 20 DC4*/ __, /* 21 NAK*/ __, /* 22 SYN*/ __, /* 23 ETB*/ __,
|
||||
/* 24 CAN*/ __, /* 25 EM */ __, /* 26 SUB*/ __, /* 27 ESC*/ __,
|
||||
/* 28 FS */ __, /* 29 GS */ __, /* 30 RS */ __, /* 31 US */ __,
|
||||
/* 32 SPC*/ __, /* 33 ! */ __, /* 34 " */ __, /* 35 # */ __,
|
||||
/* 36 $ */ __, /* 37 % */ __, /* 38 & */ __, /* 39 ' */ __,
|
||||
/* 40 ( */ __, /* 41 ) */ __, /* 42 * */ __, /* 43 + */ 62,
|
||||
/* 44 , */ __, /* 45 - */ __, /* 46 . */ __, /* 47 / */ 63,
|
||||
/* 48 0 */ 52, /* 49 1 */ 53, /* 50 2 */ 54, /* 51 3 */ 55,
|
||||
/* 52 4 */ 56, /* 53 5 */ 57, /* 54 6 */ 58, /* 55 7 */ 59,
|
||||
/* 56 8 */ 60, /* 57 9 */ 61, /* 58 : */ __, /* 59 ; */ __,
|
||||
/* 60 < */ __, /* 61 = */ __, /* 62 > */ __, /* 63 ? */ __,
|
||||
/* 64 @ */ __, /* 65 A */ 0, /* 66 B */ 1, /* 67 C */ 2,
|
||||
/* 68 D */ 3, /* 69 E */ 4, /* 70 F */ 5, /* 71 G */ 6,
|
||||
/* 72 H */ 7, /* 73 I */ 8, /* 74 J */ 9, /* 75 K */ 10,
|
||||
/* 76 L */ 11, /* 77 M */ 12, /* 78 N */ 13, /* 79 O */ 14,
|
||||
/* 80 P */ 15, /* 81 Q */ 16, /* 82 R */ 17, /* 83 S */ 18,
|
||||
/* 84 T */ 19, /* 85 U */ 20, /* 86 V */ 21, /* 87 W */ 22,
|
||||
/* 88 X */ 23, /* 89 Y */ 24, /* 90 Z */ 25, /* 91 [ */ __,
|
||||
/* 92 \ */ __, /* 93 ] */ __, /* 94 ^ */ __, /* 95 _ */ __,
|
||||
/* 96 ` */ __, /* 97 a */ 26, /* 98 b */ 27, /* 99 c */ 28,
|
||||
/*100 d */ 29, /*101 e */ 30, /*102 f */ 31, /*103 g */ 32,
|
||||
/*104 h */ 33, /*105 i */ 34, /*106 j */ 35, /*107 k */ 36,
|
||||
/*108 l */ 37, /*109 m */ 38, /*110 n */ 39, /*111 o */ 40,
|
||||
/*112 p */ 41, /*113 q */ 42, /*114 r */ 43, /*115 s */ 44,
|
||||
/*116 t */ 45, /*117 u */ 46, /*118 v */ 47, /*119 w */ 48,
|
||||
/*120 x */ 49, /*121 y */ 50, /*122 z */ 51, /*123 { */ __,
|
||||
/*124 | */ __, /*125 } */ __, /*126 ~ */ __, /*127 DEL*/ __,
|
||||
#undef __
|
||||
};
|
||||
|
||||
#ifndef NDEBUG
|
||||
void base64_test_tables()
|
||||
{
|
||||
for(size_t i = 0; i < C4_COUNTOF(detail::base64_sextet_to_char_); ++i)
|
||||
{
|
||||
char s2c = base64_sextet_to_char_[i];
|
||||
char c2s = base64_char_to_sextet_[(int)s2c];
|
||||
C4_CHECK((size_t)c2s == i);
|
||||
}
|
||||
for(size_t i = 0; i < C4_COUNTOF(detail::base64_char_to_sextet_); ++i)
|
||||
{
|
||||
char c2s = base64_char_to_sextet_[i];
|
||||
if(c2s == char(-1))
|
||||
continue;
|
||||
char s2c = base64_sextet_to_char_[(int)c2s];
|
||||
C4_CHECK((size_t)s2c == i);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} // namespace detail
|
||||
|
||||
|
||||
bool base64_valid(csubstr encoded)
|
||||
{
|
||||
if(encoded.len & 3u) // (encoded.len % 4u)
|
||||
return false;
|
||||
for(const char c : encoded)
|
||||
{
|
||||
if(c < 0/* || c >= 128*/)
|
||||
return false;
|
||||
if(c == '=')
|
||||
continue;
|
||||
if(detail::base64_char_to_sextet_[c] == char(-1))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
size_t base64_encode(substr buf, cblob data)
|
||||
{
|
||||
#define c4append_(c) { if(pos < buf.len) { buf.str[pos] = (c); } ++pos; }
|
||||
#define c4append_idx_(char_idx) \
|
||||
{\
|
||||
C4_XASSERT((char_idx) < sizeof(detail::base64_sextet_to_char_));\
|
||||
c4append_(detail::base64_sextet_to_char_[(char_idx)]);\
|
||||
}
|
||||
size_t rem, pos = 0;
|
||||
constexpr const uint32_t sextet_mask = uint32_t(1 << 6) - 1;
|
||||
const unsigned char *C4_RESTRICT d = (const unsigned char *) data.buf; // cast to unsigned to avoid wrapping high-bits
|
||||
for(rem = data.len; rem >= 3; rem -= 3, d += 3)
|
||||
{
|
||||
const uint32_t val = ((uint32_t(d[0]) << 16) | (uint32_t(d[1]) << 8) | (uint32_t(d[2])));
|
||||
c4append_idx_((val >> 18) & sextet_mask);
|
||||
c4append_idx_((val >> 12) & sextet_mask);
|
||||
c4append_idx_((val >> 6) & sextet_mask);
|
||||
c4append_idx_((val ) & sextet_mask);
|
||||
}
|
||||
C4_ASSERT(rem < 3);
|
||||
if(rem == 2)
|
||||
{
|
||||
const uint32_t val = ((uint32_t(d[0]) << 16) | (uint32_t(d[1]) << 8));
|
||||
c4append_idx_((val >> 18) & sextet_mask);
|
||||
c4append_idx_((val >> 12) & sextet_mask);
|
||||
c4append_idx_((val >> 6) & sextet_mask);
|
||||
c4append_('=');
|
||||
}
|
||||
else if(rem == 1)
|
||||
{
|
||||
const uint32_t val = ((uint32_t(d[0]) << 16));
|
||||
c4append_idx_((val >> 18) & sextet_mask);
|
||||
c4append_idx_((val >> 12) & sextet_mask);
|
||||
c4append_('=');
|
||||
c4append_('=');
|
||||
}
|
||||
return pos;
|
||||
|
||||
#undef c4append_
|
||||
#undef c4append_idx_
|
||||
}
|
||||
|
||||
|
||||
size_t base64_decode(csubstr encoded, blob data)
|
||||
{
|
||||
#define c4append_(c) { if(wpos < data.len) { data.buf[wpos] = static_cast<c4::byte>(c); } ++wpos; }
|
||||
#define c4appendval_(c, shift)\
|
||||
{\
|
||||
C4_XASSERT(c >= 0);\
|
||||
C4_XASSERT(size_t(c) < sizeof(detail::base64_char_to_sextet_));\
|
||||
val |= static_cast<uint32_t>(detail::base64_char_to_sextet_[(c)]) << ((shift) * 6);\
|
||||
}
|
||||
C4_ASSERT(base64_valid(encoded));
|
||||
C4_CHECK((encoded.len & 3u) == 0);
|
||||
size_t wpos = 0; // the write position
|
||||
const char *C4_RESTRICT d = encoded.str;
|
||||
constexpr const uint32_t full_byte = 0xff;
|
||||
// process every quartet of input 6 bits --> triplet of output bytes
|
||||
for(size_t rpos = 0; rpos < encoded.len; rpos += 4, d += 4)
|
||||
{
|
||||
if(d[2] == '=' || d[3] == '=') // skip the last quartet if it is padded
|
||||
{
|
||||
C4_ASSERT(d + 4 == encoded.str + encoded.len);
|
||||
break;
|
||||
}
|
||||
uint32_t val = 0;
|
||||
c4appendval_(d[3], 0);
|
||||
c4appendval_(d[2], 1);
|
||||
c4appendval_(d[1], 2);
|
||||
c4appendval_(d[0], 3);
|
||||
c4append_((val >> (2 * 8)) & full_byte);
|
||||
c4append_((val >> (1 * 8)) & full_byte);
|
||||
c4append_((val ) & full_byte);
|
||||
}
|
||||
// deal with the last quartet when it is padded
|
||||
if(d == encoded.str + encoded.len)
|
||||
return wpos;
|
||||
if(d[2] == '=') // 2 padding chars
|
||||
{
|
||||
C4_ASSERT(d + 4 == encoded.str + encoded.len);
|
||||
C4_ASSERT(d[3] == '=');
|
||||
uint32_t val = 0;
|
||||
c4appendval_(d[1], 2);
|
||||
c4appendval_(d[0], 3);
|
||||
c4append_((val >> (2 * 8)) & full_byte);
|
||||
}
|
||||
else if(d[3] == '=') // 1 padding char
|
||||
{
|
||||
C4_ASSERT(d + 4 == encoded.str + encoded.len);
|
||||
uint32_t val = 0;
|
||||
c4appendval_(d[2], 1);
|
||||
c4appendval_(d[1], 2);
|
||||
c4appendval_(d[0], 3);
|
||||
c4append_((val >> (2 * 8)) & full_byte);
|
||||
c4append_((val >> (1 * 8)) & full_byte);
|
||||
}
|
||||
return wpos;
|
||||
#undef c4append_
|
||||
#undef c4appendval_
|
||||
}
|
||||
|
||||
} // namespace c4
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
229
dep/rapidyaml/src/c4/error.cpp
Normal file
229
dep/rapidyaml/src/c4/error.cpp
Normal file
@ -0,0 +1,229 @@
|
||||
#include "c4/error.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define C4_LOGF_ERR(...) fprintf(stderr, __VA_ARGS__); fflush(stderr)
|
||||
#define C4_LOGF_WARN(...) fprintf(stderr, __VA_ARGS__); fflush(stderr)
|
||||
#define C4_LOGP(msg, ...) printf(msg)
|
||||
|
||||
#if defined(C4_XBOX) || (defined(C4_WIN) && defined(C4_MSVC))
|
||||
# include "c4/windows.hpp"
|
||||
#elif defined(C4_PS4)
|
||||
# include <libdbg.h>
|
||||
#elif defined(C4_UNIX) || defined(C4_LINUX)
|
||||
# include <sys/stat.h>
|
||||
# include <cstring>
|
||||
# include <fcntl.h>
|
||||
#elif defined(C4_MACOS) || defined(C4_IOS)
|
||||
# include <assert.h>
|
||||
# include <stdbool.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/sysctl.h>
|
||||
#endif
|
||||
// the amalgamation tool is dumb and was omitting this include under MACOS.
|
||||
// So do it only once:
|
||||
#if defined(C4_UNIX) || defined(C4_LINUX) || defined(C4_MACOS) || defined(C4_IOS)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(C4_EXCEPTIONS_ENABLED) && defined(C4_ERROR_THROWS_EXCEPTION)
|
||||
# include <exception>
|
||||
#endif
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wformat-nonliteral"
|
||||
# pragma clang diagnostic ignored "-Wold-style-cast"
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
# pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
namespace c4 {
|
||||
|
||||
static error_flags s_error_flags = ON_ERROR_DEFAULTS;
|
||||
static error_callback_type s_error_callback = nullptr;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
error_flags get_error_flags()
|
||||
{
|
||||
return s_error_flags;
|
||||
}
|
||||
void set_error_flags(error_flags flags)
|
||||
{
|
||||
s_error_flags = flags;
|
||||
}
|
||||
|
||||
error_callback_type get_error_callback()
|
||||
{
|
||||
return s_error_callback;
|
||||
}
|
||||
/** Set the function which is called when an error occurs. */
|
||||
void set_error_callback(error_callback_type cb)
|
||||
{
|
||||
s_error_callback = cb;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void handle_error(srcloc where, const char *fmt, ...)
|
||||
{
|
||||
char buf[1024];
|
||||
size_t msglen = 0;
|
||||
if(s_error_flags & (ON_ERROR_LOG|ON_ERROR_CALLBACK))
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
int ilen = vsnprintf(buf, sizeof(buf), fmt, args); // ss.vprintf(fmt, args);
|
||||
va_end(args);
|
||||
msglen = ilen >= 0 && ilen < (int)sizeof(buf) ? static_cast<size_t>(ilen) : sizeof(buf)-1;
|
||||
}
|
||||
|
||||
if(s_error_flags & ON_ERROR_LOG)
|
||||
{
|
||||
C4_LOGF_ERR("\n");
|
||||
#if defined(C4_ERROR_SHOWS_FILELINE) && defined(C4_ERROR_SHOWS_FUNC)
|
||||
C4_LOGF_ERR("%s:%d: ERROR: %s\n", where.file, where.line, buf);
|
||||
C4_LOGF_ERR("%s:%d: ERROR here: %s\n", where.file, where.line, where.func);
|
||||
#elif defined(C4_ERROR_SHOWS_FILELINE)
|
||||
C4_LOGF_ERR("%s:%d: ERROR: %s\n", where.file, where.line, buf);
|
||||
#elif ! defined(C4_ERROR_SHOWS_FUNC)
|
||||
C4_LOGF_ERR("ERROR: %s\n", buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
if(s_error_flags & ON_ERROR_CALLBACK)
|
||||
{
|
||||
if(s_error_callback)
|
||||
{
|
||||
s_error_callback(buf, msglen/*ss.c_strp(), ss.tellp()*/);
|
||||
}
|
||||
}
|
||||
|
||||
if(s_error_flags & ON_ERROR_ABORT)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
if(s_error_flags & ON_ERROR_THROW)
|
||||
{
|
||||
#if defined(C4_EXCEPTIONS_ENABLED) && defined(C4_ERROR_THROWS_EXCEPTION)
|
||||
throw Exception(buf);
|
||||
#else
|
||||
abort();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void handle_warning(srcloc where, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[1024]; //sstream<c4::string> ss;
|
||||
va_start(args, fmt);
|
||||
vsnprintf(buf, sizeof(buf), fmt, args);
|
||||
va_end(args);
|
||||
C4_LOGF_WARN("\n");
|
||||
#if defined(C4_ERROR_SHOWS_FILELINE) && defined(C4_ERROR_SHOWS_FUNC)
|
||||
C4_LOGF_WARN("%s:%d: WARNING: %s\n", where.file, where.line, buf/*ss.c_strp()*/);
|
||||
C4_LOGF_WARN("%s:%d: WARNING: here: %s\n", where.file, where.line, where.func);
|
||||
#elif defined(C4_ERROR_SHOWS_FILELINE)
|
||||
C4_LOGF_WARN("%s:%d: WARNING: %s\n", where.file, where.line, buf/*ss.c_strp()*/);
|
||||
#elif ! defined(C4_ERROR_SHOWS_FUNC)
|
||||
C4_LOGF_WARN("WARNING: %s\n", buf/*ss.c_strp()*/);
|
||||
#endif
|
||||
//c4::log.flush();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
bool is_debugger_attached()
|
||||
{
|
||||
#if defined(C4_UNIX) || defined(C4_LINUX)
|
||||
static bool first_call = true;
|
||||
static bool first_call_result = false;
|
||||
if(first_call)
|
||||
{
|
||||
first_call = false;
|
||||
//! @see http://stackoverflow.com/questions/3596781/how-to-detect-if-the-current-process-is-being-run-by-gdb
|
||||
//! (this answer: http://stackoverflow.com/a/24969863/3968589 )
|
||||
char buf[1024] = "";
|
||||
|
||||
int status_fd = open("/proc/self/status", O_RDONLY);
|
||||
if (status_fd == -1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t num_read = ::read(status_fd, buf, sizeof(buf));
|
||||
|
||||
if (num_read > 0)
|
||||
{
|
||||
static const char TracerPid[] = "TracerPid:";
|
||||
char *tracer_pid;
|
||||
|
||||
if(num_read < 1024)
|
||||
{
|
||||
buf[num_read] = 0;
|
||||
}
|
||||
tracer_pid = strstr(buf, TracerPid);
|
||||
if (tracer_pid)
|
||||
{
|
||||
first_call_result = !!::atoi(tracer_pid + sizeof(TracerPid) - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return first_call_result;
|
||||
#elif defined(C4_PS4)
|
||||
return (sceDbgIsDebuggerAttached() != 0);
|
||||
#elif defined(C4_XBOX) || (defined(C4_WIN) && defined(C4_MSVC))
|
||||
return IsDebuggerPresent() != 0;
|
||||
#elif defined(C4_MACOS) || defined(C4_IOS)
|
||||
// https://stackoverflow.com/questions/2200277/detecting-debugger-on-mac-os-x
|
||||
// Returns true if the current process is being debugged (either
|
||||
// running under the debugger or has a debugger attached post facto).
|
||||
int junk;
|
||||
int mib[4];
|
||||
struct kinfo_proc info;
|
||||
size_t size;
|
||||
|
||||
// Initialize the flags so that, if sysctl fails for some bizarre
|
||||
// reason, we get a predictable result.
|
||||
|
||||
info.kp_proc.p_flag = 0;
|
||||
|
||||
// Initialize mib, which tells sysctl the info we want, in this case
|
||||
// we're looking for information about a specific process ID.
|
||||
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_PROC;
|
||||
mib[2] = KERN_PROC_PID;
|
||||
mib[3] = getpid();
|
||||
|
||||
// Call sysctl.
|
||||
|
||||
size = sizeof(info);
|
||||
junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
|
||||
assert(junk == 0);
|
||||
|
||||
// We're being debugged if the P_TRACED flag is set.
|
||||
return ((info.kp_proc.p_flag & P_TRACED) != 0);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
} // is_debugger_attached()
|
||||
|
||||
} // namespace c4
|
||||
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
60
dep/rapidyaml/src/c4/format.cpp
Normal file
60
dep/rapidyaml/src/c4/format.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
#include "c4/format.hpp"
|
||||
|
||||
#include <memory> // for std::align
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wformat-nonliteral"
|
||||
# pragma clang diagnostic ignored "-Wold-style-cast"
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
# pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#endif
|
||||
|
||||
namespace c4 {
|
||||
|
||||
|
||||
size_t to_chars(substr buf, fmt::const_raw_wrapper r)
|
||||
{
|
||||
void * vptr = buf.str;
|
||||
size_t space = buf.len;
|
||||
auto ptr = (decltype(buf.str)) std::align(r.alignment, r.len, vptr, space);
|
||||
if(ptr == nullptr)
|
||||
{
|
||||
// if it was not possible to align, return a conservative estimate
|
||||
// of the required space
|
||||
return r.alignment + r.len;
|
||||
}
|
||||
C4_CHECK(ptr >= buf.begin() && ptr <= buf.end());
|
||||
size_t sz = static_cast<size_t>(ptr - buf.str) + r.len;
|
||||
if(sz <= buf.len)
|
||||
{
|
||||
memcpy(ptr, r.buf, r.len);
|
||||
}
|
||||
return sz;
|
||||
}
|
||||
|
||||
|
||||
bool from_chars(csubstr buf, fmt::raw_wrapper *r)
|
||||
{
|
||||
C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wcast-qual")
|
||||
void * vptr = (void*)buf.str;
|
||||
C4_SUPPRESS_WARNING_GCC_POP
|
||||
size_t space = buf.len;
|
||||
auto ptr = (decltype(buf.str)) std::align(r->alignment, r->len, vptr, space);
|
||||
C4_CHECK(ptr != nullptr);
|
||||
C4_CHECK(ptr >= buf.begin() && ptr <= buf.end());
|
||||
//size_t dim = (ptr - buf.str) + r->len;
|
||||
memcpy(r->buf, ptr, r->len);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace c4
|
||||
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#elif defined(__GNUC__)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
16
dep/rapidyaml/src/c4/language.cpp
Normal file
16
dep/rapidyaml/src/c4/language.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include "c4/language.hpp"
|
||||
|
||||
namespace c4 {
|
||||
namespace detail {
|
||||
|
||||
#ifndef __GNUC__
|
||||
void use_char_pointer(char const volatile* v)
|
||||
{
|
||||
C4_UNUSED(v);
|
||||
}
|
||||
#else
|
||||
void foo() {} // to avoid empty file warning from the linker
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
} // namespace c4
|
32
dep/rapidyaml/src/c4/memory_util.cpp
Normal file
32
dep/rapidyaml/src/c4/memory_util.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include "c4/memory_util.hpp"
|
||||
#include "c4/error.hpp"
|
||||
|
||||
namespace c4 {
|
||||
|
||||
|
||||
/** Fills 'dest' with the first 'pattern_size' bytes at 'pattern', 'num_times'. */
|
||||
void mem_repeat(void* dest, void const* pattern, size_t pattern_size, size_t num_times)
|
||||
{
|
||||
if(C4_UNLIKELY(num_times == 0))
|
||||
return;
|
||||
C4_ASSERT( ! mem_overlaps(dest, pattern, num_times*pattern_size, pattern_size));
|
||||
char *begin = static_cast<char*>(dest);
|
||||
char *end = begin + num_times * pattern_size;
|
||||
// copy the pattern once
|
||||
::memcpy(begin, pattern, pattern_size);
|
||||
// now copy from dest to itself, doubling up every time
|
||||
size_t n = pattern_size;
|
||||
while(begin + 2*n < end)
|
||||
{
|
||||
::memcpy(begin + n, begin, n);
|
||||
n <<= 1; // double n
|
||||
}
|
||||
// copy the missing part
|
||||
if(begin + n < end)
|
||||
{
|
||||
::memcpy(begin + n, begin, static_cast<size_t>(end - (begin + n)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace c4
|
60
dep/rapidyaml/src/c4/utf.cpp
Normal file
60
dep/rapidyaml/src/c4/utf.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
#include "c4/utf.hpp"
|
||||
#include "c4/charconv.hpp"
|
||||
|
||||
namespace c4 {
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast")
|
||||
|
||||
size_t decode_code_point(uint8_t *C4_RESTRICT buf, size_t buflen, const uint32_t code)
|
||||
{
|
||||
C4_UNUSED(buflen);
|
||||
C4_ASSERT(buflen >= 4);
|
||||
if (code <= UINT32_C(0x7f))
|
||||
{
|
||||
buf[0] = (uint8_t)code;
|
||||
return 1u;
|
||||
}
|
||||
else if(code <= UINT32_C(0x7ff))
|
||||
{
|
||||
buf[0] = (uint8_t)(UINT32_C(0xc0) | (code >> 6)); /* 110xxxxx */
|
||||
buf[1] = (uint8_t)(UINT32_C(0x80) | (code & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
return 2u;
|
||||
}
|
||||
else if(code <= UINT32_C(0xffff))
|
||||
{
|
||||
buf[0] = (uint8_t)(UINT32_C(0xe0) | ((code >> 12))); /* 1110xxxx */
|
||||
buf[1] = (uint8_t)(UINT32_C(0x80) | ((code >> 6) & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
buf[2] = (uint8_t)(UINT32_C(0x80) | ((code ) & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
return 3u;
|
||||
}
|
||||
else if(code <= UINT32_C(0x10ffff))
|
||||
{
|
||||
buf[0] = (uint8_t)(UINT32_C(0xf0) | ((code >> 18))); /* 11110xxx */
|
||||
buf[1] = (uint8_t)(UINT32_C(0x80) | ((code >> 12) & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
buf[2] = (uint8_t)(UINT32_C(0x80) | ((code >> 6) & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
buf[3] = (uint8_t)(UINT32_C(0x80) | ((code ) & UINT32_C(0x3f))); /* 10xxxxxx */
|
||||
return 4u;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
substr decode_code_point(substr out, csubstr code_point)
|
||||
{
|
||||
C4_ASSERT(out.len >= 4);
|
||||
C4_ASSERT(!code_point.begins_with("U+"));
|
||||
C4_ASSERT(!code_point.begins_with("\\x"));
|
||||
C4_ASSERT(!code_point.begins_with("\\u"));
|
||||
C4_ASSERT(!code_point.begins_with("\\U"));
|
||||
C4_ASSERT(!code_point.begins_with('0'));
|
||||
C4_ASSERT(code_point.len <= 8);
|
||||
C4_ASSERT(code_point.len > 0);
|
||||
uint32_t code_point_val;
|
||||
C4_CHECK(read_hex(code_point, &code_point_val));
|
||||
size_t ret = decode_code_point((uint8_t*)out.str, out.len, code_point_val);
|
||||
C4_ASSERT(ret <= 4);
|
||||
return out.first(ret);
|
||||
}
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_POP
|
||||
|
||||
} // namespace c4
|
121
dep/rapidyaml/src/c4/yml/common.cpp
Normal file
121
dep/rapidyaml/src/c4/yml/common.cpp
Normal file
@ -0,0 +1,121 @@
|
||||
#include "c4/yml/common.hpp"
|
||||
|
||||
#ifndef RYML_NO_DEFAULT_CALLBACKS
|
||||
# include <stdlib.h>
|
||||
# include <stdio.h>
|
||||
#endif // RYML_NO_DEFAULT_CALLBACKS
|
||||
|
||||
namespace c4 {
|
||||
namespace yml {
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast")
|
||||
|
||||
namespace {
|
||||
Callbacks s_default_callbacks;
|
||||
} // anon namespace
|
||||
|
||||
#ifndef RYML_NO_DEFAULT_CALLBACKS
|
||||
void report_error_impl(const char* msg, size_t length, Location loc, FILE *f)
|
||||
{
|
||||
if(!f)
|
||||
f = stderr;
|
||||
if(loc)
|
||||
{
|
||||
if(!loc.name.empty())
|
||||
{
|
||||
fwrite(loc.name.str, 1, loc.name.len, f);
|
||||
fputc(':', f);
|
||||
}
|
||||
fprintf(f, "%zu:", loc.line);
|
||||
if(loc.col)
|
||||
fprintf(f, "%zu:", loc.col);
|
||||
if(loc.offset)
|
||||
fprintf(f, " (%zuB):", loc.offset);
|
||||
}
|
||||
fprintf(f, "%.*s\n", (int)length, msg);
|
||||
fflush(f);
|
||||
}
|
||||
|
||||
void error_impl(const char* msg, size_t length, Location loc, void * /*user_data*/)
|
||||
{
|
||||
report_error_impl(msg, length, loc, nullptr);
|
||||
::abort();
|
||||
}
|
||||
|
||||
void* allocate_impl(size_t length, void * /*hint*/, void * /*user_data*/)
|
||||
{
|
||||
void *mem = ::malloc(length);
|
||||
if(mem == nullptr)
|
||||
{
|
||||
const char msg[] = "could not allocate memory";
|
||||
error_impl(msg, sizeof(msg)-1, {}, nullptr);
|
||||
}
|
||||
return mem;
|
||||
}
|
||||
|
||||
void free_impl(void *mem, size_t /*length*/, void * /*user_data*/)
|
||||
{
|
||||
::free(mem);
|
||||
}
|
||||
#endif // RYML_NO_DEFAULT_CALLBACKS
|
||||
|
||||
|
||||
|
||||
Callbacks::Callbacks()
|
||||
:
|
||||
m_user_data(nullptr),
|
||||
#ifndef RYML_NO_DEFAULT_CALLBACKS
|
||||
m_allocate(allocate_impl),
|
||||
m_free(free_impl),
|
||||
m_error(error_impl)
|
||||
#else
|
||||
m_allocate(nullptr),
|
||||
m_free(nullptr),
|
||||
m_error(nullptr)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
Callbacks::Callbacks(void *user_data, pfn_allocate alloc_, pfn_free free_, pfn_error error_)
|
||||
:
|
||||
m_user_data(user_data),
|
||||
#ifndef RYML_NO_DEFAULT_CALLBACKS
|
||||
m_allocate(alloc_ ? alloc_ : allocate_impl),
|
||||
m_free(free_ ? free_ : free_impl),
|
||||
m_error(error_ ? error_ : error_impl)
|
||||
#else
|
||||
m_allocate(alloc_),
|
||||
m_free(free_),
|
||||
m_error(error_)
|
||||
#endif
|
||||
{
|
||||
C4_CHECK(m_allocate);
|
||||
C4_CHECK(m_free);
|
||||
C4_CHECK(m_error);
|
||||
}
|
||||
|
||||
|
||||
void set_callbacks(Callbacks const& c)
|
||||
{
|
||||
s_default_callbacks = c;
|
||||
}
|
||||
|
||||
Callbacks const& get_callbacks()
|
||||
{
|
||||
return s_default_callbacks;
|
||||
}
|
||||
|
||||
void reset_callbacks()
|
||||
{
|
||||
set_callbacks(Callbacks());
|
||||
}
|
||||
|
||||
void error(const char *msg, size_t msg_len, Location loc)
|
||||
{
|
||||
s_default_callbacks.m_error(msg, msg_len, loc, s_default_callbacks.m_user_data);
|
||||
}
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_POP
|
||||
|
||||
} // namespace yml
|
||||
} // namespace c4
|
30
dep/rapidyaml/src/c4/yml/node.cpp
Normal file
30
dep/rapidyaml/src/c4/yml/node.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include "c4/yml/node.hpp"
|
||||
|
||||
namespace c4 {
|
||||
namespace yml {
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
size_t NodeRef::set_key_serialized(c4::fmt::const_base64_wrapper w)
|
||||
{
|
||||
_apply_seed();
|
||||
csubstr encoded = this->to_arena(w);
|
||||
this->set_key(encoded);
|
||||
return encoded.len;
|
||||
}
|
||||
|
||||
size_t NodeRef::set_val_serialized(c4::fmt::const_base64_wrapper w)
|
||||
{
|
||||
_apply_seed();
|
||||
csubstr encoded = this->to_arena(w);
|
||||
this->set_val(encoded);
|
||||
return encoded.len;
|
||||
}
|
||||
|
||||
} // namespace yml
|
||||
} // namespace c4
|
5750
dep/rapidyaml/src/c4/yml/parse.cpp
Normal file
5750
dep/rapidyaml/src/c4/yml/parse.cpp
Normal file
File diff suppressed because it is too large
Load Diff
112
dep/rapidyaml/src/c4/yml/preprocess.cpp
Normal file
112
dep/rapidyaml/src/c4/yml/preprocess.cpp
Normal file
@ -0,0 +1,112 @@
|
||||
#include "c4/yml/preprocess.hpp"
|
||||
#include "c4/yml/detail/parser_dbg.hpp"
|
||||
|
||||
/** @file preprocess.hpp Functions for preprocessing YAML prior to parsing. */
|
||||
|
||||
namespace c4 {
|
||||
namespace yml {
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_WITH_PUSH("-Wold-style-cast")
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
namespace {
|
||||
C4_ALWAYS_INLINE bool _is_idchar(char c)
|
||||
{
|
||||
return (c >= 'a' && c <= 'z')
|
||||
|| (c >= 'A' && c <= 'Z')
|
||||
|| (c >= '0' && c <= '9')
|
||||
|| (c == '_' || c == '-' || c == '~' || c == '$');
|
||||
}
|
||||
|
||||
typedef enum { kReadPending = 0, kKeyPending = 1, kValPending = 2 } _ppstate;
|
||||
C4_ALWAYS_INLINE _ppstate _next(_ppstate s)
|
||||
{
|
||||
int n = (int)s + 1;
|
||||
return (_ppstate)(n <= (int)kValPending ? n : 0);
|
||||
}
|
||||
} // empty namespace
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
size_t preprocess_rxmap(csubstr s, substr buf)
|
||||
{
|
||||
detail::_SubstrWriter writer(buf);
|
||||
_ppstate state = kReadPending;
|
||||
size_t last = 0;
|
||||
|
||||
if(s.begins_with('{'))
|
||||
{
|
||||
RYML_CHECK(s.ends_with('}'));
|
||||
s = s.offs(1, 1);
|
||||
}
|
||||
|
||||
writer.append('{');
|
||||
|
||||
for(size_t i = 0; i < s.len; ++i)
|
||||
{
|
||||
const char curr = s[i];
|
||||
const char next = i+1 < s.len ? s[i+1] : '\0';
|
||||
|
||||
if(curr == '\'' || curr == '"')
|
||||
{
|
||||
csubstr ss = s.sub(i).pair_range_esc(curr, '\\');
|
||||
i += static_cast<size_t>(ss.end() - (s.str + i));
|
||||
state = _next(state);
|
||||
}
|
||||
else if(state == kReadPending && _is_idchar(curr))
|
||||
{
|
||||
state = _next(state);
|
||||
}
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case kKeyPending:
|
||||
{
|
||||
if(curr == ':' && next == ' ')
|
||||
{
|
||||
state = _next(state);
|
||||
}
|
||||
else if(curr == ',' && next == ' ')
|
||||
{
|
||||
writer.append(s.range(last, i));
|
||||
writer.append(": 1, ");
|
||||
last = i + 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kValPending:
|
||||
{
|
||||
if(curr == '[' || curr == '{' || curr == '(')
|
||||
{
|
||||
csubstr ss = s.sub(i).pair_range_nested(curr, '\\');
|
||||
i += static_cast<size_t>(ss.end() - (s.str + i));
|
||||
state = _next(state);
|
||||
}
|
||||
else if(curr == ',' && next == ' ')
|
||||
{
|
||||
state = _next(state);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// nothing to do
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
writer.append(s.sub(last));
|
||||
if(state == kKeyPending)
|
||||
writer.append(": 1");
|
||||
writer.append('}');
|
||||
|
||||
return writer.pos;
|
||||
}
|
||||
|
||||
C4_SUPPRESS_WARNING_GCC_CLANG_POP
|
||||
|
||||
} // namespace yml
|
||||
} // namespace c4
|
2184
dep/rapidyaml/src/c4/yml/tree.cpp
Normal file
2184
dep/rapidyaml/src/c4/yml/tree.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user