Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/rapidyaml/src/c4/format.cpp
4260 views
1
#include "c4/format.hpp"
2
3
#include <memory> // for std::align
4
5
#ifdef __clang__
6
# pragma clang diagnostic push
7
# pragma clang diagnostic ignored "-Wformat-nonliteral"
8
# pragma clang diagnostic ignored "-Wold-style-cast"
9
#elif defined(__GNUC__)
10
# pragma GCC diagnostic push
11
# pragma GCC diagnostic ignored "-Wformat-nonliteral"
12
# pragma GCC diagnostic ignored "-Wold-style-cast"
13
#endif
14
15
namespace c4 {
16
17
18
size_t to_chars(substr buf, fmt::const_raw_wrapper r)
19
{
20
void * vptr = buf.str;
21
size_t space = buf.len;
22
auto ptr = (decltype(buf.str)) std::align(r.alignment, r.len, vptr, space);
23
if(ptr == nullptr)
24
{
25
// if it was not possible to align, return a conservative estimate
26
// of the required space
27
return r.alignment + r.len;
28
}
29
C4_CHECK(ptr >= buf.begin() && ptr <= buf.end());
30
size_t sz = static_cast<size_t>(ptr - buf.str) + r.len;
31
if(sz <= buf.len)
32
{
33
memcpy(ptr, r.buf, r.len);
34
}
35
return sz;
36
}
37
38
39
bool from_chars(csubstr buf, fmt::raw_wrapper *r)
40
{
41
C4_SUPPRESS_WARNING_GCC_WITH_PUSH("-Wcast-qual")
42
void * vptr = (void*)buf.str;
43
C4_SUPPRESS_WARNING_GCC_POP
44
size_t space = buf.len;
45
auto ptr = (decltype(buf.str)) std::align(r->alignment, r->len, vptr, space);
46
C4_CHECK(ptr != nullptr);
47
C4_CHECK(ptr >= buf.begin() && ptr <= buf.end());
48
//size_t dim = (ptr - buf.str) + r->len;
49
memcpy(r->buf, ptr, r->len);
50
return true;
51
}
52
53
54
} // namespace c4
55
56
#ifdef __clang__
57
# pragma clang diagnostic pop
58
#elif defined(__GNUC__)
59
# pragma GCC diagnostic pop
60
#endif
61
62