Archived
1
0
Fork 0

gnu: Add sajson.

* gnu/packages/cpp.scm (sajson): New variable.

Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com>
This commit is contained in:
David Elsing 2022-10-13 21:04:12 +00:00 committed by Liliana Marie Prikler
parent c152902191
commit e34bf9b634
No known key found for this signature in database
GPG key ID: 442A84B8C70E2F87
2 changed files with 110 additions and 0 deletions

View file

@ -57,6 +57,7 @@
#:use-module (guix build-system gnu) #:use-module (guix build-system gnu)
#:use-module (guix build-system meson) #:use-module (guix build-system meson)
#:use-module (guix build-system python) #:use-module (guix build-system python)
#:use-module (guix build-system scons)
#:use-module (guix modules) #:use-module (guix modules)
#:use-module (guix gexp) #:use-module (guix gexp)
#:use-module (gnu packages) #:use-module (gnu packages)
@ -2036,3 +2037,67 @@ functions for the float and double types.")
computing Fast Fourier transformations. It supports multidimensional arrays, computing Fast Fourier transformations. It supports multidimensional arrays,
different floating point sizes and complex transformations.") different floating point sizes and complex transformations.")
(license license:bsd-3)))) (license license:bsd-3))))
(define-public sajson
(let ((commit "ec644013e34f9984a3cc9ba568cab97a391db9cd")
(revision "0"))
(package
(name "sajson")
(version (git-version "1.0" revision commit))
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/chadaustin/sajson")
(commit commit)))
(file-name (git-file-name name version))
(patches
(search-patches "sajson-build-with-gcc10.patch"))
(sha256
(base32
"0fjag27w7gvkc5pdhq3ad7yc09rabpzahndw1sgsg04ipznidmmq"))
(modules '((guix build utils)))
(snippet '(delete-file-recursively "third-party"))))
(build-system scons-build-system)
(arguments
(list
#:phases
#~(modify-phases %standard-phases
(add-after 'unpack 'disable-other-builds
(lambda _
(substitute* "SConstruct"
(("for name, tools in builds:")
"for name, tools in [('opt', [gcc, opt])]:"))))
(add-after 'unpack 'use-external-unittest-cpp
(lambda _
(substitute* "SConscript"
(("unittestpp_env\\.Library") "_dummy = ")
(("test_env = env.Clone\\(tools=\\[unittestpp, sajson\\]\\)")
(string-append
"test_env = env.Clone(tools=[sajson])\n"
"test_env.Append(CPPPATH='"
(search-input-directory %build-inputs "/include/UnitTest++")
"', LIBPATH='"
(string-append #$(this-package-native-input "unittest-cpp")
"/lib")
"', LIBS=['UnitTest++'])")))))
(replace 'build
(lambda* (#:key tests? #:allow-other-keys #:rest args)
(when tests?
(apply (assoc-ref %standard-phases 'build)
args))))
(replace 'check
(lambda* (#:key tests? #:allow-other-keys)
(when tests?
(invoke "build/opt/test")
(invoke "build/opt/test_unsorted"))))
(replace 'install
(lambda _
(let ((out (string-append #$output "/include")))
(install-file "include/sajson.h" out)
(install-file "include/sajson_ostream.h" out)))))))
(native-inputs (list unittest-cpp))
(home-page "https://github.com/chadaustin/sajson")
(synopsis "C++11 header-only, in-place JSON parser")
(description "@code{sajson} is an in-place JSON parser with support for
parsing with only a single memory allocation.")
(license license:expat))))

View file

@ -0,0 +1,45 @@
This patch is from the upstream pull request
https://github.com/chadaustin/sajson/pull/54.
It fixes linking with GCC.
diff --git a/include/sajson.h b/include/sajson.h
index 8b4e05a..1bd045b 100644
--- a/include/sajson.h
+++ b/include/sajson.h
@@ -138,12 +138,17 @@ constexpr inline size_t make_element(tag t, size_t value) {
// header. This trick courtesy of Rich Geldreich's Purple JSON parser.
template <typename unused = void>
struct globals_struct {
+ static const unsigned char parse_flags[256];
+};
+typedef globals_struct<> globals;
+
// clang-format off
// bit 0 (1) - set if: plain ASCII string character
// bit 1 (2) - set if: whitespace
// bit 4 (0x10) - set if: 0-9 e E .
- constexpr static const uint8_t parse_flags[256] = {
+ template <typename unused>
+ const unsigned char globals_struct<unused>::parse_flags[256] = {
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, // 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1
@@ -162,15 +167,13 @@ struct globals_struct {
};
// clang-format on
-};
-typedef globals_struct<> globals;
-constexpr inline bool is_plain_string_character(char c) {
+inline bool is_plain_string_character(char c) {
// return c >= 0x20 && c <= 0x7f && c != 0x22 && c != 0x5c;
return (globals::parse_flags[static_cast<unsigned char>(c)] & 1) != 0;
}
-constexpr inline bool is_whitespace(char c) {
+inline bool is_whitespace(char c) {
// return c == '\r' || c == '\n' || c == '\t' || c == ' ';
return (globals::parse_flags[static_cast<unsigned char>(c)] & 2) != 0;
}