changing code to improve the compiler
This commit is contained in:
		| @ -64,6 +64,7 @@ libhcl_la_SOURCES = \ | ||||
| 	hcl-utl.h \ | ||||
| 	hcl-prv.h \ | ||||
| 	bigint.c \ | ||||
| 	cnode.c \ | ||||
| 	comp.c \ | ||||
| 	debug.c \ | ||||
| 	decode.c \ | ||||
| @ -82,7 +83,7 @@ libhcl_la_SOURCES = \ | ||||
| 	prim.c \ | ||||
| 	print.c \ | ||||
| 	rbt.c \ | ||||
| 	read.c \ | ||||
| 	read2.c \ | ||||
| 	sym.c \ | ||||
| 	utf8.c \ | ||||
| 	utl.c \ | ||||
|  | ||||
| @ -150,14 +150,14 @@ am__DEPENDENCIES_1 = | ||||
| am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ | ||||
| 	$(am__DEPENDENCIES_3) $(am__DEPENDENCIES_4) | ||||
| libhcl_la_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__append_6) | ||||
| am_libhcl_la_OBJECTS = libhcl_la-bigint.lo libhcl_la-comp.lo \ | ||||
| 	libhcl_la-debug.lo libhcl_la-decode.lo libhcl_la-dic.lo \ | ||||
| 	libhcl_la-err.lo libhcl_la-exec.lo libhcl_la-fmt.lo \ | ||||
| 	libhcl_la-gc.lo libhcl_la-hcl.lo libhcl_la-heap.lo \ | ||||
| 	libhcl_la-number.lo libhcl_la-obj.lo libhcl_la-opt.lo \ | ||||
| 	libhcl_la-prim.lo libhcl_la-print.lo libhcl_la-rbt.lo \ | ||||
| 	libhcl_la-read.lo libhcl_la-sym.lo libhcl_la-utf8.lo \ | ||||
| 	libhcl_la-utl.lo libhcl_la-xma.lo | ||||
| am_libhcl_la_OBJECTS = libhcl_la-bigint.lo libhcl_la-cnode.lo \ | ||||
| 	libhcl_la-comp.lo libhcl_la-debug.lo libhcl_la-decode.lo \ | ||||
| 	libhcl_la-dic.lo libhcl_la-err.lo libhcl_la-exec.lo \ | ||||
| 	libhcl_la-fmt.lo libhcl_la-gc.lo libhcl_la-hcl.lo \ | ||||
| 	libhcl_la-heap.lo libhcl_la-number.lo libhcl_la-obj.lo \ | ||||
| 	libhcl_la-opt.lo libhcl_la-prim.lo libhcl_la-print.lo \ | ||||
| 	libhcl_la-rbt.lo libhcl_la-read2.lo libhcl_la-sym.lo \ | ||||
| 	libhcl_la-utf8.lo libhcl_la-utl.lo libhcl_la-xma.lo | ||||
| libhcl_la_OBJECTS = $(am_libhcl_la_OBJECTS) | ||||
| AM_V_lt = $(am__v_lt_@AM_V@) | ||||
| am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) | ||||
| @ -196,7 +196,8 @@ DEFAULT_INCLUDES = | ||||
| depcomp = $(SHELL) $(top_srcdir)/ac/depcomp | ||||
| am__maybe_remake_depfiles = depfiles | ||||
| am__depfiles_remade = ./$(DEPDIR)/libhcl_la-bigint.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-comp.Plo ./$(DEPDIR)/libhcl_la-debug.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-cnode.Plo ./$(DEPDIR)/libhcl_la-comp.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-debug.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-decode.Plo ./$(DEPDIR)/libhcl_la-dic.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-err.Plo ./$(DEPDIR)/libhcl_la-exec.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-fmt.Plo ./$(DEPDIR)/libhcl_la-gc.Plo \ | ||||
| @ -204,7 +205,7 @@ am__depfiles_remade = ./$(DEPDIR)/libhcl_la-bigint.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-number.Plo ./$(DEPDIR)/libhcl_la-obj.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-opt.Plo ./$(DEPDIR)/libhcl_la-prim.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-print.Plo ./$(DEPDIR)/libhcl_la-rbt.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-read.Plo ./$(DEPDIR)/libhcl_la-sym.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-read2.Plo ./$(DEPDIR)/libhcl_la-sym.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-utf8.Plo ./$(DEPDIR)/libhcl_la-utl.Plo \ | ||||
| 	./$(DEPDIR)/libhcl_la-xma.Plo \ | ||||
| 	./$(DEPDIR)/libhclx_la-cb-impl.Plo \ | ||||
| @ -436,6 +437,7 @@ libhcl_la_SOURCES = \ | ||||
| 	hcl-utl.h \ | ||||
| 	hcl-prv.h \ | ||||
| 	bigint.c \ | ||||
| 	cnode.c \ | ||||
| 	comp.c \ | ||||
| 	debug.c \ | ||||
| 	decode.c \ | ||||
| @ -454,7 +456,7 @@ libhcl_la_SOURCES = \ | ||||
| 	prim.c \ | ||||
| 	print.c \ | ||||
| 	rbt.c \ | ||||
| 	read.c \ | ||||
| 	read2.c \ | ||||
| 	sym.c \ | ||||
| 	utf8.c \ | ||||
| 	utl.c \ | ||||
| @ -572,6 +574,7 @@ distclean-compile: | ||||
| 	-rm -f *.tab.c | ||||
|  | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-bigint.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-cnode.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-comp.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-debug.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-decode.Plo@am__quote@ # am--include-marker | ||||
| @ -588,7 +591,7 @@ distclean-compile: | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-prim.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-print.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-rbt.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-read.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-read2.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-sym.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-utf8.Plo@am__quote@ # am--include-marker | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcl_la-utl.Plo@am__quote@ # am--include-marker | ||||
| @ -637,6 +640,13 @@ libhcl_la-bigint.lo: bigint.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) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcl_la-bigint.lo `test -f 'bigint.c' || echo '$(srcdir)/'`bigint.c | ||||
|  | ||||
| libhcl_la-cnode.lo: cnode.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcl_la-cnode.lo -MD -MP -MF $(DEPDIR)/libhcl_la-cnode.Tpo -c -o libhcl_la-cnode.lo `test -f 'cnode.c' || echo '$(srcdir)/'`cnode.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhcl_la-cnode.Tpo $(DEPDIR)/libhcl_la-cnode.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='cnode.c' object='libhcl_la-cnode.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) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcl_la-cnode.lo `test -f 'cnode.c' || echo '$(srcdir)/'`cnode.c | ||||
|  | ||||
| libhcl_la-comp.lo: comp.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcl_la-comp.lo -MD -MP -MF $(DEPDIR)/libhcl_la-comp.Tpo -c -o libhcl_la-comp.lo `test -f 'comp.c' || echo '$(srcdir)/'`comp.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhcl_la-comp.Tpo $(DEPDIR)/libhcl_la-comp.Plo | ||||
| @ -749,12 +759,12 @@ libhcl_la-rbt.lo: rbt.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) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcl_la-rbt.lo `test -f 'rbt.c' || echo '$(srcdir)/'`rbt.c | ||||
|  | ||||
| libhcl_la-read.lo: read.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcl_la-read.lo -MD -MP -MF $(DEPDIR)/libhcl_la-read.Tpo -c -o libhcl_la-read.lo `test -f 'read.c' || echo '$(srcdir)/'`read.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhcl_la-read.Tpo $(DEPDIR)/libhcl_la-read.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='read.c' object='libhcl_la-read.lo' libtool=yes @AMDEPBACKSLASH@ | ||||
| libhcl_la-read2.lo: read2.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcl_la-read2.lo -MD -MP -MF $(DEPDIR)/libhcl_la-read2.Tpo -c -o libhcl_la-read2.lo `test -f 'read2.c' || echo '$(srcdir)/'`read2.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhcl_la-read2.Tpo $(DEPDIR)/libhcl_la-read2.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='read2.c' object='libhcl_la-read2.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) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcl_la-read.lo `test -f 'read.c' || echo '$(srcdir)/'`read.c | ||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcl_la-read2.lo `test -f 'read2.c' || echo '$(srcdir)/'`read2.c | ||||
|  | ||||
| libhcl_la-sym.lo: sym.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcl_la-sym.lo -MD -MP -MF $(DEPDIR)/libhcl_la-sym.Tpo -c -o libhcl_la-sym.lo `test -f 'sym.c' || echo '$(srcdir)/'`sym.c | ||||
| @ -982,6 +992,7 @@ clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ | ||||
|  | ||||
| distclean: distclean-am | ||||
| 		-rm -f ./$(DEPDIR)/libhcl_la-bigint.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-cnode.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-comp.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-debug.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-decode.Plo | ||||
| @ -998,7 +1009,7 @@ distclean: distclean-am | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-prim.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-print.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-rbt.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-read.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-read2.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-sym.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-utf8.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-utl.Plo | ||||
| @ -1056,6 +1067,7 @@ installcheck-am: | ||||
|  | ||||
| maintainer-clean: maintainer-clean-am | ||||
| 		-rm -f ./$(DEPDIR)/libhcl_la-bigint.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-cnode.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-comp.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-debug.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-decode.Plo | ||||
| @ -1072,7 +1084,7 @@ maintainer-clean: maintainer-clean-am | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-prim.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-print.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-rbt.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-read.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-read2.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-sym.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-utf8.Plo | ||||
| 	-rm -f ./$(DEPDIR)/libhcl_la-utl.Plo | ||||
|  | ||||
| @ -24,6 +24,8 @@ | ||||
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include "hcl-prv.h" | ||||
|  | ||||
| static hcl_cnode_t* make_cnode (hcl_t* hcl, hcl_cnode_type_t type, const hcl_ioloc_t* loc, hcl_oow_t extra_space) | ||||
| { | ||||
| 	hcl_cnode_t* cnode; | ||||
| @ -59,20 +61,59 @@ hcl_cnode_t* hcl_makecnodecharlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| hcl_cnode_t* hcl_makecnodenumlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len) | ||||
| { | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_NUMLIT, loc, HCL_SIZEOF(*ptr) * (len + 1)); | ||||
| 	if (HCL_UNLIKELY(!c)) return HCL_NULL; | ||||
|  | ||||
| 	c->u.numlit.ptr = (hcl_ooch_t*)(c + 1); | ||||
| 	c->u.numlit.len = len; | ||||
| 	hcl_copy_oochars (c->u.numlit.ptr, ptr, len); | ||||
| 	c->u.numlit.ptr[len] = '\0'; | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
| hcl_cnode_t* hcl_makecnoderadnumlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len) | ||||
| { | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_RADNUMLIT, loc, HCL_SIZEOF(*ptr) * (len + 1)); | ||||
| 	if (HCL_UNLIKELY(!c)) return HCL_NULL; | ||||
|  | ||||
| 	c->u.radnumlit.ptr = (hcl_ooch_t*)(c + 1); | ||||
| 	c->u.radnumlit.len = len; | ||||
| 	hcl_copy_oochars (c->u.radnumlit.ptr, ptr, len); | ||||
| 	c->u.radnumlit.ptr[len] = '\0'; | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
| hcl_cnode_t* hcl_makecnodefpdeclit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len) | ||||
| { | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_FPDECLIT, loc, HCL_SIZEOF(*ptr) * (len + 1)); | ||||
| 	if (HCL_UNLIKELY(!c)) return HCL_NULL; | ||||
|  | ||||
| 	c->u.fpdeclit.ptr = (hcl_ooch_t*)(c + 1); | ||||
| 	c->u.fpdeclit.len = len; | ||||
| 	hcl_copy_oochars (c->u.fpdeclit.ptr, ptr, len); | ||||
| 	c->u.fpdeclit.ptr[len] = '\0'; | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
| hcl_cnode_t* hcl_makecnodestrlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len) | ||||
| { | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_STRLIT, loc, HCL_SIZEOF(*ptr) * (len + 1)); | ||||
| 	if (HCL_UNLIKELY(!c)) return HCL_NULL; | ||||
|  | ||||
| 	c->u.strlit.ptr = (hawk_ooch_t*)(c + 1); | ||||
| 	c->u.strlit.ptr = (hcl_ooch_t*)(c + 1); | ||||
| 	c->u.strlit.len = len; | ||||
| 	hawk_copy_bchars (c->u.strlit.ptr, c->u.strlit.len, ptr, len);	 | ||||
| 	hcl_copy_oochars (c->u.strlit.ptr, ptr, len); | ||||
| 	c->u.strlit.ptr[len] = '\0'; | ||||
| 	return c; | ||||
| } | ||||
|  | ||||
| hcl_cnode_t* hcl_makecnodeerrlit (hcl_t* hcl, const hcl_ioloc_t* loc, hcl_ooi_t v) | ||||
| { | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_ERRLIT, loc, HCL_SIZEOF(*ptr) * (len + 1)); | ||||
| 	hcl_cnode_t* c =  make_cnode(hcl, HCL_CNODE_ERRLIT, loc, 0); | ||||
| 	if (HCL_UNLIKELY(!c)) return HCL_NULL; | ||||
|  | ||||
| 	c->u.errlit.v = v; | ||||
|  | ||||
| @ -235,6 +235,21 @@ struct hcl_cnode_t | ||||
| 			hcl_oow_t len; | ||||
| 		} strlit; | ||||
| 		struct | ||||
| 		{ | ||||
| 			hcl_ooch_t* ptr; | ||||
| 			hcl_oow_t len; | ||||
| 		} numlit; | ||||
| 		struct | ||||
| 		{ | ||||
| 			hcl_ooch_t* ptr; | ||||
| 			hcl_oow_t len; | ||||
| 		} radnumlit; | ||||
| 		struct | ||||
| 		{ | ||||
| 			hcl_ooch_t* ptr; | ||||
| 			hcl_oow_t len; | ||||
| 		} fpdeclit; | ||||
| 		struct | ||||
| 		{ | ||||
| 			hcl_ooi_t v; | ||||
| 		} errlit; | ||||
| @ -1210,6 +1225,19 @@ int hcl_emitbyteinstruction ( | ||||
| 	hcl_oob_t  bc | ||||
| ); | ||||
|  | ||||
| /* ========================================================================= */ | ||||
| /* cnode.c                                                                   */ | ||||
| /* ========================================================================= */ | ||||
| hcl_cnode_t* hcl_makecnodenil (hcl_t* hcl, const hcl_ioloc_t* loc); | ||||
| hcl_cnode_t* hcl_makecnodetrue (hcl_t* hcl, const hcl_ioloc_t* loc); | ||||
| hcl_cnode_t* hcl_makecnodefalse (hcl_t* hcl, const hcl_ioloc_t* loc); | ||||
| hcl_cnode_t* hcl_makecnodecharlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t ch); | ||||
| hcl_cnode_t* hcl_makecnodestrlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len); | ||||
| hcl_cnode_t* hcl_makecnodenumlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len); | ||||
| hcl_cnode_t* hcl_makecnoderadnumlit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len); | ||||
| hcl_cnode_t* hcl_makecnodefpdeclit (hcl_t* hcl, const hcl_ioloc_t* loc, const hcl_ooch_t* ptr, hcl_oow_t len); | ||||
| hcl_cnode_t* hcl_makecnodeerrlit (hcl_t* hcl, const hcl_ioloc_t* loc, hcl_ooi_t v); | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										180
									
								
								hcl/lib/read.c
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								hcl/lib/read.c
									
									
									
									
									
								
							| @ -26,11 +26,9 @@ | ||||
