Reduce the number of strlen calls in the jansson backend.
Test on my laptop (count of the instructions)
Before:
❯ valgrind --tool=callgrind ./bin/test_object
==3105045== Events : Ir
==3105045== Collected : 441453
After:
❯ valgrind --tool=callgrind ./bin/test_object
==3144451== Events : Ir
==3144451== Collected : 440597
Signed-off-by: Maxim Zhukov <mussitantesmortem@gmail.com>
This commit added functions working with fixed-size strings (non null-terminated also).
It's helpful for the following cases:
* getting key from substring without copying to separate buffer (better perfomance)
* using pure UTF-8 keys for the objets
* hack: set binary structs as the keys (see test_binary_keys)
added functions:
* json_object_getn
* json_object_setn
* json_object_setn_nocheck
* json_object_setn_new
* json_object_setn_new_nocheck
* json_object_deln
* json_object_iter_key_len
added iterators:
* json_object_keylen_foreach
* json_object_keylen_foreach_safe
Signed-off-by: Maxim Zhukov <mussitantesmortem@gmail.com>
The Sphinx-3.0 c:function:: directive requires the return type.
Sphinx-3.0 also adds function-like macro support to the c:macro::
directive, which Sphinx-1.x and Sphinx-2.x do not support, but it
is probably a good idea to keep compatibility with slightly older
Sphinx for now.
Use double-backtick quoting instead. It has the same effect
(because these links had nowhere to link to) but it does not
result in loud warnings about broken references by default with Sphinx-3.x.
The --default-symver linker option attaches a default version definition
(the SONAME) to every exported symbol. It is supported since at least
GNU binutils 2.22 in 2011 (older versions not tested).
With this version definition, newly-linked binaries that depend on the
jansson shared library will refer to its symbols in a versioned form,
preventing their references from being resolved to a symbol of the same
name exported by json-c or json-glib if those libraries appear in
dependency search order before jansson, which will usually result in
a crash. This is necessary because ELF symbol resolution normally uses
a single flat namespace, not a tree like Windows symbol resolution.
At least one symbol (json_object_iter_next()) is exported by all three
JSON libraries.
Linking with -Bsymbolic is not enough to have this effect in all cases,
because -Bsymbolic only affects symbol lookup within a shared object,
for example when parse_json() calls json_decref(). It does not affect
calls from external code into jansson, unless jansson was statically
linked into the external caller.
This change will also not prevent code that depends on json-c or
json-glib from finding jansson's symbols and crashing; to prevent
that, a corresponding change in json-c or json-glib would be needed.
Adding a symbol-version is a backwards-compatible change, but once
added, removing or changing the symbol-version would be an incompatible
change that requires a SONAME bump.
Resolves: https://github.com/akheron/jansson/issues/523
(when combined with an equivalent change to json-c).
Signed-off-by: Simon McVittie <smcv@collabora.com>
The function vsnprintf returns a negative value on error, e.g. on
an invalid format. It's best to return NULL in such a case.
Also avoid a signed integer overflow if vsnprintf returns INT_MAX.
This is undefined behaviour in C and has to be avoided.
A negative value is returned with a call like:
json_sprintf("%111111111111111s", "", "");
INT_MAX is returned with a call like:
json_sprintf("%647s%2147483000s", "", "");