Merge pull request #393 from akheron/json_sprintf
Add json_sprintf and json_vsprintf
This commit is contained in:
commit
2863dde053
@ -496,6 +496,7 @@ if (NOT JANSSON_WITHOUT_TESTS)
|
|||||||
test_object
|
test_object
|
||||||
test_pack
|
test_pack
|
||||||
test_simple
|
test_simple
|
||||||
|
test_sprintf
|
||||||
test_unpack)
|
test_unpack)
|
||||||
|
|
||||||
# Doing arithmetic on void pointers is not allowed by Microsofts compiler
|
# Doing arithmetic on void pointers is not allowed by Microsofts compiler
|
||||||
|
@ -399,6 +399,16 @@ length-aware functions if you wish to embed null bytes in strings.
|
|||||||
|
|
||||||
.. versionadded:: 2.7
|
.. versionadded:: 2.7
|
||||||
|
|
||||||
|
.. function:: json_t *json_sprintf(const char *format, ...)
|
||||||
|
json_t *json_vsprintf(const char *format, va_list ap)
|
||||||
|
|
||||||
|
.. refcounting:: new
|
||||||
|
|
||||||
|
Construct a JSON string from a format string and varargs, just like
|
||||||
|
:func:`printf()`.
|
||||||
|
|
||||||
|
.. versionadded:: 2.11
|
||||||
|
|
||||||
|
|
||||||
Number
|
Number
|
||||||
======
|
======
|
||||||
|
@ -3,6 +3,8 @@ EXPORTS
|
|||||||
json_true
|
json_true
|
||||||
json_false
|
json_false
|
||||||
json_null
|
json_null
|
||||||
|
json_sprintf
|
||||||
|
json_vsprintf
|
||||||
json_string
|
json_string
|
||||||
json_stringn
|
json_stringn
|
||||||
json_string_nocheck
|
json_string_nocheck
|
||||||
|
@ -289,6 +289,11 @@ int json_unpack(json_t *root, const char *fmt, ...);
|
|||||||
int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...);
|
int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...);
|
||||||
int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap);
|
int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap);
|
||||||
|
|
||||||
|
/* sprintf */
|
||||||
|
|
||||||
|
json_t *json_sprintf(const char *fmt, ...);
|
||||||
|
json_t *json_vsprintf(const char *fmt, va_list ap);
|
||||||
|
|
||||||
|
|
||||||
/* equality */
|
/* equality */
|
||||||
|
|
||||||
|
34
src/value.c
34
src/value.c
@ -787,6 +787,40 @@ static json_t *json_string_copy(const json_t *string)
|
|||||||
return json_stringn_nocheck(s->value, s->length);
|
return json_stringn_nocheck(s->value, s->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json_t *json_vsprintf(const char *fmt, va_list ap) {
|
||||||
|
int length;
|
||||||
|
char *buf;
|
||||||
|
va_list aq;
|
||||||
|
va_copy(aq, ap);
|
||||||
|
|
||||||
|
length = vsnprintf(NULL, 0, fmt, ap);
|
||||||
|
if (length == 0)
|
||||||
|
return json_string("");
|
||||||
|
|
||||||
|
buf = jsonp_malloc(length + 1);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
vsnprintf(buf, length + 1, fmt, aq);
|
||||||
|
if (!utf8_check_string(buf, length)) {
|
||||||
|
jsonp_free(buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonp_stringn_nocheck_own(buf, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
json_t *json_sprintf(const char *fmt, ...) {
|
||||||
|
json_t *result;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
result = json_vsprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*** integer ***/
|
/*** integer ***/
|
||||||
|
|
||||||
|
3
test/.gitignore
vendored
3
test/.gitignore
vendored
@ -7,14 +7,15 @@ suites/api/test_dump
|
|||||||
suites/api/test_dump_callback
|
suites/api/test_dump_callback
|
||||||
suites/api/test_equal
|
suites/api/test_equal
|
||||||
suites/api/test_load
|
suites/api/test_load
|
||||||
|
suites/api/test_load_callback
|
||||||
suites/api/test_loadb
|
suites/api/test_loadb
|
||||||
suites/api/test_memory_funcs
|
suites/api/test_memory_funcs
|
||||||
suites/api/test_number
|
suites/api/test_number
|
||||||
suites/api/test_object
|
suites/api/test_object
|
||||||
suites/api/test_pack
|
suites/api/test_pack
|
||||||
suites/api/test_simple
|
suites/api/test_simple
|
||||||
|
suites/api/test_sprintf
|
||||||
suites/api/test_unpack
|
suites/api/test_unpack
|
||||||
suites/api/test_load_callback
|
|
||||||
run-suites.log
|
run-suites.log
|
||||||
run-suites.trs
|
run-suites.trs
|
||||||
test-suite.log
|
test-suite.log
|
||||||
|
@ -14,6 +14,7 @@ check_PROGRAMS = \
|
|||||||
test_object \
|
test_object \
|
||||||
test_pack \
|
test_pack \
|
||||||
test_simple \
|
test_simple \
|
||||||
|
test_sprintf \
|
||||||
test_unpack
|
test_unpack
|
||||||
|
|
||||||
test_array_SOURCES = test_array.c util.h
|
test_array_SOURCES = test_array.c util.h
|
||||||
@ -27,6 +28,7 @@ test_number_SOURCES = test_number.c util.h
|
|||||||
test_object_SOURCES = test_object.c util.h
|
test_object_SOURCES = test_object.c util.h
|
||||||
test_pack_SOURCES = test_pack.c util.h
|
test_pack_SOURCES = test_pack.c util.h
|
||||||
test_simple_SOURCES = test_simple.c util.h
|
test_simple_SOURCES = test_simple.c util.h
|
||||||
|
test_sprintf_SOURCES = test_sprintf.c util.h
|
||||||
test_unpack_SOURCES = test_unpack.c util.h
|
test_unpack_SOURCES = test_unpack.c util.h
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
|
AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
|
||||||
|
22
test/suites/api/test_sprintf.c
Normal file
22
test/suites/api/test_sprintf.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <jansson.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
static void test_sprintf() {
|
||||||
|
json_t *s = json_sprintf("foo bar %d", 42);
|
||||||
|
if (!s)
|
||||||
|
fail("json_sprintf returned NULL");
|
||||||
|
if (!json_is_string(s))
|
||||||
|
fail("json_sprintf didn't return a JSON string");
|
||||||
|
if (strcmp(json_string_value(s), "foo bar 42"))
|
||||||
|
fail("json_sprintf generated an unexpected string");
|
||||||
|
|
||||||
|
json_decref(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void run_tests()
|
||||||
|
{
|
||||||
|
test_sprintf();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user