|  | ||||
| #include "hcl-prv.h" | ||||
|  | ||||
|  | ||||
| static int begin_include (hcl_t* hcl); | ||||
| static int end_include (hcl_t* hcl); | ||||
|  | ||||
|  | ||||
| #define BUFFER_ALIGN 128 | ||||
| #define BALIT_BUFFER_ALIGN 128 | ||||
| #define SALIT_BUFFER_ALIGN 128 | ||||
| @ -45,7 +43,7 @@ static struct voca_t | ||||
| { | ||||
| 	hcl_oow_t len; | ||||
| 	hcl_ooch_t str[11]; | ||||
| } vocas[] =  | ||||
| } vocas[] = | ||||
| { | ||||
| 	{  8, { '#','i','n','c','l','u','d','e'                               } }, | ||||
| 	{ 11, { '#','\\','b','a','c','k','s','p','a','c','e'                  } }, | ||||
| @ -122,13 +120,13 @@ static int string_to_ooi (hcl_t* hcl, hcl_oocs_t* str, int radixed, hcl_ooi_t* n | ||||
| 	{ | ||||
| 		HCL_ASSERT (hcl, ptr < end); | ||||
|  | ||||
| 		if (*ptr != '#')  | ||||
| 		if (*ptr != '#') | ||||
| 		{ | ||||
| 			hcl_seterrbfmt (hcl, HCL_EINVAL, "radixed number not starting with # - %*.js", str->len, str->ptr); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		ptr++; /* skip '#' */ | ||||
| 		 | ||||
|  | ||||
| 		if (*ptr == 'x') base = 16; | ||||
| 		else if (*ptr == 'o') base = 8; | ||||
| 		else if (*ptr == 'b') base = 2; | ||||
| @ -147,7 +145,7 @@ static int string_to_ooi (hcl_t* hcl, hcl_oocs_t* str, int radixed, hcl_ooi_t* n | ||||
| 	while (ptr < end && (v = CHAR_TO_NUM(*ptr, base)) < base) | ||||
| 	{ | ||||
| 		value = value * base + v; | ||||
| 		if (value < old_value)  | ||||
| 		if (value < old_value) | ||||
| 		{ | ||||
| 			/* overflow must have occurred */ | ||||
| 			hcl_seterrbfmt (hcl, HCL_ERANGE, "number too big - %.*js", str->len, str->ptr); | ||||
| @ -214,13 +212,13 @@ static hcl_oop_t string_to_num (hcl_t* hcl, hcl_oocs_t* str, int radixed) | ||||
| 	{ | ||||
| 		HCL_ASSERT (hcl, ptr < end); | ||||
|  | ||||
| 		if (*ptr != '#')  | ||||
| 		if (*ptr != '#') | ||||
| 		{ | ||||
| 			hcl_seterrbfmt(hcl, HCL_EINVAL, "radixed number not starting with # - %.*js", str->len, str->ptr); | ||||
| 			return HCL_NULL; | ||||
| 		} | ||||
| 		ptr++; /* skip '#' */ | ||||
| 		 | ||||
|  | ||||
| 		if (*ptr == 'x') base = 16; | ||||
| 		else if (*ptr == 'o') base = 8; | ||||
| 		else if (*ptr == 'b') base = 2; | ||||
| @ -438,12 +436,12 @@ static int get_char (hcl_t* hcl) | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (hcl->c->curinp->b.state == -1)  | ||||
| 	if (hcl->c->curinp->b.state == -1) | ||||
| 	{ | ||||
| 		hcl->c->curinp->b.state = 0; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	else if (hcl->c->curinp->b.state == 1)  | ||||
| 	else if (hcl->c->curinp->b.state == 1) | ||||
| 	{ | ||||
| 		hcl->c->curinp->b.state = 0; | ||||
| 		goto return_eof; | ||||
| @ -463,7 +461,7 @@ static int get_char (hcl_t* hcl) | ||||
| 			hcl->c->lxc = hcl->c->curinp->lxc; | ||||
|  | ||||
| 			/* indicate that EOF has been read. lxc.c is also set to EOF. */ | ||||
| 			return 0;  | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		hcl->c->curinp->b.pos = 0; | ||||
| @ -476,9 +474,9 @@ static int get_char (hcl_t* hcl) | ||||
| 		 * to be read is still in the buffer (hcl->c->curinp->buf). | ||||
| 		 * hcl->cu->curinp->colm has been incremented when the previous | ||||
| 		 * character has been read. */ | ||||
| 		if (hcl->c->curinp->line > 1 && hcl->c->curinp->colm == 2 && hcl->c->curinp->nl != hcl->c->curinp->lxc.c)  | ||||
| 		if (hcl->c->curinp->line > 1 && hcl->c->curinp->colm == 2 && hcl->c->curinp->nl != hcl->c->curinp->lxc.c) | ||||
| 		{ | ||||
| 			/* most likely, it's the second character in '\r\n' or '\n\r'  | ||||
| 			/* most likely, it's the second character in '\r\n' or '\n\r' | ||||
| 			 * sequence. let's not update the line and column number. */ | ||||
| 			/*hcl->c->curinp->colm = 1;*/ | ||||
| 		} | ||||
| @ -516,13 +514,13 @@ static int skip_comment (hcl_t* hcl) | ||||
|  | ||||
| 	/* attempt to handle #! or ## */ | ||||
|  | ||||
| 	lc = hcl->c->lxc; /* save the last character */  | ||||
| 	lc = hcl->c->lxc; /* save the last character */ | ||||
| 	GET_CHAR_TO (hcl, c); /* read a following character */ | ||||
|  | ||||
| 	if (c == '!' || c == '#')  | ||||
| 	if (c == '!' || c == '#') | ||||
| 	{ | ||||
| 	single_line_comment: | ||||
| 		do  | ||||
| 		do | ||||
| 		{ | ||||
| 			GET_CHAR_TO (hcl, c); | ||||
| 			if (c == HCL_OOCI_EOF) | ||||
| @ -534,7 +532,7 @@ static int skip_comment (hcl_t* hcl) | ||||
| 				GET_CHAR (hcl); /* keep the first meaningful character in lxc */ | ||||
| 				break; | ||||
| 			} | ||||
| 		}  | ||||
| 		} | ||||
| 		while (1); | ||||
|  | ||||
| 		return 1; /* single line comment led by ## or #! or ; */ | ||||
| @ -574,9 +572,9 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 				/* more octal digits */ | ||||
| 				c_acc = c_acc * 8 + c - '0'; | ||||
| 				digit_count++; | ||||
| 				if (digit_count >= escaped)  | ||||
| 				if (digit_count >= escaped) | ||||
| 				{ | ||||
| 					/* should i limit the max to 0xFF/0377?  | ||||
| 					/* should i limit the max to 0xFF/0377? | ||||
| 					 * if (c_acc > 0377) c_acc = 0377;*/ | ||||
| 					ADD_TOKEN_CHAR (hcl, c_acc); | ||||
| 					escaped = 0; | ||||
| @ -595,7 +593,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 			{ | ||||
| 				c_acc = c_acc * 16 + c - '0'; | ||||
| 				digit_count++; | ||||
| 				if (digit_count >= escaped)  | ||||
| 				if (digit_count >= escaped) | ||||
| 				{ | ||||
| 					ADD_TOKEN_CHAR (hcl, c_acc); | ||||
| 					escaped = 0; | ||||
| @ -606,7 +604,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 			{ | ||||
| 				c_acc = c_acc * 16 + c - 'A' + 10; | ||||
| 				digit_count++; | ||||
| 				if (digit_count >= escaped)  | ||||
| 				if (digit_count >= escaped) | ||||
| 				{ | ||||
| 					ADD_TOKEN_CHAR (hcl, c_acc); | ||||
| 					escaped = 0; | ||||
| @ -617,7 +615,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 			{ | ||||
| 				c_acc = c_acc * 16 + c - 'a' + 10; | ||||
| 				digit_count++; | ||||
| 				if (digit_count >= escaped)  | ||||
| 				if (digit_count >= escaped) | ||||
| 				{ | ||||
| 					ADD_TOKEN_CHAR (hcl, c_acc); | ||||
| 					escaped = 0; | ||||
| @ -630,7 +628,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
|  | ||||
| 				rc = (escaped == 2)? 'x': | ||||
| 				     (escaped == 4)? 'u': 'U'; | ||||
| 				if (digit_count == 0)  | ||||
| 				if (digit_count == 0) | ||||
| 					ADD_TOKEN_CHAR (hcl, rc); | ||||
| 				else ADD_TOKEN_CHAR (hcl, c_acc); | ||||
|  | ||||
| @ -660,7 +658,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 			else if (c == 'r') c = '\r'; | ||||
| 			else if (c == 't') c = '\t'; | ||||
| 			else if (c == 'v') c = '\v'; | ||||
| 			else if (c >= '0' && c <= '7' && !regex)  | ||||
| 			else if (c >= '0' && c <= '7' && !regex) | ||||
| 			{ | ||||
| 				/* i don't support the octal notation for a regular expression. | ||||
| 				 * it conflicts with the backreference notation between \1 and \7 inclusive. */ | ||||
| @ -669,7 +667,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 				c_acc = c - '0'; | ||||
| 				continue; | ||||
| 			} | ||||
| 			else if (c == 'x')  | ||||
| 			else if (c == 'x') | ||||
| 			{ | ||||
| 				escaped = 2; | ||||
| 				digit_count = 0; | ||||
| @ -686,7 +684,7 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 			} | ||||
| 		#endif | ||||
| 		#if (HCL_SIZEOF_OOCH_T >= 4) | ||||
| 			else if (c == 'U')  | ||||
| 			else if (c == 'U') | ||||
| 			{ | ||||
| 				escaped = 8; | ||||
| 				digit_count = 0; | ||||
| @ -694,12 +692,12 @@ static int get_string (hcl_t* hcl, hcl_ooch_t end_char, hcl_ooch_t esc_char, int | ||||
| 				continue; | ||||
| 			} | ||||
| 		#endif | ||||
| 			else if (regex)  | ||||
| 			else if (regex) | ||||
| 			{ | ||||
| 				/* if the following character doesn't compose a proper | ||||
| 				 * escape sequence, keep the escape character.  | ||||
| 				 * an unhandled escape sequence can be handled  | ||||
| 				 * outside this function since the escape character  | ||||
| 				 * escape sequence, keep the escape character. | ||||
| 				 * an unhandled escape sequence can be handled | ||||
| 				 * outside this function since the escape character | ||||
| 				 * is preserved.*/ | ||||
| 				ADD_TOKEN_CHAR (hcl, esc_char); | ||||
| 			} | ||||
| @ -724,7 +722,7 @@ static int get_radix_number (hcl_t* hcl, hcl_ooci_t rc, int radix) | ||||
|  | ||||
| 	if (CHAR_TO_NUM(c, radix) >= radix) | ||||
| 	{ | ||||
| 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),  | ||||
| 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl), | ||||
| 			"no digit after radix specifier in %.*js", hcl->c->tok.name.len, hcl->c->tok.name.ptr); | ||||
| 		return -1; | ||||
| 	} | ||||
| @ -767,7 +765,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
|  | ||||
| 	/* | ||||
| 	 * #bBBBB binary | ||||
| 	 * #oOOOO octal  | ||||
| 	 * #oOOOO octal | ||||
| 	 * #xXXXX hexadecimal | ||||
| 	 * #eDDD   error | ||||
| 	 * #pHHH   smptr | ||||
| @ -824,7 +822,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
| 			{ | ||||
| 				ADD_TOKEN_CHAR (hcl, c); | ||||
| 				GET_CHAR_TO (hcl, c); | ||||
| 			}  | ||||
| 			} | ||||
| 			while (!is_delimiter(c)); | ||||
|  | ||||
| 			if (TOKEN_NAME_LEN(hcl) >= 4) | ||||
| @ -855,7 +853,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
|  | ||||
| 						c = c * 16 + CHAR_TO_NUM(hcl->c->tok.name.ptr[i], 16); /* don't care if it is for 'p' */ | ||||
| 					} | ||||
| 					 | ||||
|  | ||||
| 				} | ||||
| 			#if (HCL_SIZEOF_OOCH_T >= 2) | ||||
| 				else if (TOKEN_NAME_CHAR(hcl, 2) == 'u') | ||||
| @ -948,7 +946,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
| 			break; | ||||
|  | ||||
| 		default: | ||||
| 			if (is_delimiter(c))  | ||||
| 			if (is_delimiter(c)) | ||||
| 			{ | ||||
| 				/* EOF, whitespace, etc */ | ||||
| 				hcl_setsynerrbfmt (hcl, HCL_SYNERR_HASHLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl), | ||||
| @ -962,7 +960,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
| 			{ | ||||
| 				ADD_TOKEN_CHAR (hcl, c); | ||||
| 				GET_CHAR_TO (hcl, c); | ||||
| 			}  | ||||
| 			} | ||||
| 			while (!is_delimiter(c)); | ||||
|  | ||||
| 			if (does_token_name_match (hcl, VOCA_INCLUDE)) | ||||
| @ -986,7 +984,7 @@ static int get_sharp_token (hcl_t* hcl) | ||||
| static hcl_iotok_type_t classify_ident_token (hcl_t* hcl, const hcl_oocs_t* v) | ||||
| { | ||||
| 	hcl_oow_t i; | ||||
| 	struct  | ||||
| 	struct | ||||
| 	{ | ||||
| 		hcl_oow_t len; | ||||
| 		hcl_ooch_t name[10]; | ||||
| @ -1014,13 +1012,13 @@ static int get_token (hcl_t* hcl) | ||||
| retry: | ||||
| 	GET_CHAR (hcl); | ||||
|  | ||||
| 	do  | ||||
| 	do | ||||
| 	{ | ||||
| 		/* skip spaces */ | ||||
| 		while (is_spacechar(hcl->c->lxc.c)) GET_CHAR (hcl); | ||||
| 		/* the first character after the last space is in hcl->c->lxc */ | ||||
| 		if ((n = skip_comment(hcl)) <= -1) return -1; | ||||
| 	}  | ||||
| 	} | ||||
| 	while (n >= 1); | ||||
|  | ||||
| 	/* clear the token name, reset its location */ | ||||
| @ -1075,7 +1073,7 @@ retry: | ||||
| 			SET_TOKEN_TYPE (hcl, HCL_IOTOK_RBRACE); | ||||
| 			break; | ||||
|  | ||||
| 		case '|':  | ||||
| 		case '|': | ||||
| 			ADD_TOKEN_CHAR (hcl, c); | ||||
| 			SET_TOKEN_TYPE (hcl, HCL_IOTOK_VBAR); | ||||
| 			break; | ||||
| @ -1109,7 +1107,7 @@ retry: | ||||
| 			SET_TOKEN_TYPE (hcl, HCL_IOTOK_CHARLIT); | ||||
| 			break; | ||||
|  | ||||
| 		case '#':   | ||||
| 		case '#': | ||||
| 			if (get_sharp_token(hcl) <= -1) return -1; | ||||
| 			break; | ||||
|  | ||||
| @ -1117,7 +1115,7 @@ retry: | ||||
| 		case '-': | ||||
| 			oldc = c; | ||||
| 			GET_CHAR_TO (hcl, c); | ||||
| 			if(is_digitchar(c))  | ||||
| 			if(is_digitchar(c)) | ||||
| 			{ | ||||
| 				unget_char (hcl, &hcl->c->lxc); | ||||
| 				c = oldc; | ||||
| @ -1153,7 +1151,7 @@ retry: | ||||
| 						goto ident; | ||||
| 				} | ||||
| 			} | ||||
| 			else  | ||||
| 			else | ||||
| 			{ | ||||
| 				unget_char (hcl, &hcl->c->lxc); | ||||
| 				c = oldc; | ||||
| @ -1211,7 +1209,7 @@ retry: | ||||
| 					hcl_iotok_type_t type; | ||||
|  | ||||
| 					type = classify_ident_token(hcl, TOKEN_NAME(hcl)); | ||||
| 					if (type != HCL_IOTOK_IDENT)  | ||||
| 					if (type != HCL_IOTOK_IDENT) | ||||
| 					{ | ||||
| 						SET_TOKEN_TYPE (hcl, type); | ||||
| 						unget_char (hcl, &hcl->c->lxc); | ||||
| @ -1240,7 +1238,7 @@ retry: | ||||
|  | ||||
| 						seg.ptr = &TOKEN_NAME_CHAR(hcl,start); | ||||
| 						seg.len = TOKEN_NAME_LEN(hcl) - start; | ||||
| 						if (classify_ident_token(hcl, &seg) != HCL_IOTOK_IDENT)  | ||||
| 						if (classify_ident_token(hcl, &seg) != HCL_IOTOK_IDENT) | ||||
| 						{ | ||||
| 							hcl_setsynerr (hcl, HCL_SYNERR_MSEGIDENT, TOKEN_LOC(hcl), TOKEN_NAME(hcl)); | ||||
| 							return -1; | ||||
| @ -1334,7 +1332,7 @@ static int begin_include (hcl_t* hcl) | ||||
| 	/*arg->nl = '\0';*/ | ||||
| 	arg->includer = hcl->c->curinp; | ||||
|  | ||||
| 	if (hcl->c->reader(hcl, HCL_IO_OPEN, arg) <= -1)  | ||||
| 	if (hcl->c->reader(hcl, HCL_IO_OPEN, arg) <= -1) | ||||
| 	{ | ||||
| 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_INCLUDE, TOKEN_LOC(hcl), TOKEN_NAME(hcl), "unable to include %js", io_name); | ||||
| 		goto oops; | ||||
| @ -1354,13 +1352,13 @@ static int begin_include (hcl_t* hcl) | ||||
| 	hcl->c->curinp = arg; | ||||
| 	/* hcl->c->depth.incl++; */ | ||||
|  | ||||
| 	/* read in the first character in the included file.  | ||||
| 	/* read in the first character in the included file. | ||||
| 	 * so the next call to get_token() sees the character read | ||||
| 	 * from this file. */ | ||||
| 	if (get_token(hcl) <= -1)  | ||||
| 	if (get_token(hcl) <= -1) | ||||
| 	{ | ||||
| 		end_include (hcl);  | ||||
| 		/* i don't jump to oops since i've called  | ||||
| 		end_include (hcl); | ||||
| 		/* i don't jump to oops since i've called | ||||
| 		 * end_include() which frees hcl->c->curinp/arg */ | ||||
| 		return -1; | ||||
| 	} | ||||
| @ -1386,8 +1384,8 @@ static int end_include (hcl_t* hcl) | ||||
|  | ||||
| 	/* if closing has failed, still destroy the | ||||
| 	 * sio structure first as normal and return | ||||
| 	 * the failure below. this way, the caller  | ||||
| 	 * does not call HCL_IO_CLOSE on  | ||||
| 	 * the failure below. this way, the caller | ||||
| 	 * does not call HCL_IO_CLOSE on | ||||
| 	 * hcl->c->curinp again. */ | ||||
|  | ||||
| 	cur = hcl->c->curinp; | ||||
| @ -1415,16 +1413,16 @@ static HCL_INLINE hcl_oop_t enter_list (hcl_t* hcl, int flagv) | ||||
| 	/* upon entering a list, it pushes a frame of 4 slots. | ||||
| 	 * rsa[0] stores the first element in the list. | ||||
| 	 * rsa[1] stores the last element in the list. | ||||
| 	 * both are updated in chain_to_list() as items are added.  | ||||
| 	 * both are updated in chain_to_list() as items are added. | ||||
| 	 * rsa[2] stores the flag value. | ||||
| 	 * rsa[3] stores the pointer to the previous top frame.  | ||||
| 	 * rsa[3] stores the pointer to the previous top frame. | ||||
| 	 * rsa[4] stores the number of elements in the list */ | ||||
| 	rsa = (hcl_oop_oop_t)hcl_makearray(hcl, 5, 0); | ||||
| 	if (!rsa) return HCL_NULL; | ||||
|  | ||||
| 	rsa->slot[2] = HCL_SMOOI_TO_OOP(flagv); | ||||
| 	rsa->slot[3] = hcl->c->r.s; /* push */ | ||||
| 	hcl->c->r.s = (hcl_oop_t)rsa;  | ||||
| 	hcl->c->r.s = (hcl_oop_t)rsa; | ||||
|  | ||||
| 	rsa->slot[4] = HCL_SMOOI_TO_OOP(0); | ||||
|  | ||||
| @ -1500,8 +1498,8 @@ done: | ||||
| 	*oldflagv = fv; | ||||
| 	if (HCL_IS_NIL(hcl,hcl->c->r.s)) | ||||
| 	{ | ||||
| 		/* the stack is empty after popping.  | ||||
| 		 * it is back to the top level.  | ||||
| 		/* the stack is empty after popping. | ||||
| 		 * it is back to the top level. | ||||
| 		 * the top level can never be quoted. */ | ||||
| 		*flagv = 0; | ||||
| 	} | ||||
| @ -1523,13 +1521,13 @@ done: | ||||
| 			case HCL_CONCODE_ARRAY: | ||||
| 				return (hcl_oop_t)hcl_makearray(hcl, 0, 0); | ||||
| 			case HCL_CONCODE_BYTEARRAY: | ||||
| 				return (hcl_oop_t)hcl_makebytearray(hcl, HCL_NULL, 0);  | ||||
| 				return (hcl_oop_t)hcl_makebytearray(hcl, HCL_NULL, 0); | ||||
| 			case HCL_CONCODE_DIC: | ||||
| 				return (hcl_oop_t)hcl_makedic(hcl, 100); /* TODO: default dictionary size for empty definition? */ | ||||
|  | ||||
| 			/* NOTE: empty xlist will get translated to #nil. | ||||
| 			 *       this is useful when used in the lambda expression to express an empty argument. also in defun. | ||||
| 			 *      (lambda () ...) is equivalent to  (lambda #nil ...)  | ||||
| 			 *      (lambda () ...) is equivalent to  (lambda #nil ...) | ||||
| 			 *      (defun x() ...) */ | ||||
| 		} | ||||
| 	} | ||||
| @ -1582,7 +1580,7 @@ static HCL_INLINE int can_comma_list (hcl_t* hcl) | ||||
| 	{ | ||||
| 		if (count & 1) return 0; | ||||
| 	} | ||||
| 	else if (LIST_FLAG_GET_CONCODE(flagv) != HCL_CONCODE_ARRAY &&  | ||||
| 	else if (LIST_FLAG_GET_CONCODE(flagv) != HCL_CONCODE_ARRAY && | ||||
| 	         LIST_FLAG_GET_CONCODE(flagv) != HCL_CONCODE_BYTEARRAY) | ||||
| 	{ | ||||
| 		return 0; | ||||
| @ -1650,11 +1648,11 @@ static hcl_oop_t chain_to_list (hcl_t* hcl, hcl_oop_t obj) | ||||
|  | ||||
| 	if (flagv & CLOSED) | ||||
| 	{ | ||||
| 		/* the list has already been closed and cannot add more items  | ||||
| 		/* the list has already been closed and cannot add more items | ||||
| 		 * for instance,  see this faulty expression [1 2 . 3 4 ]. | ||||
| 		 * you can have only 1 item  after the period. this condition | ||||
| 		 * can only be triggered by a wrong qlist where a period is | ||||
| 		 * allowed. so i can safely hard-code the error code to  | ||||
| 		 * allowed. so i can safely hard-code the error code to | ||||
| 		 * HCL_SYNERR_RBRACK. */ | ||||
| 		hcl_setsynerr (hcl, HCL_SYNERR_RBRACK, TOKEN_LOC(hcl), TOKEN_NAME(hcl)); | ||||
| 		return HCL_NULL; | ||||
| @ -1686,7 +1684,7 @@ static hcl_oop_t chain_to_list (hcl_t* hcl, hcl_oop_t obj) | ||||
|  | ||||
| 		if ((flagv & JSON) && count > 0 && !(flagv & (COMMAED | COLONED))) | ||||
| 		{ | ||||
| 			/* there is no separator between array/dictionary elements  | ||||
| 			/* there is no separator between array/dictionary elements | ||||
| 			 * for instance, [1 2] { 10 20 } */ | ||||
| 			hcl_setsynerr (hcl, HCL_SYNERR_NOSEP, TOKEN_LOC(hcl), HCL_NULL); | ||||
| 			return HCL_NULL; | ||||
| @ -1760,7 +1758,7 @@ static int get_symbol_array_literal (hcl_t* hcl, hcl_oop_t* xlit) | ||||
| 	hcl_oow_t i; | ||||
|  | ||||
| 	/* if the program is not buggy, salit.size must be 0 here. */ | ||||
| 	HCL_ASSERT (hcl, hcl->c->r.salit.size == 0);  | ||||
| 	HCL_ASSERT (hcl, hcl->c->r.salit.size == 0); | ||||
| 	hcl->c->r.salit.size = 0; /* i want to set it to 0 in case it's buggy */ | ||||
|  | ||||
| 	HCL_ASSERT (hcl, TOKEN_TYPE(hcl) == HCL_IOTOK_VBAR); | ||||
| @ -1812,13 +1810,13 @@ static int read_object (hcl_t* hcl) | ||||
| 	/* this function read an s-expression non-recursively | ||||
| 	 * by manipulating its own stack. */ | ||||
|  | ||||
| 	int level = 0, array_level = 0, flagv = 0;  | ||||
| 	int level = 0, array_level = 0, flagv = 0; | ||||
| 	hcl_oop_t obj; | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| 	redo: | ||||
| 		switch (TOKEN_TYPE(hcl))  | ||||
| 		switch (TOKEN_TYPE(hcl)) | ||||
| 		{ | ||||
| 			default: | ||||
| 				hcl_setsynerr (hcl, HCL_SYNERR_ILTOK, TOKEN_LOC(hcl), TOKEN_NAME(hcl)); | ||||
| @ -1876,7 +1874,7 @@ static int read_object (hcl_t* hcl) | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| 				/* push some data to simulate recursion into  | ||||
| 				/* push some data to simulate recursion into | ||||
| 				 * a list literal or an array literal */ | ||||
| 				if (enter_list(hcl, flagv) == HCL_NULL) return -1; | ||||
| 				level++; | ||||
| @ -1891,9 +1889,9 @@ static int read_object (hcl_t* hcl) | ||||
| 				{ | ||||
| 					/* cannot have a period: | ||||
| 					 *   1. at the top level - not inside () | ||||
| 					 *   2. at the beginning of a list  | ||||
| 					 *   2. at the beginning of a list | ||||
| 					 *   3. inside an  #(), #[], #{}, () */ | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_DOTBANNED, TOKEN_LOC(hcl), HCL_NULL);  | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_DOTBANNED, TOKEN_LOC(hcl), HCL_NULL); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1903,7 +1901,7 @@ static int read_object (hcl_t* hcl) | ||||
| 			case HCL_IOTOK_COLON: | ||||
| 				if (level <= 0 || !can_colon_list(hcl)) | ||||
| 				{ | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_COLONBANNED, TOKEN_LOC(hcl), HCL_NULL);  | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_COLONBANNED, TOKEN_LOC(hcl), HCL_NULL); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1913,7 +1911,7 @@ static int read_object (hcl_t* hcl) | ||||
| 			case HCL_IOTOK_COMMA: | ||||
| 				if (level <= 0 || !can_comma_list(hcl)) | ||||
| 				{ | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_COMMABANNED, TOKEN_LOC(hcl), HCL_NULL);  | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_COMMABANNED, TOKEN_LOC(hcl), HCL_NULL); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1924,7 +1922,7 @@ static int read_object (hcl_t* hcl) | ||||
| 			case HCL_IOTOK_RBRACK: /* bytearray #[], array[] */ | ||||
| 			case HCL_IOTOK_RBRACE: /* dictionary {} */ | ||||
| 			{ | ||||
| 				static struct  | ||||
| 				static struct | ||||
| 				{ | ||||
| 					int             closer; | ||||
| 					hcl_synerrnum_t synerr; | ||||
| @ -1942,7 +1940,7 @@ static int read_object (hcl_t* hcl) | ||||
|  | ||||
| 				if (level <= 0) | ||||
| 				{ | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL);  | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1957,21 +1955,21 @@ static int read_object (hcl_t* hcl) | ||||
| #if 0 | ||||
| 				if ((flagv & QUOTED) || level <= 0) | ||||
| 				{ | ||||
| 					/* the right parenthesis can never appear while  | ||||
| 					 * 'quoted' is true. 'quoted' is set to false when  | ||||
| 					 * entering a normal list. 'quoted' is set to true  | ||||
| 					/* the right parenthesis can never appear while | ||||
| 					 * 'quoted' is true. 'quoted' is set to false when | ||||
| 					 * entering a normal list. 'quoted' is set to true | ||||
| 					 * when entering a quoted list. a quoted list does | ||||
| 					 * not have an explicit right parenthesis. | ||||
| 					 * so the right parenthesis can only pair up with  | ||||
| 					 * so the right parenthesis can only pair up with | ||||
| 					 * the left parenthesis for the normal list. | ||||
| 					 * | ||||
| 					 * For example, '(1 2 3 ') 5 6) | ||||
| 					 * | ||||
| 					 * this condition is triggerred when the first ) is  | ||||
| 					 * this condition is triggerred when the first ) is | ||||
| 					 * met after the second quote. | ||||
| 					 * | ||||
| 					 * also it is illegal to have the right parenthesis  | ||||
| 					 * with no opening(left) parenthesis, which is  | ||||
| 					 * also it is illegal to have the right parenthesis | ||||
| 					 * with no opening(left) parenthesis, which is | ||||
| 					 * indicated by level<=0. | ||||
| 					 */ | ||||
| 					hcl_setsynerr (hcl, HCL_SYNERR_LPAREN, TOKEN_LOC(hcl), TOKEN_NAME(hcl)); | ||||
| @ -2083,14 +2081,14 @@ static int read_object (hcl_t* hcl) | ||||
| 				obj = hcl_makesymbol(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl)); | ||||
| 				if (obj && !hcl_getatsysdic(hcl, obj)) | ||||
| 				{ | ||||
| 					/* query the module for information if it is the first time  | ||||
| 					/* query the module for information if it is the first time | ||||
| 					 * when the dotted symbol is seen */ | ||||
|  | ||||
| 					hcl_pfbase_t* pfbase; | ||||
| 					hcl_mod_t* mod; | ||||
| 					hcl_oop_t val; | ||||
| 					unsigned int kernel_bits; | ||||
| 					 | ||||
|  | ||||
| 					pfbase = hcl_querymod(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl), &mod); | ||||
| 					if (!pfbase) | ||||
| 					{ | ||||
| @ -2151,7 +2149,7 @@ static int read_object (hcl_t* hcl) | ||||
| 			/* if so, append the element read into the quote list */ | ||||
| 			if (chain_to_list(hcl, obj) == HCL_NULL) return -1; | ||||
|  | ||||
| 			/* exit out of the quoted list. the quoted list can have  | ||||
| 			/* exit out of the quoted list. the quoted list can have | ||||
| 			 * one element only. */ | ||||
| 			obj = leave_list(hcl, &flagv, &oldflagv); | ||||
|  | ||||
| @ -2178,7 +2176,7 @@ static int read_object (hcl_t* hcl) | ||||
| 	HCL_ASSERT (hcl, level == 0); | ||||
| 	HCL_ASSERT (hcl, array_level == 0); | ||||
|  | ||||
| 	hcl->c->r.e = obj;  | ||||
| 	hcl->c->r.e = obj; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -2195,7 +2193,7 @@ static HCL_INLINE int __read (hcl_t* hcl) | ||||
|  | ||||
| hcl_oop_t hcl_read (hcl_t* hcl) | ||||
| { | ||||
| 	HCL_ASSERT (hcl, hcl->c && hcl->c->reader);  | ||||
| 	HCL_ASSERT (hcl, hcl->c && hcl->c->reader); | ||||
| 	if (__read(hcl) <= -1) return HCL_NULL; | ||||
| 	return hcl->c->r.e; | ||||
| } | ||||
| @ -2306,7 +2304,7 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer) | ||||
| 		if (!cbp) return -1; | ||||
|  | ||||
| 		hcl->c = (hcl_compiler_t*)hcl_callocmem(hcl, HCL_SIZEOF(*hcl->c)); | ||||
| 		if (!hcl->c)  | ||||
| 		if (!hcl->c) | ||||
| 		{ | ||||
| 			hcl_deregcb (hcl, cbp); | ||||
| 			return -1; | ||||
| @ -2338,7 +2336,7 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer) | ||||
| 	hcl->c->reader = reader; | ||||
| 	hcl->c->nungots = 0; | ||||
|  | ||||
| 	/* The name field and the includer field are HCL_NULL  | ||||
| 	/* The name field and the includer field are HCL_NULL | ||||
| 	 * for the main stream */ | ||||
| 	HCL_MEMSET (&hcl->c->inarg, 0, HCL_SIZEOF(hcl->c->inarg)); | ||||
| 	hcl->c->inarg.line = 1; | ||||
| @ -2350,18 +2348,18 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer) | ||||
|  | ||||
| 	HCL_MEMSET (&hcl->c->outarg, 0, HCL_SIZEOF(hcl->c->outarg)); | ||||
| 	n = hcl->c->printer(hcl, HCL_IO_OPEN, &hcl->c->outarg); | ||||
| 	if (n <= -1)  | ||||
| 	if (n <= -1) | ||||
| 	{ | ||||
| 		hcl->c->reader (hcl, HCL_IO_CLOSE, &hcl->c->inarg); | ||||
| 		goto oops; | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	/* the stream is open. set it as the current input stream */ | ||||
| 	hcl->c->curinp = &hcl->c->inarg; | ||||
| 	return 0; | ||||
|  | ||||
| oops: | ||||
| 	if (cbp)  | ||||
| 	if (cbp) | ||||
| 	{ | ||||
| 		hcl_deregcb (hcl, cbp); | ||||
| 		hcl_freemem (hcl, hcl->c); | ||||
| @ -2386,7 +2384,7 @@ void hcl_flushio (hcl_t* hcl) | ||||
| void hcl_detachio (hcl_t* hcl) | ||||
| { | ||||
| 	/* an error occurred and control has reached here | ||||
| 	 * probably, some included files might not have been  | ||||
| 	 * probably, some included files might not have been | ||||
| 	 * closed. close them */ | ||||
|  | ||||
| 	if (hcl->c) | ||||
|  | ||||
| @ -15,7 +15,7 @@ if ENABLE_STATIC_MODULE | ||||
| ################################################## | ||||
| # STATIC MODULES BUILT INTO MAIN LIBRARY | ||||
| ################################################## | ||||
| LDFLAGS_COMMON =-L$(libdir) -version-info 1:0:0 -no-undefined | ||||
| LDFLAGS_COMMON =-L$(libdir) | ||||
| LIBADD_COMMON = | ||||
|  | ||||
| noinst_LTLIBRARIES = | ||||
|  | ||||
| @ -391,7 +391,7 @@ CFLAGS_COMMON = | ||||
| ################################################## | ||||
| # STATIC MODULES BUILT INTO MAIN LIBRARY | ||||
| ################################################## | ||||
| @ENABLE_STATIC_MODULE_TRUE@LDFLAGS_COMMON = -L$(libdir) -version-info 1:0:0 -no-undefined | ||||
| @ENABLE_STATIC_MODULE_TRUE@LDFLAGS_COMMON = -L$(libdir) | ||||
| @ENABLE_STATIC_MODULE_FALSE@LIBADD_COMMON = -lhcl | ||||
| @ENABLE_STATIC_MODULE_TRUE@LIBADD_COMMON =  | ||||
| @ENABLE_STATIC_MODULE_TRUE@noinst_LTLIBRARIES = libhcl-arr.la \ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user