diff --git a/src/Makefile.am b/src/Makefile.am index d87a562..c8827b2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ @CODE_COVERAGE_RULES@ lib_LTLIBRARIES=libblobpack.la -libblobpack_la_SOURCES=blob.c blob_field.c blob_json.c ujsondec.c ujsonenc.c utils.c +libblobpack_la_SOURCES=blob.c blob_field.c blob_json.c blob_ujson.c ujsondec.c ujsonenc.c utils.c libblobpack_la_CFLAGS=$(CODE_COVERAGE_CFLAGS) -std=gnu99 -Wall -Werror diff --git a/src/Makefile.in b/src/Makefile.in index f95265f..19dd51c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -123,8 +123,8 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libblobpack_la_LIBADD = am_libblobpack_la_OBJECTS = libblobpack_la-blob.lo \ libblobpack_la-blob_field.lo libblobpack_la-blob_json.lo \ - libblobpack_la-ujsondec.lo libblobpack_la-ujsonenc.lo \ - libblobpack_la-utils.lo + libblobpack_la-blob_ujson.lo libblobpack_la-ujsondec.lo \ + libblobpack_la-ujsonenc.lo libblobpack_la-utils.lo libblobpack_la_OBJECTS = $(am_libblobpack_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -319,7 +319,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libblobpack.la -libblobpack_la_SOURCES = blob.c blob_field.c blob_json.c ujsondec.c ujsonenc.c utils.c +libblobpack_la_SOURCES = blob.c blob_field.c blob_json.c blob_ujson.c ujsondec.c ujsonenc.c utils.c libblobpack_la_CFLAGS = $(CODE_COVERAGE_CFLAGS) -std=gnu99 -Wall -Werror all: all-am @@ -403,6 +403,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-blob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-blob_field.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-blob_json.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-blob_ujson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-ujsondec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-ujsonenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libblobpack_la-utils.Plo@am__quote@ @@ -449,6 +450,13 @@ libblobpack_la-blob_json.lo: blob_json.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libblobpack_la_CFLAGS) $(CFLAGS) -c -o libblobpack_la-blob_json.lo `test -f 'blob_json.c' || echo '$(srcdir)/'`blob_json.c +libblobpack_la-blob_ujson.lo: blob_ujson.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libblobpack_la_CFLAGS) $(CFLAGS) -MT libblobpack_la-blob_ujson.lo -MD -MP -MF $(DEPDIR)/libblobpack_la-blob_ujson.Tpo -c -o libblobpack_la-blob_ujson.lo `test -f 'blob_ujson.c' || echo '$(srcdir)/'`blob_ujson.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libblobpack_la-blob_ujson.Tpo $(DEPDIR)/libblobpack_la-blob_ujson.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='blob_ujson.c' object='libblobpack_la-blob_ujson.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libblobpack_la_CFLAGS) $(CFLAGS) -c -o libblobpack_la-blob_ujson.lo `test -f 'blob_ujson.c' || echo '$(srcdir)/'`blob_ujson.c + libblobpack_la-ujsondec.lo: ujsondec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libblobpack_la_CFLAGS) $(CFLAGS) -MT libblobpack_la-ujsondec.lo -MD -MP -MF $(DEPDIR)/libblobpack_la-ujsondec.Tpo -c -o libblobpack_la-ujsondec.lo `test -f 'ujsondec.c' || echo '$(srcdir)/'`ujsondec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libblobpack_la-ujsondec.Tpo $(DEPDIR)/libblobpack_la-ujsondec.Plo diff --git a/src/blob_json.h b/src/blob_json.h index 88efff6..e207756 100644 --- a/src/blob_json.h +++ b/src/blob_json.h @@ -37,6 +37,8 @@ static inline void blob_dump_json(struct blob *self){ blob_field_dump_json(blob_ char *blob_field_to_json(struct blob_field *self); static inline char *blob_to_json(struct blob *self){ return blob_field_to_json(blob_head(self)); } +bool blob_init_from_json(struct blob *self, const char *json); + bool blob_put_json(struct blob *self, const char *json); bool blob_put_json_from_file(struct blob *self, const char *file); diff --git a/src/blob_ujson.c b/src/blob_ujson.c index 9356c79..4d78d0d 100644 --- a/src/blob_ujson.c +++ b/src/blob_ujson.c @@ -166,6 +166,23 @@ bool blob_put_json(struct blob *self, const char *json){ return true; } +bool blob_init_from_json(struct blob *self, const char *json){ + struct blob b; + blob_init(&b, 0, 0); + bool r = blob_put_json(&b, json); + if(!r) { + blob_free(&b); + return false; + } + blob_init(self, 0, 0); + struct blob_field *child; + blob_field_for_each_child(blob_field_first_child(blob_head(&b)), child){ + blob_put_attr(self, child); + } + blob_free(&b); + return true; +} + bool blob_put_json_from_file(struct blob *self, const char *file){ // this is a rather simplistic approach where we just load the whole file into memory and then parse the buffer. // there can probably be better ways where we parse data in place.. diff --git a/test/Makefile.am b/test/Makefile.am index ee46acc..8759a4b 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,9 +1,12 @@ @CODE_COVERAGE_RULES@ -check_PROGRAMS=random read-write +check_PROGRAMS=random read-write json random_SOURCES=random.c random_CFLAGS=$(CODE_COVERAGE_CFLAGS) -I../src/ -std=c99 random_LDFLAGS=$(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm read_write_SOURCES=read-write.c read_write_CFLAGS=$(CODE_COVERAGE_CFLAGS) -I../src/ -D_GNU_SOURCE -std=c99 read_write_LDFLAGS=$(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm +json_SOURCES=json.c +json_CFLAGS=$(CODE_COVERAGE_CFLAGS) -I../src/ -D_GNU_SOURCE -std=c99 +json_LDFLAGS=$(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm TESTS=$(check_PROGRAMS) diff --git a/test/Makefile.in b/test/Makefile.in index f6576b6..6462fa7 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -77,7 +77,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -check_PROGRAMS = random$(EXEEXT) read-write$(EXEEXT) +check_PROGRAMS = random$(EXEEXT) read-write$(EXEEXT) json$(EXEEXT) subdir = test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/config/depcomp $(top_srcdir)/config/test-driver @@ -91,13 +91,19 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -am_random_OBJECTS = random-random.$(OBJEXT) -random_OBJECTS = $(am_random_OBJECTS) -random_LDADD = $(LDADD) +am_json_OBJECTS = json-json.$(OBJEXT) +json_OBJECTS = $(am_json_OBJECTS) +json_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = +json_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(json_CFLAGS) $(CFLAGS) \ + $(json_LDFLAGS) $(LDFLAGS) -o $@ +am_random_OBJECTS = random-random.$(OBJEXT) +random_OBJECTS = $(am_random_OBJECTS) +random_LDADD = $(LDADD) random_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(random_CFLAGS) $(CFLAGS) \ $(random_LDFLAGS) $(LDFLAGS) -o $@ @@ -141,8 +147,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(random_SOURCES) $(read_write_SOURCES) -DIST_SOURCES = $(random_SOURCES) $(read_write_SOURCES) +SOURCES = $(json_SOURCES) $(random_SOURCES) $(read_write_SOURCES) +DIST_SOURCES = $(json_SOURCES) $(random_SOURCES) $(read_write_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -501,6 +507,9 @@ random_LDFLAGS = $(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm read_write_SOURCES = read-write.c read_write_CFLAGS = $(CODE_COVERAGE_CFLAGS) -I../src/ -D_GNU_SOURCE -std=c99 read_write_LDFLAGS = $(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm +json_SOURCES = json.c +json_CFLAGS = $(CODE_COVERAGE_CFLAGS) -I../src/ -D_GNU_SOURCE -std=c99 +json_LDFLAGS = $(CODE_COVERAGE_LDFLAGS) -L../src/.libs/ -lblobpack -lm TESTS = $(check_PROGRAMS) all: all-am @@ -546,6 +555,10 @@ clean-checkPROGRAMS: echo " rm -f" $$list; \ rm -f $$list +json$(EXEEXT): $(json_OBJECTS) $(json_DEPENDENCIES) $(EXTRA_json_DEPENDENCIES) + @rm -f json$(EXEEXT) + $(AM_V_CCLD)$(json_LINK) $(json_OBJECTS) $(json_LDADD) $(LIBS) + random$(EXEEXT): $(random_OBJECTS) $(random_DEPENDENCIES) $(EXTRA_random_DEPENDENCIES) @rm -f random$(EXEEXT) $(AM_V_CCLD)$(random_LINK) $(random_OBJECTS) $(random_LDADD) $(LIBS) @@ -560,6 +573,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json-json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random-random.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_write-read-write.Po@am__quote@ @@ -584,6 +598,20 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< +json-json.o: json.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_CFLAGS) $(CFLAGS) -MT json-json.o -MD -MP -MF $(DEPDIR)/json-json.Tpo -c -o json-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json-json.Tpo $(DEPDIR)/json-json.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='json.c' object='json-json.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_CFLAGS) $(CFLAGS) -c -o json-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c + +json-json.obj: json.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_CFLAGS) $(CFLAGS) -MT json-json.obj -MD -MP -MF $(DEPDIR)/json-json.Tpo -c -o json-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/json-json.Tpo $(DEPDIR)/json-json.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='json.c' object='json-json.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_CFLAGS) $(CFLAGS) -c -o json-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi` + random-random.o: random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(random_CFLAGS) $(CFLAGS) -MT random-random.o -MD -MP -MF $(DEPDIR)/random-random.Tpo -c -o random-random.o `test -f 'random.c' || echo '$(srcdir)/'`random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/random-random.Tpo $(DEPDIR)/random-random.Po @@ -825,6 +853,13 @@ read-write.log: read-write$(EXEEXT) --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +json.log: json$(EXEEXT) + @p='json$(EXEEXT)'; \ + b='json'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ diff --git a/test/json.c b/test/json.c new file mode 100644 index 0000000..362dffb --- /dev/null +++ b/test/json.c @@ -0,0 +1,50 @@ +#include "test-funcs.h" +#include +#include +#include +#include + +int main(){ + struct blob blob; + blob_init(&blob, 0, 0); + + blob_put_bool(&blob, true); + blob_put_string(&blob, "foo"); + blob_put_int(&blob, -13); + blob_put_real(&blob, M_PI); + + struct blob_field *f = blob_put_string(&blob, "copyme"); + blob_put_attr(&blob, f); + + blob_offset_t o = blob_open_table(&blob); + blob_put_string(&blob, "one"); + blob_put_int(&blob, 1); + blob_put_string(&blob, "two"); + blob_put_int(&blob, 2); + blob_put_string(&blob, "three"); + blob_put_int(&blob, 3); + blob_close_table(&blob, o); + + o = blob_open_array(&blob); + blob_put_int(&blob, 1); + blob_put_int(&blob, 2); + blob_put_int(&blob, 3); + blob_close_array(&blob, o); + + char *json = blob_to_json(&blob); + + TEST(strcmp("[1,\"foo\",243,3.141593e+00,\"copyme\",\"copyme\",{\"one\":1,\"two\":2,\"three\":3},[1,2,3]]", json) == 0); + + struct blob b2; + blob_init_from_json(&b2, json); + blob_dump_json(&b2); + char *json2 = blob_to_json(&b2); + + TEST(strcmp(json, json2) == 0); + + free(json); + free(json2); + + return 0; +} +