enhanced json code
This commit is contained in:
		| @ -34,3 +34,9 @@ mio_t02_SOURCES = t02.c | |||||||
| mio_t02_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | mio_t02_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | ||||||
| mio_t02_LDFLAGS = $(LDFLAGS_LIB_COMMON) | mio_t02_LDFLAGS = $(LDFLAGS_LIB_COMMON) | ||||||
| mio_t02_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | mio_t02_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | ||||||
|  |  | ||||||
|  | bin_PROGRAMS += mio-t03 | ||||||
|  | mio_t03_SOURCES = t03.c | ||||||
|  | mio_t03_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | ||||||
|  | mio_t03_LDFLAGS = $(LDFLAGS_LIB_COMMON) | ||||||
|  | mio_t03_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | ||||||
|  | |||||||
| @ -88,7 +88,8 @@ PRE_UNINSTALL = : | |||||||
| POST_UNINSTALL = : | POST_UNINSTALL = : | ||||||
| build_triplet = @build@ | build_triplet = @build@ | ||||||
| host_triplet = @host@ | host_triplet = @host@ | ||||||
| bin_PROGRAMS = mio-execd$(EXEEXT) mio-t01$(EXEEXT) mio-t02$(EXEEXT) | bin_PROGRAMS = mio-execd$(EXEEXT) mio-t01$(EXEEXT) mio-t02$(EXEEXT) \ | ||||||
|  | 	mio-t03$(EXEEXT) | ||||||
| subdir = bin | subdir = bin | ||||||
| ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ||||||
| am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_sign.m4 \ | am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_sign.m4 \ | ||||||
| @ -133,6 +134,13 @@ mio_t02_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ | |||||||
| mio_t02_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ | mio_t02_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ | ||||||
| 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ | 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ | ||||||
| 	$(mio_t02_LDFLAGS) $(LDFLAGS) -o $@ | 	$(mio_t02_LDFLAGS) $(LDFLAGS) -o $@ | ||||||
|  | am_mio_t03_OBJECTS = mio_t03-t03.$(OBJEXT) | ||||||
|  | mio_t03_OBJECTS = $(am_mio_t03_OBJECTS) | ||||||
|  | mio_t03_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ | ||||||
|  | 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) | ||||||
|  | mio_t03_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ | ||||||
|  | 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ | ||||||
|  | 	$(mio_t03_LDFLAGS) $(LDFLAGS) -o $@ | ||||||
| AM_V_P = $(am__v_P_@AM_V@) | AM_V_P = $(am__v_P_@AM_V@) | ||||||
| am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) | am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) | ||||||
| am__v_P_0 = false | am__v_P_0 = false | ||||||
| @ -149,7 +157,8 @@ DEFAULT_INCLUDES = | |||||||
| depcomp = $(SHELL) $(top_srcdir)/ac/depcomp | depcomp = $(SHELL) $(top_srcdir)/ac/depcomp | ||||||
| am__maybe_remake_depfiles = depfiles | am__maybe_remake_depfiles = depfiles | ||||||
| am__depfiles_remade = ./$(DEPDIR)/mio_execd-execd.Po \ | am__depfiles_remade = ./$(DEPDIR)/mio_execd-execd.Po \ | ||||||
| 	./$(DEPDIR)/mio_t01-t01.Po ./$(DEPDIR)/mio_t02-t02.Po | 	./$(DEPDIR)/mio_t01-t01.Po ./$(DEPDIR)/mio_t02-t02.Po \ | ||||||
|  | 	./$(DEPDIR)/mio_t03-t03.Po | ||||||
| am__mv = mv -f | am__mv = mv -f | ||||||
| COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ | COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ | ||||||
| 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) | 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) | ||||||
| @ -169,9 +178,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) | |||||||
| am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) | am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) | ||||||
| am__v_CCLD_0 = @echo "  CCLD    " $@; | am__v_CCLD_0 = @echo "  CCLD    " $@; | ||||||
| am__v_CCLD_1 =  | am__v_CCLD_1 =  | ||||||
| SOURCES = $(mio_execd_SOURCES) $(mio_t01_SOURCES) $(mio_t02_SOURCES) | SOURCES = $(mio_execd_SOURCES) $(mio_t01_SOURCES) $(mio_t02_SOURCES) \ | ||||||
|  | 	$(mio_t03_SOURCES) | ||||||
| DIST_SOURCES = $(mio_execd_SOURCES) $(mio_t01_SOURCES) \ | DIST_SOURCES = $(mio_execd_SOURCES) $(mio_t01_SOURCES) \ | ||||||
| 	$(mio_t02_SOURCES) | 	$(mio_t02_SOURCES) $(mio_t03_SOURCES) | ||||||
| am__can_run_installinfo = \ | am__can_run_installinfo = \ | ||||||
|   case $$AM_UPDATE_INFO_DIR in \ |   case $$AM_UPDATE_INFO_DIR in \ | ||||||
|     n|no|NO) false;; \ |     n|no|NO) false;; \ | ||||||
| @ -373,6 +383,10 @@ mio_t02_SOURCES = t02.c | |||||||
| mio_t02_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | mio_t02_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | ||||||
| mio_t02_LDFLAGS = $(LDFLAGS_LIB_COMMON) | mio_t02_LDFLAGS = $(LDFLAGS_LIB_COMMON) | ||||||
| mio_t02_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | mio_t02_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | ||||||
|  | mio_t03_SOURCES = t03.c | ||||||
|  | mio_t03_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) | ||||||
|  | mio_t03_LDFLAGS = $(LDFLAGS_LIB_COMMON) | ||||||
|  | mio_t03_LDADD = $(LIBADD_LIB_COMMON) -lmio $(SSL_LIBS) $(SOCKET_LIBS) $(SENDFILE_LIBS) | ||||||
| all: all-am | all: all-am | ||||||
|  |  | ||||||
| .SUFFIXES: | .SUFFIXES: | ||||||
| @ -468,6 +482,10 @@ mio-t02$(EXEEXT): $(mio_t02_OBJECTS) $(mio_t02_DEPENDENCIES) $(EXTRA_mio_t02_DEP | |||||||
| 	@rm -f mio-t02$(EXEEXT) | 	@rm -f mio-t02$(EXEEXT) | ||||||
| 	$(AM_V_CCLD)$(mio_t02_LINK) $(mio_t02_OBJECTS) $(mio_t02_LDADD) $(LIBS) | 	$(AM_V_CCLD)$(mio_t02_LINK) $(mio_t02_OBJECTS) $(mio_t02_LDADD) $(LIBS) | ||||||
|  |  | ||||||
|  | mio-t03$(EXEEXT): $(mio_t03_OBJECTS) $(mio_t03_DEPENDENCIES) $(EXTRA_mio_t03_DEPENDENCIES)  | ||||||
|  | 	@rm -f mio-t03$(EXEEXT) | ||||||
|  | 	$(AM_V_CCLD)$(mio_t03_LINK) $(mio_t03_OBJECTS) $(mio_t03_LDADD) $(LIBS) | ||||||
|  |  | ||||||
| mostlyclean-compile: | mostlyclean-compile: | ||||||
| 	-rm -f *.$(OBJEXT) | 	-rm -f *.$(OBJEXT) | ||||||
|  |  | ||||||
| @ -477,6 +495,7 @@ distclean-compile: | |||||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_execd-execd.Po@am__quote@ # am--include-marker | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_execd-execd.Po@am__quote@ # am--include-marker | ||||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_t01-t01.Po@am__quote@ # am--include-marker | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_t01-t01.Po@am__quote@ # am--include-marker | ||||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_t02-t02.Po@am__quote@ # am--include-marker | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_t02-t02.Po@am__quote@ # am--include-marker | ||||||
|  | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio_t03-t03.Po@am__quote@ # am--include-marker | ||||||
|  |  | ||||||
| $(am__depfiles_remade): | $(am__depfiles_remade): | ||||||
| 	@$(MKDIR_P) $(@D) | 	@$(MKDIR_P) $(@D) | ||||||
| @ -550,6 +569,20 @@ mio_t02-t02.obj: t02.c | |||||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mio_t02_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mio_t02-t02.obj `if test -f 't02.c'; then $(CYGPATH_W) 't02.c'; else $(CYGPATH_W) '$(srcdir)/t02.c'; fi` | @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mio_t02_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mio_t02-t02.obj `if test -f 't02.c'; then $(CYGPATH_W) 't02.c'; else $(CYGPATH_W) '$(srcdir)/t02.c'; fi` | ||||||
|  |  | ||||||
|  | mio_t03-t03.o: t03.c | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mio_t03_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mio_t03-t03.o -MD -MP -MF $(DEPDIR)/mio_t03-t03.Tpo -c -o mio_t03-t03.o `test -f 't03.c' || echo '$(srcdir)/'`t03.c | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/mio_t03-t03.Tpo $(DEPDIR)/mio_t03-t03.Po | ||||||
|  | @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='t03.c' object='mio_t03-t03.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) $(mio_t03_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mio_t03-t03.o `test -f 't03.c' || echo '$(srcdir)/'`t03.c | ||||||
|  |  | ||||||
|  | mio_t03-t03.obj: t03.c | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mio_t03_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mio_t03-t03.obj -MD -MP -MF $(DEPDIR)/mio_t03-t03.Tpo -c -o mio_t03-t03.obj `if test -f 't03.c'; then $(CYGPATH_W) 't03.c'; else $(CYGPATH_W) '$(srcdir)/t03.c'; fi` | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/mio_t03-t03.Tpo $(DEPDIR)/mio_t03-t03.Po | ||||||
|  | @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='t03.c' object='mio_t03-t03.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) $(mio_t03_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mio_t03-t03.obj `if test -f 't03.c'; then $(CYGPATH_W) 't03.c'; else $(CYGPATH_W) '$(srcdir)/t03.c'; fi` | ||||||
|  |  | ||||||
| mostlyclean-libtool: | mostlyclean-libtool: | ||||||
| 	-rm -f *.lo | 	-rm -f *.lo | ||||||
|  |  | ||||||
| @ -686,6 +719,7 @@ distclean: distclean-am | |||||||
| 		-rm -f ./$(DEPDIR)/mio_execd-execd.Po | 		-rm -f ./$(DEPDIR)/mio_execd-execd.Po | ||||||
| 	-rm -f ./$(DEPDIR)/mio_t01-t01.Po | 	-rm -f ./$(DEPDIR)/mio_t01-t01.Po | ||||||
| 	-rm -f ./$(DEPDIR)/mio_t02-t02.Po | 	-rm -f ./$(DEPDIR)/mio_t02-t02.Po | ||||||
|  | 	-rm -f ./$(DEPDIR)/mio_t03-t03.Po | ||||||
| 	-rm -f Makefile | 	-rm -f Makefile | ||||||
| distclean-am: clean-am distclean-compile distclean-generic \ | distclean-am: clean-am distclean-compile distclean-generic \ | ||||||
| 	distclean-tags | 	distclean-tags | ||||||
| @ -734,6 +768,7 @@ maintainer-clean: maintainer-clean-am | |||||||
| 		-rm -f ./$(DEPDIR)/mio_execd-execd.Po | 		-rm -f ./$(DEPDIR)/mio_execd-execd.Po | ||||||
| 	-rm -f ./$(DEPDIR)/mio_t01-t01.Po | 	-rm -f ./$(DEPDIR)/mio_t01-t01.Po | ||||||
| 	-rm -f ./$(DEPDIR)/mio_t02-t02.Po | 	-rm -f ./$(DEPDIR)/mio_t02-t02.Po | ||||||
|  | 	-rm -f ./$(DEPDIR)/mio_t03-t03.Po | ||||||
| 	-rm -f Makefile | 	-rm -f Makefile | ||||||
| maintainer-clean-am: distclean-am maintainer-clean-generic | maintainer-clean-am: distclean-am maintainer-clean-generic | ||||||
|  |  | ||||||
|  | |||||||
| @ -109,6 +109,7 @@ static int push_state (mio_json_t* json, mio_json_state_t state) | |||||||
| 	if (MIO_UNLIKELY(!ss)) return -1; | 	if (MIO_UNLIKELY(!ss)) return -1; | ||||||
|  |  | ||||||
| 	ss->state = state; | 	ss->state = state; | ||||||
|  | 	ss->level = json->state_stack->level; /* copy from the parent */ | ||||||
| 	ss->next = json->state_stack; | 	ss->next = json->state_stack; | ||||||
| 	 | 	 | ||||||
| 	json->state_stack = ss; | 	json->state_stack = ss; | ||||||
| @ -156,10 +157,7 @@ static int invoke_data_inst (mio_json_t* json, mio_json_inst_t inst) | |||||||
| 		inst = MIO_JSON_INST_KEY; | 		inst = MIO_JSON_INST_KEY; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| ///// XXXXX | 	return json->instcb(json, inst, json->state_stack->level, &json->tok); | ||||||
| /////	if (json->instcb(json, inst, &json->tok) <= -1) return -1; |  | ||||||
| ///// |  | ||||||
| 	return 0; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static int handle_string_value_char (mio_json_t* json, mio_ooci_t c) | static int handle_string_value_char (mio_json_t* json, mio_ooci_t c) | ||||||
| @ -242,6 +240,7 @@ static int handle_string_value_char (mio_json_t* json, mio_ooci_t c) | |||||||
| 		} | 		} | ||||||
| 		else if (c == 'u') | 		else if (c == 'u') | ||||||
| 		{ | 		{ | ||||||
|  | 			/* TOOD: handle UTF-16 surrogate pair  U+1D11E ->  \uD834\uDD1E*/ | ||||||
| 			json->state_stack->u.sv.escaped = 4; | 			json->state_stack->u.sv.escaped = 4; | ||||||
| 			json->state_stack->u.sv.digit_count = 0; | 			json->state_stack->u.sv.digit_count = 0; | ||||||
| 			json->state_stack->u.sv.acc = 0; | 			json->state_stack->u.sv.acc = 0; | ||||||
| @ -439,25 +438,31 @@ static int handle_word_value_char (mio_json_t* json, mio_ooci_t c) | |||||||
|  |  | ||||||
| static int handle_start_char (mio_json_t* json, mio_ooci_t c) | static int handle_start_char (mio_json_t* json, mio_ooci_t c) | ||||||
| { | { | ||||||
|  | printf ("HANDLE START CHAR [%c]\n", c); | ||||||
| 	if (c == '[') | 	if (c == '[') | ||||||
| 	{ | 	{ | ||||||
| 		if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | 		if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | ||||||
| 		json->state_stack->u.ia.got_value = 0; | 		json->state_stack->u.ia.got_value = 0; | ||||||
| 		if (json->instcb(json, MIO_JSON_INST_START_ARRAY, MIO_NULL) <= -1) return -1; | 		if (json->instcb(json, MIO_JSON_INST_START_ARRAY, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
|  | 		json->state_stack->level++; | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
| 	else if (c == '{') | 	else if (c == '{') | ||||||
| 	{ | 	{ | ||||||
| 		if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | 		if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | ||||||
| 		json->state_stack->u.id.state = 0; | 		json->state_stack->u.id.state = 0; | ||||||
| 		if (json->instcb(json, MIO_JSON_INST_START_DIC, MIO_NULL) <= -1) return -1; | 		if (json->instcb(json, MIO_JSON_INST_START_DIC, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
|  | 		json->state_stack->level++; | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
|  | #if 0 | ||||||
|  | /* this check is not needed for screening in feed_json_data() */ | ||||||
| 	else if (mio_is_ooch_space(c))  | 	else if (mio_is_ooch_space(c))  | ||||||
| 	{ | 	{ | ||||||
| 		/* do nothing */ | 		/* do nothing */ | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
|  | #endif | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		mio_seterrbfmt (json->mio, MIO_EINVAL, "not starting with [ or { - %jc", (mio_ooch_t)c); | 		mio_seterrbfmt (json->mio, MIO_EINVAL, "not starting with [ or { - %jc", (mio_ooch_t)c); | ||||||
| @ -469,7 +474,7 @@ static int handle_char_in_array (mio_json_t* json, mio_ooci_t c) | |||||||
| { | { | ||||||
| 	if (c == ']') | 	if (c == ']') | ||||||
| 	{ | 	{ | ||||||
| 		if (json->instcb(json, MIO_JSON_INST_END_ARRAY, MIO_NULL) <= -1) return -1; | 		if (json->instcb(json, MIO_JSON_INST_END_ARRAY, json->state_stack->level - 1, MIO_NULL) <= -1) return -1; | ||||||
| 		pop_state (json); | 		pop_state (json); | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
| @ -527,14 +532,16 @@ static int handle_char_in_array (mio_json_t* json, mio_ooci_t c) | |||||||
| 		{ | 		{ | ||||||
| 			if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | 			if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | ||||||
| 			json->state_stack->u.ia.got_value = 0; | 			json->state_stack->u.ia.got_value = 0; | ||||||
| 			if (json->instcb(json, MIO_JSON_INST_START_ARRAY, MIO_NULL) <= -1) return -1; | 			if (json->instcb(json, MIO_JSON_INST_START_ARRAY, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
|  | 			json->state_stack->level++; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
| 		else if (c == '{') | 		else if (c == '{') | ||||||
| 		{ | 		{ | ||||||
| 			if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | 			if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | ||||||
| 			json->state_stack->u.id.state = 0; | 			json->state_stack->u.id.state = 0; | ||||||
| 			if (json->instcb(json, MIO_JSON_INST_START_DIC, MIO_NULL) <= -1) return -1; | 			if (json->instcb(json, MIO_JSON_INST_START_DIC, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
|  | 			json->state_stack->level++; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @ -549,7 +556,7 @@ static int handle_char_in_dic (mio_json_t* json, mio_ooci_t c) | |||||||
| { | { | ||||||
| 	if (c == '}') | 	if (c == '}') | ||||||
| 	{ | 	{ | ||||||
| 		if (json->instcb(json, MIO_JSON_INST_END_DIC, MIO_NULL) <= -1) return -1; | 		if (json->instcb(json, MIO_JSON_INST_END_DIC, json->state_stack->level - 1, MIO_NULL) <= -1) return -1; | ||||||
| 		pop_state (json); | 		pop_state (json); | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
| @ -622,14 +629,16 @@ static int handle_char_in_dic (mio_json_t* json, mio_ooci_t c) | |||||||
| 		{ | 		{ | ||||||
| 			if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | 			if (push_state(json, MIO_JSON_STATE_IN_ARRAY) <= -1) return -1; | ||||||
| 			json->state_stack->u.ia.got_value = 0; | 			json->state_stack->u.ia.got_value = 0; | ||||||
| 			if (json->instcb(json, MIO_JSON_INST_START_ARRAY, MIO_NULL) <= -1) return -1; | 			json->state_stack->level++; | ||||||
|  | 			if (json->instcb(json, MIO_JSON_INST_START_ARRAY, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
| 		else if (c == '{') | 		else if (c == '{') | ||||||
| 		{ | 		{ | ||||||
| 			if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | 			if (push_state(json, MIO_JSON_STATE_IN_DIC) <= -1) return -1; | ||||||
| 			json->state_stack->u.id.state = 0; | 			json->state_stack->u.id.state = 0; | ||||||
| 			if (json->instcb(json, MIO_JSON_INST_START_DIC, MIO_NULL) <= -1) return -1; | 			json->state_stack->level++; | ||||||
|  | 			if (json->instcb(json, MIO_JSON_INST_START_DIC, json->state_stack->level, MIO_NULL) <= -1) return -1; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @ -704,10 +713,11 @@ start_over: | |||||||
|  |  | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
|  |  | ||||||
| static int feed_json_data (mio_json_t* json, const mio_bch_t* data, mio_oow_t len, mio_oow_t* xlen) | static int feed_json_data (mio_json_t* json, const mio_bch_t* data, mio_oow_t len, mio_oow_t* xlen, int stop_if_ever_completed) | ||||||
| { | { | ||||||
| 	const mio_bch_t* ptr; | 	const mio_bch_t* ptr; | ||||||
| 	const mio_bch_t* end; | 	const mio_bch_t* end; | ||||||
|  | 	int ever_completed = 0; | ||||||
|  |  | ||||||
| 	ptr = data; | 	ptr = data; | ||||||
| 	end = ptr + len; | 	end = ptr + len; | ||||||
| @ -715,12 +725,14 @@ static int feed_json_data (mio_json_t* json, const mio_bch_t* data, mio_oow_t le | |||||||
| 	while (ptr < end) | 	while (ptr < end) | ||||||
| 	{ | 	{ | ||||||
| 		mio_ooci_t c; | 		mio_ooci_t c; | ||||||
|  | 		const mio_bch_t* optr; | ||||||
|  |  | ||||||
| 	#if defined(MIO_OOCH_IS_UCH) | 	#if defined(MIO_OOCH_IS_UCH) | ||||||
| 		mio_ooch_t uc; | 		mio_ooch_t uc; | ||||||
| 		mio_oow_t bcslen; | 		mio_oow_t bcslen; | ||||||
| 		mio_oow_t n; | 		mio_oow_t n; | ||||||
|  |  | ||||||
|  | 		optr = ptr; | ||||||
| 		bcslen = end - ptr; | 		bcslen = end - ptr; | ||||||
| 		n = json->mio->_cmgr->bctouc(ptr, bcslen, &uc); | 		n = json->mio->_cmgr->bctouc(ptr, bcslen, &uc); | ||||||
| 		if (n == 0) | 		if (n == 0) | ||||||
| @ -739,15 +751,24 @@ static int feed_json_data (mio_json_t* json, const mio_bch_t* data, mio_oow_t le | |||||||
| 		ptr += n; | 		ptr += n; | ||||||
| 		c = uc; | 		c = uc; | ||||||
| 	#else | 	#else | ||||||
|  | 		optr = ptr; | ||||||
| 		c = *ptr++; | 		c = *ptr++; | ||||||
| 	#endif | 	#endif | ||||||
|  |  | ||||||
|  | 		if (json->state_stack->state == MIO_JSON_STATE_START && mio_is_ooch_space(c)) continue; /* skip white space */ | ||||||
|  | 		if (stop_if_ever_completed && ever_completed)  | ||||||
|  | 		{ | ||||||
|  | 			*xlen = optr - data; | ||||||
|  | 			return 2; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		/* handle a signle character */ | 		/* handle a signle character */ | ||||||
| 		if (handle_char(json, c) <= -1) goto oops; | 		if (handle_char(json, c) <= -1) goto oops; | ||||||
|  | 		if (json->state_stack->state == MIO_JSON_STATE_START) ever_completed = 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	*xlen = ptr - data; | 	*xlen = ptr - data; | ||||||
| 	return 1; | 	return (stop_if_ever_completed && ever_completed)? 2: 1; | ||||||
|  |  | ||||||
| oops: | oops: | ||||||
| 	/* TODO: compute the number of processed bytes so far and return it via a parameter??? */ | 	/* TODO: compute the number of processed bytes so far and return it via a parameter??? */ | ||||||
| @ -785,12 +806,17 @@ void mio_json_close (mio_json_t* json) | |||||||
| 	mio_freemem (json->mio, json); | 	mio_freemem (json->mio, json); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int do_nothing_on_inst  (mio_json_t* json, mio_json_inst_t inst, mio_oow_t level, const mio_oocs_t* str) | ||||||
|  | { | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| int mio_json_init (mio_json_t* json, mio_t* mio) | int mio_json_init (mio_json_t* json, mio_t* mio) | ||||||
| { | { | ||||||
| 	MIO_MEMSET (json, 0, MIO_SIZEOF(*json)); | 	MIO_MEMSET (json, 0, MIO_SIZEOF(*json)); | ||||||
|  |  | ||||||
| 	json->mio = mio; | 	json->mio = mio; | ||||||
|  | 	json->instcb = do_nothing_on_inst; | ||||||
| 	json->state_top.state = MIO_JSON_STATE_START; | 	json->state_top.state = MIO_JSON_STATE_START; | ||||||
| 	json->state_top.next = MIO_NULL; | 	json->state_top.next = MIO_NULL; | ||||||
| 	json->state_stack = &json->state_top; | 	json->state_stack = &json->state_top; | ||||||
| @ -809,20 +835,24 @@ void mio_json_fini (mio_json_t* json) | |||||||
| } | } | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
|  |  | ||||||
|  | void mio_json_setinstcb (mio_json_t* json, mio_json_instcb_t instcb) | ||||||
|  | { | ||||||
|  | 	json->instcb = instcb; | ||||||
|  | } | ||||||
|  |  | ||||||
| mio_json_state_t mio_json_getstate (mio_json_t* json) | mio_json_state_t mio_json_getstate (mio_json_t* json) | ||||||
| { | { | ||||||
| 	return json->state_stack->state; | 	return json->state_stack->state; | ||||||
| } | } | ||||||
|  |  | ||||||
| void mio_json_reset (mio_json_t* json) | void mio_json_resetstates (mio_json_t* json) | ||||||
| { | { | ||||||
| 	/* TODO: reset XXXXXXXXXXXXXXXXXXXXXXXXXXXxxxxx */ |  | ||||||
| 	pop_all_states (json); | 	pop_all_states (json); | ||||||
| 	MIO_ASSERT (json->mio, json->state_stack == &json->state_top); | 	MIO_ASSERT (json->mio, json->state_stack == &json->state_top); | ||||||
| 	json->state_stack->state = MIO_JSON_STATE_START; | 	json->state_stack->state = MIO_JSON_STATE_START; | ||||||
| } | } | ||||||
|  |  | ||||||
| int mio_json_feed (mio_json_t* json, const void* ptr, mio_oow_t len, mio_oow_t* xlen) | int mio_json_feed (mio_json_t* json, const void* ptr, mio_oow_t len, mio_oow_t* rem, int stop_if_ever_completed) | ||||||
| { | { | ||||||
| 	int x; | 	int x; | ||||||
| 	mio_oow_t total, ylen; | 	mio_oow_t total, ylen; | ||||||
| @ -832,13 +862,19 @@ int mio_json_feed (mio_json_t* json, const void* ptr, mio_oow_t len, mio_oow_t* | |||||||
| 	total = 0; | 	total = 0; | ||||||
| 	while (total < len) | 	while (total < len) | ||||||
| 	{ | 	{ | ||||||
| 		x = feed_json_data(json, &buf[total], len - total, &ylen); | 		x = feed_json_data(json, &buf[total], len - total, &ylen, stop_if_ever_completed); | ||||||
| 		if (x <= -1) return -1; | 		if (x <= -1) return -1; | ||||||
|  |  | ||||||
| 		total += ylen; | 		total += ylen; | ||||||
| 		if (x == 0) break; /* incomplete sequence encountered */ | 		if (x == 0) break; /* incomplete sequence encountered */ | ||||||
|  |  | ||||||
|  | 		if (stop_if_ever_completed && x >= 2)  | ||||||
|  | 		{ | ||||||
|  | 			*rem = len - total; | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	*xlen = total; | 	*rem = len - total; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -71,6 +71,7 @@ typedef enum mio_json_inst_t mio_json_inst_t; | |||||||
| typedef int (*mio_json_instcb_t) ( | typedef int (*mio_json_instcb_t) ( | ||||||
| 	mio_json_t*           json, | 	mio_json_t*           json, | ||||||
| 	mio_json_inst_t       inst, | 	mio_json_inst_t       inst, | ||||||
|  | 	mio_oow_t             level, | ||||||
| 	const mio_oocs_t*     str | 	const mio_oocs_t*     str | ||||||
| ); | ); | ||||||
|  |  | ||||||
| @ -79,6 +80,7 @@ typedef struct mio_json_state_node_t mio_json_state_node_t; | |||||||
| struct mio_json_state_node_t | struct mio_json_state_node_t | ||||||
| { | { | ||||||
| 	mio_json_state_t state; | 	mio_json_state_t state; | ||||||
|  | 	mio_oow_t level; | ||||||
| 	union | 	union | ||||||
| 	{ | 	{ | ||||||
| 		struct | 		struct | ||||||
| @ -151,19 +153,46 @@ MIO_EXPORT void mio_json_fini ( | |||||||
| 	mio_json_t* json | 	mio_json_t* json | ||||||
| ); | ); | ||||||
|  |  | ||||||
| MIO_EXPORT void mio_json_reset ( | #if defined(MIO_HAVE_INLINE) | ||||||
|  | static MIO_INLINE mio_t* mio_json_getmio (mio_json_t* json) { return json->mio; } | ||||||
|  | #else | ||||||
|  | #	define mio_json_getmio(json) (((mio_json_t*)(json))->mio) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | MIO_EXPORT void mio_json_setinstcb ( | ||||||
|  | 	mio_json_t*       json, | ||||||
|  | 	mio_json_instcb_t instcb | ||||||
|  | ); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | MIO_EXPORT mio_json_state_t mio_json_getstate ( | ||||||
| 	mio_json_t*   json | 	mio_json_t*   json | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | MIO_EXPORT void mio_json_resetstates ( | ||||||
|  | 	mio_json_t*   json | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * The mio_json_feed() function processes the raw data. | ||||||
|  |  * | ||||||
|  |  * If stop_if_ever_complted is 0, it returns 0 on success. If the value pointed to by | ||||||
|  |  * rem is greater 0 after the call, processing is not complete and more feeding is  | ||||||
|  |  * required. Incomplete feeding may be caused by incomplete byte sequences or incomplete | ||||||
|  |  * json object. | ||||||
|  |  * | ||||||
|  |  * If stop_if_ever_completed is non-zero, it returns 0 upon incomplet byte sequence or | ||||||
|  |  * incomplete json object. It returns 1 if it sees the first complete json object. It stores | ||||||
|  |  * the size of remaning raw data in the memory pointed to by rem. | ||||||
|  |  *  | ||||||
|  |  * The function returns -1 upon failure. | ||||||
|  |  */ | ||||||
| MIO_EXPORT int mio_json_feed ( | MIO_EXPORT int mio_json_feed ( | ||||||
| 	mio_json_t*   json, | 	mio_json_t*   json, | ||||||
| 	const void*   ptr, | 	const void*   ptr, | ||||||
| 	mio_oow_t     len, | 	mio_oow_t     len, | ||||||
| 	mio_oow_t*    xlen | 	mio_oow_t*    rem, | ||||||
| ); | 	int stop_if_ever_completed | ||||||
|  |  | ||||||
| MIO_EXPORT mio_json_state_t mio_json_getstate ( |  | ||||||
| 	mio_json_t* json |  | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user