added stix_bfmtout() and stix_oofmtout()
This commit is contained in:
parent
037bbff42c
commit
0c4ce4eb04
@ -43,6 +43,7 @@ libstix_la_SOURCES = \
|
||||
decode.c \
|
||||
dic.c \
|
||||
exec.c \
|
||||
fmt.c \
|
||||
gc.c \
|
||||
heap.c \
|
||||
ignite.c \
|
||||
@ -83,17 +84,17 @@ LIBADD_MOD_COMMON = -lstix
|
||||
|
||||
pkgmodexecdir = $(libdir)
|
||||
|
||||
pkgmodexec_LTLIBRARIES = libstix-snd.la libstix-con.la
|
||||
pkgmodexec_LTLIBRARIES = libstix-snd.la #libstix-con.la
|
||||
|
||||
libstix_snd_la_SOURCES = mod-snd.c mod-snd.h
|
||||
libstix_snd_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
libstix_snd_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
libstix_snd_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
|
||||
libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
#libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
#libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
#libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
#libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
|
||||
endif
|
||||
|
||||
|
@ -133,28 +133,16 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" \
|
||||
"$(DESTDIR)$(pkgincludedir)"
|
||||
LTLIBRARIES = $(pkglib_LTLIBRARIES) $(pkgmodexec_LTLIBRARIES)
|
||||
am__DEPENDENCIES_1 =
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_DEPENDENCIES = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__libstix_con_la_SOURCES_DIST = mod-con.c mod-con.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_con_la_OBJECTS = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ libstix_con_la-mod-con.lo
|
||||
libstix_con_la_OBJECTS = $(am_libstix_con_la_OBJECTS)
|
||||
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 =
|
||||
libstix_con_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||
$(AM_CFLAGS) $(CFLAGS) $(libstix_con_la_LDFLAGS) $(LDFLAGS) -o \
|
||||
$@
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_con_la_rpath = -rpath \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(pkgmodexecdir)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_DEPENDENCIES = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__libstix_snd_la_SOURCES_DIST = mod-snd.c mod-snd.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_snd_la_OBJECTS = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ libstix_snd_la-mod-snd.lo
|
||||
libstix_snd_la_OBJECTS = $(am_libstix_snd_la_OBJECTS)
|
||||
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 =
|
||||
libstix_snd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||
$(AM_CFLAGS) $(CFLAGS) $(libstix_snd_la_LDFLAGS) $(LDFLAGS) -o \
|
||||
@ -165,10 +153,10 @@ am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
|
||||
libstix_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||
am_libstix_la_OBJECTS = libstix_la-bigint.lo libstix_la-comp.lo \
|
||||
libstix_la-debug.lo libstix_la-decode.lo libstix_la-dic.lo \
|
||||
libstix_la-exec.lo libstix_la-gc.lo libstix_la-heap.lo \
|
||||
libstix_la-ignite.lo libstix_la-obj.lo libstix_la-proc.lo \
|
||||
libstix_la-rbt.lo libstix_la-stix.lo libstix_la-sym.lo \
|
||||
libstix_la-utf8.lo libstix_la-utl.lo
|
||||
libstix_la-exec.lo libstix_la-fmt.lo libstix_la-gc.lo \
|
||||
libstix_la-heap.lo libstix_la-ignite.lo libstix_la-obj.lo \
|
||||
libstix_la-proc.lo libstix_la-rbt.lo libstix_la-stix.lo \
|
||||
libstix_la-sym.lo libstix_la-utf8.lo libstix_la-utl.lo
|
||||
libstix_la_OBJECTS = $(am_libstix_la_OBJECTS)
|
||||
libstix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
@ -214,11 +202,10 @@ 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 = $(libstix_con_la_SOURCES) $(libstix_snd_la_SOURCES) \
|
||||
$(libstix_la_SOURCES) $(stix_SOURCES)
|
||||
DIST_SOURCES = $(am__libstix_con_la_SOURCES_DIST) \
|
||||
$(am__libstix_snd_la_SOURCES_DIST) $(libstix_la_SOURCES) \
|
||||
SOURCES = $(libstix_snd_la_SOURCES) $(libstix_la_SOURCES) \
|
||||
$(stix_SOURCES)
|
||||
DIST_SOURCES = $(am__libstix_snd_la_SOURCES_DIST) \
|
||||
$(libstix_la_SOURCES) $(stix_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -438,6 +425,7 @@ libstix_la_SOURCES = \
|
||||
decode.c \
|
||||
dic.c \
|
||||
exec.c \
|
||||
fmt.c \
|
||||
gc.c \
|
||||
heap.c \
|
||||
ignite.c \
|
||||
@ -471,15 +459,11 @@ stix_LDADD = $(LIBADD_LIB_COMMON) -lstix #-ldyncall_s
|
||||
@ENABLE_STATIC_MODULE_FALSE@LDFLAGS_MOD_COMMON = $(LDFLAGS_LIB_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@LIBADD_MOD_COMMON = -lstix
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexecdir = $(libdir)
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libstix-snd.la libstix-con.la
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libstix-snd.la #libstix-con.la
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_SOURCES = mod-snd.c mod-snd.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
all: stix-cfg.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
@ -601,9 +585,6 @@ clean-pkgmodexecLTLIBRARIES:
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libstix-con.la: $(libstix_con_la_OBJECTS) $(libstix_con_la_DEPENDENCIES) $(EXTRA_libstix_con_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libstix_con_la_LINK) $(am_libstix_con_la_rpath) $(libstix_con_la_OBJECTS) $(libstix_con_la_LIBADD) $(LIBS)
|
||||
|
||||
libstix-snd.la: $(libstix_snd_la_OBJECTS) $(libstix_snd_la_DEPENDENCIES) $(EXTRA_libstix_snd_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libstix_snd_la_LINK) $(am_libstix_snd_la_rpath) $(libstix_snd_la_OBJECTS) $(libstix_snd_la_LIBADD) $(LIBS)
|
||||
|
||||
@ -669,13 +650,13 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_con_la-mod-con.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-bigint.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-comp.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-debug.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-decode.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-dic.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-exec.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-fmt.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-gc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-heap.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-ignite.Plo@am__quote@
|
||||
@ -713,13 +694,6 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
libstix_con_la-mod-con.lo: mod-con.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_con_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_con_la-mod-con.lo -MD -MP -MF $(DEPDIR)/libstix_con_la-mod-con.Tpo -c -o libstix_con_la-mod-con.lo `test -f 'mod-con.c' || echo '$(srcdir)/'`mod-con.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_con_la-mod-con.Tpo $(DEPDIR)/libstix_con_la-mod-con.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mod-con.c' object='libstix_con_la-mod-con.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) $(libstix_con_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_con_la-mod-con.lo `test -f 'mod-con.c' || echo '$(srcdir)/'`mod-con.c
|
||||
|
||||
libstix_snd_la-mod-snd.lo: mod-snd.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_snd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_snd_la-mod-snd.lo -MD -MP -MF $(DEPDIR)/libstix_snd_la-mod-snd.Tpo -c -o libstix_snd_la-mod-snd.lo `test -f 'mod-snd.c' || echo '$(srcdir)/'`mod-snd.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_snd_la-mod-snd.Tpo $(DEPDIR)/libstix_snd_la-mod-snd.Plo
|
||||
@ -769,6 +743,13 @@ libstix_la-exec.lo: exec.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) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_la-exec.lo `test -f 'exec.c' || echo '$(srcdir)/'`exec.c
|
||||
|
||||
libstix_la-fmt.lo: fmt.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_la-fmt.lo -MD -MP -MF $(DEPDIR)/libstix_la-fmt.Tpo -c -o libstix_la-fmt.lo `test -f 'fmt.c' || echo '$(srcdir)/'`fmt.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_la-fmt.Tpo $(DEPDIR)/libstix_la-fmt.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fmt.c' object='libstix_la-fmt.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) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_la-fmt.lo `test -f 'fmt.c' || echo '$(srcdir)/'`fmt.c
|
||||
|
||||
libstix_la-gc.lo: gc.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_la-gc.lo -MD -MP -MF $(DEPDIR)/libstix_la-gc.Tpo -c -o libstix_la-gc.lo `test -f 'gc.c' || echo '$(srcdir)/'`gc.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_la-gc.Tpo $(DEPDIR)/libstix_la-gc.Plo
|
||||
@ -1098,6 +1079,11 @@ uninstall-am: uninstall-binPROGRAMS uninstall-pkgincludeHEADERS \
|
||||
uninstall-pkglibLTLIBRARIES uninstall-pkgmodexecLTLIBRARIES
|
||||
|
||||
|
||||
#libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
#libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
#libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
#libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
|
||||
install-data-hook:
|
||||
@echo "#ifndef _STIX_CFG_H_" > "$(DESTDIR)$(pkgincludedir)/stix-cfg.h"
|
||||
@echo "#define _STIX_CFG_H_" >> "$(DESTDIR)$(pkgincludedir)/stix-cfg.h"
|
||||
|
@ -4310,7 +4310,7 @@ the compiler must collect all source method string collected so far.
|
||||
need to write code to collect string.
|
||||
*/
|
||||
|
||||
/* TODO: if (decoding is enabled... */
|
||||
/* TODO: call stix_decode only if decoding is enabled... */
|
||||
printf (">>>> BYTE CODE.....\n");
|
||||
stix_decode (stix, mth);
|
||||
|
||||
@ -4374,6 +4374,7 @@ static int compile_method_definition (stix_t* stix)
|
||||
printf (">>METHOD ");
|
||||
print_oocs (&stix->c->mth.name);
|
||||
printf ("\n");
|
||||
|
||||
if (stix->c->tok.type != STIX_IOTOK_LBRACE)
|
||||
{
|
||||
/* { expected */
|
||||
|
@ -87,41 +87,28 @@ void print_object (stix_t* stix, stix_oop_t oop)
|
||||
{
|
||||
if (oop == stix->_nil)
|
||||
{
|
||||
printf ("nil");
|
||||
stix_bfmtout (stix, "nil");
|
||||
}
|
||||
else if (oop == stix->_true)
|
||||
{
|
||||
printf ("true");
|
||||
stix_bfmtout (stix, "true");
|
||||
}
|
||||
else if (oop == stix->_false)
|
||||
{
|
||||
printf ("false");
|
||||
stix_bfmtout (stix, "false");
|
||||
}
|
||||
else if (STIX_OOP_IS_SMOOI(oop))
|
||||
{
|
||||
printf ("%ld", (long int)STIX_OOP_TO_SMOOI(oop));
|
||||
stix_bfmtout (stix, "%zd", STIX_OOP_TO_SMOOI(oop));
|
||||
}
|
||||
else if (STIX_OOP_IS_CHAR(oop))
|
||||
{
|
||||
stix_bch_t bcs[32];
|
||||
stix_uch_t uch;
|
||||
stix_oow_t ucslen, bcslen;
|
||||
|
||||
uch = STIX_OOP_TO_CHAR(oop);
|
||||
bcslen = STIX_COUNTOF(bcs);
|
||||
ucslen = 1;
|
||||
if (stix_ucstoutf8 (&uch, &ucslen, bcs, &bcslen) >= 0)
|
||||
{
|
||||
printf ("$%.*s", (int)bcslen, bcs);
|
||||
}
|
||||
stix_bfmtout (stix, "$%.1C", STIX_OOP_TO_CHAR(oop));
|
||||
}
|
||||
else
|
||||
{
|
||||
stix_oop_class_t c;
|
||||
stix_oocs_t s;
|
||||
stix_oow_t i;
|
||||
stix_bch_t bcs[32];
|
||||
stix_oow_t ucslen, bcslen;
|
||||
|
||||
STIX_ASSERT (STIX_OOP_IS_POINTER(oop));
|
||||
c = (stix_oop_class_t)STIX_OBJ_GET_CLASS(oop); /*STIX_CLASSOF(stix, oop);*/
|
||||
@ -129,95 +116,75 @@ void print_object (stix_t* stix, stix_oop_t oop)
|
||||
if ((stix_oop_t)c == stix->_large_negative_integer)
|
||||
{
|
||||
stix_oow_t i;
|
||||
printf ("-16r");
|
||||
stix_bfmtout (stix, "-16r");
|
||||
for (i = STIX_OBJ_GET_SIZE(oop); i > 0;)
|
||||
{
|
||||
printf ("%0*lX", (int)(STIX_SIZEOF(stix_liw_t) * 2), (unsigned long)((stix_oop_liword_t)oop)->slot[--i]);
|
||||
stix_bfmtout (stix, "%0*lX", (int)(STIX_SIZEOF(stix_liw_t) * 2), (unsigned long)((stix_oop_liword_t)oop)->slot[--i]);
|
||||
}
|
||||
}
|
||||
else if ((stix_oop_t)c == stix->_large_positive_integer)
|
||||
{
|
||||
stix_oow_t i;
|
||||
printf ("16r");
|
||||
stix_bfmtout (stix, "16r");
|
||||
for (i = STIX_OBJ_GET_SIZE(oop); i > 0;)
|
||||
{
|
||||
printf ("%0*lX", (int)(STIX_SIZEOF(stix_liw_t) * 2), (unsigned long)((stix_oop_liword_t)oop)->slot[--i]);
|
||||
stix_bfmtout (stix, "%0*lX", (int)(STIX_SIZEOF(stix_liw_t) * 2), (unsigned long)((stix_oop_liword_t)oop)->slot[--i]);
|
||||
}
|
||||
}
|
||||
else if (STIX_OBJ_GET_FLAGS_TYPE(oop) == STIX_OBJ_TYPE_CHAR)
|
||||
{
|
||||
if ((stix_oop_t)c == stix->_symbol) printf ("#");
|
||||
else if ((stix_oop_t)c == stix->_string) printf ("'");
|
||||
if ((stix_oop_t)c == stix->_symbol) stix_bfmtout (stix, "#");
|
||||
else if ((stix_oop_t)c == stix->_string) stix_bfmtout (stix, "'");
|
||||
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(oop); i++)
|
||||
{
|
||||
bcslen = STIX_COUNTOF(bcs);
|
||||
ucslen = 1;
|
||||
if (stix_ucstoutf8 (&((stix_oop_char_t)oop)->slot[i], &ucslen, bcs, &bcslen) >= 0)
|
||||
{
|
||||
printf ("%.*s", (int)bcslen, bcs);
|
||||
}
|
||||
}
|
||||
if ((stix_oop_t)c == stix->_string) printf ("'");
|
||||
stix_bfmtout (stix, "%.*S", STIX_OBJ_GET_SIZE(oop), ((stix_oop_char_t)oop)->slot);
|
||||
if ((stix_oop_t)c == stix->_string) stix_bfmtout (stix, "'");
|
||||
}
|
||||
else if (STIX_OBJ_GET_FLAGS_TYPE(oop) == STIX_OBJ_TYPE_BYTE)
|
||||
{
|
||||
printf ("#[");
|
||||
stix_bfmtout (stix, "#[");
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(oop); i++)
|
||||
{
|
||||
printf (" %d", ((stix_oop_byte_t)oop)->slot[i]);
|
||||
stix_bfmtout (stix, " %d", ((stix_oop_byte_t)oop)->slot[i]);
|
||||
}
|
||||
printf ("]");
|
||||
stix_bfmtout (stix, "]");
|
||||
}
|
||||
|
||||
else if (STIX_OBJ_GET_FLAGS_TYPE(oop) == STIX_OBJ_TYPE_HALFWORD)
|
||||
{
|
||||
printf ("#[["); /* TODO: fix this symbol */
|
||||
stix_bfmtout (stix, "#[["); /* TODO: fix this symbol */
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(oop); i++)
|
||||
{
|
||||
printf (" %lX", (unsigned long int)((stix_oop_halfword_t)oop)->slot[i]);
|
||||
stix_bfmtout (stix, " %zX", (stix_oow_t)((stix_oop_halfword_t)oop)->slot[i]);
|
||||
}
|
||||
printf ("]]");
|
||||
stix_bfmtout (stix, "]]");
|
||||
}
|
||||
else if (STIX_OBJ_GET_FLAGS_TYPE(oop) == STIX_OBJ_TYPE_WORD)
|
||||
{
|
||||
printf ("#[[["); /* TODO: fix this symbol */
|
||||
stix_bfmtout (stix, "#[[["); /* TODO: fix this symbol */
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(oop); i++)
|
||||
{
|
||||
printf (" %lX", (unsigned long int)((stix_oop_word_t)oop)->slot[i]);
|
||||
stix_bfmtout (stix, " %zX", ((stix_oop_word_t)oop)->slot[i]);
|
||||
}
|
||||
printf ("]]]");
|
||||
stix_bfmtout (stix, "]]]");
|
||||
}
|
||||
else if ((stix_oop_t)c == stix->_array)
|
||||
{
|
||||
printf ("#(");
|
||||
stix_bfmtout (stix, "#(");
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(oop); i++)
|
||||
{
|
||||
printf (" ");
|
||||
stix_bfmtout (stix, " ");
|
||||
print_object (stix, ((stix_oop_oop_t)oop)->slot[i]);
|
||||
}
|
||||
printf (")");
|
||||
stix_bfmtout (stix, ")");
|
||||
}
|
||||
else if ((stix_oop_t)c == stix->_class)
|
||||
{
|
||||
/* print the class name */
|
||||
for (i = 0; i < STIX_OBJ_GET_SIZE(((stix_oop_class_t)oop)->name); i++)
|
||||
{
|
||||
bcslen = STIX_COUNTOF(bcs);
|
||||
ucslen = 1;
|
||||
if (stix_ucstoutf8 (&((stix_oop_class_t)oop)->name->slot[i], &ucslen, bcs, &bcslen) >= 0)
|
||||
{
|
||||
printf ("%.*s", (int)bcslen, bcs);
|
||||
}
|
||||
}
|
||||
stix_bfmtout (stix, "%.*S", STIX_OBJ_GET_SIZE(((stix_oop_class_t)oop)->name), ((stix_oop_class_t)oop)->name->slot);
|
||||
}
|
||||
else
|
||||
{
|
||||
s.ptr = ((stix_oop_char_t)c->name)->slot;
|
||||
s.len = STIX_OBJ_GET_SIZE(c->name);
|
||||
printf ("instance of ");
|
||||
print_oocs (&s);
|
||||
printf ("- (%p)", oop);
|
||||
stix_bfmtout (stix, "instance of %.*S - (%p)", STIX_OBJ_GET_SIZE(c->name), ((stix_oop_char_t)c->name)->slot, oop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,10 +26,11 @@
|
||||
|
||||
#include "stix-prv.h"
|
||||
|
||||
# define DECODE_OUT_0(fmt) printf("\t" fmt "\n")
|
||||
# define DECODE_OUT_1(fmt,a1) printf("\t" fmt "\n",a1)
|
||||
# define DECODE_OUT_2(fmt,a1,a2) printf("\t" fmt "\n", a1, a2)
|
||||
# define DECODE_OUT_3(fmt,a1,a2,a3) printf("\t" fmt "\n", a1, a2, a3)
|
||||
# define DECODE_OUT_0(stix,fmt) stix_bfmtout(stix, "\t" fmt "\n")
|
||||
# define DECODE_OUT_1(stix,fmt,a1) stix_bfmtout(stix, "\t" fmt "\n",a1)
|
||||
# define DECODE_OUT_2(stix,fmt,a1,a2) stix_bfmtout(stix, "\t" fmt "\n", a1, a2)
|
||||
# define DECODE_OUT_3(stix,fmt,a1,a2,a3) stix_bfmtout(stix, "\t" fmt "\n", a1, a2, a3)
|
||||
|
||||
|
||||
|
||||
#define FETCH_BYTE_CODE(stix) (cdptr[ip++])
|
||||
@ -44,8 +45,11 @@
|
||||
# define FETCH_PARAM_CODE_TO(stix,v_ooi) (v_ooi = FETCH_BYTE_CODE(stix))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* TODO: check if ip shoots beyond the maximum length in fetching code and parameters */
|
||||
static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
int stix_decode (stix_t* stix, stix_oop_method_t mth)
|
||||
{
|
||||
stix_oob_t bcode, * cdptr;
|
||||
stix_oow_t ip = 0, cdlen;
|
||||
@ -74,7 +78,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_PUSH_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
push_instvar:
|
||||
DECODE_OUT_1 ("push_instvar %lu", (unsigned long int)b1);
|
||||
DECODE_OUT_1 (stix, "push_instvar %zd", b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
@ -92,7 +96,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_STORE_INTO_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
store_instvar:
|
||||
DECODE_OUT_1 ("store_into_instvar %lu", (unsigned long int)b1);
|
||||
DECODE_OUT_1 (stix, "store_into_instvar %zd", b1);
|
||||
break;
|
||||
|
||||
case BCODE_POP_INTO_INSTVAR_X:
|
||||
@ -108,7 +112,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_POP_INTO_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
pop_into_instvar:
|
||||
DECODE_OUT_1 ("pop_into_instvar %lu", (unsigned long int)b1);
|
||||
DECODE_OUT_1 (stix, "pop_into_instvar %zd", b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
@ -148,7 +152,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
if ((bcode >> 4) & 1)
|
||||
{
|
||||
/* push - bit 4 on */
|
||||
DECODE_OUT_1 ("push_tempvar %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "push_tempvar %zd", b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -156,11 +160,11 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
if ((bcode >> 3) & 1)
|
||||
{
|
||||
/* pop - bit 3 on */
|
||||
DECODE_OUT_1 ("pop_into_tempvar %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "pop_into_tempvar %zd", b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1 ("store_into_tempvar %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "store_into_tempvar %zd", b1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -180,7 +184,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_PUSH_LITERAL_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
push_literal:
|
||||
DECODE_OUT_1 ("push_literal %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "push_literal %zd", b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
@ -208,16 +212,16 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
{
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_1("pop_into_object %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "pop_into_object %zd", b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1("store_into_object %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "store_into_object %zd", b1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1("push_object %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "push_object %zd", b1);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -225,19 +229,19 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
|
||||
case BCODE_JUMP_FORWARD_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump_forward %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "jump_forward %zd", b1);
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_FORWARD_0:
|
||||
case BCODE_JUMP_FORWARD_1:
|
||||
case BCODE_JUMP_FORWARD_2:
|
||||
case BCODE_JUMP_FORWARD_3:
|
||||
DECODE_OUT_1 ("jump_forward %d", (int)(bcode & 0x3)); /* low 2 bits */
|
||||
DECODE_OUT_1 (stix, "jump_forward %zd", (bcode & 0x3)); /* low 2 bits */
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_BACKWARD_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump_backward %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "jump_backward %zd", b1);
|
||||
stix->ip += b1;
|
||||
break;
|
||||
|
||||
@ -245,7 +249,7 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_JUMP_BACKWARD_1:
|
||||
case BCODE_JUMP_BACKWARD_2:
|
||||
case BCODE_JUMP_BACKWARD_3:
|
||||
DECODE_OUT_1 ("jump_backward %d", (int)(bcode & 0x3)); /* low 2 bits */
|
||||
DECODE_OUT_1 (stix, "jump_backward %zd", (bcode & 0x3)); /* low 2 bits */
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_IF_TRUE_X:
|
||||
@ -258,18 +262,18 @@ static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
case BCODE_JUMP_IF_FALSE_1:
|
||||
case BCODE_JUMP_IF_FALSE_2:
|
||||
case BCODE_JUMP_IF_FALSE_3:
|
||||
printf ("<<<<<<<<<<<<<< JUMP NOT IMPLEMENTED YET >>>>>>>>>>>> \n");
|
||||
DECODE_OUT_0 (stix, "<<<<<<<<<<<<<< JUMP NOT IMPLEMENTED YET >>>>>>>>>>>>");
|
||||
stix->errnum = STIX_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
case BCODE_JUMP2_FORWARD:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump2_forward %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "jump2_forward %zd", b1);
|
||||
break;
|
||||
|
||||
case BCODE_JUMP2_BACKWARD:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump2_backward %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "jump2_backward %zd", b1);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
@ -302,17 +306,17 @@ return -1;
|
||||
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_2 ("pop_into_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "pop_into_ctxtempvar %zd %zd", b1, b2);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("store_into_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "store_into_ctxtempvar %zd %zd", b1, b2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* push */
|
||||
DECODE_OUT_2 ("push_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "push_ctxtempvar %zd %zd", b1, b2);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -348,16 +352,16 @@ return -1;
|
||||
/* store or pop */
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_2 ("pop_into_objvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "pop_into_objvar %zd %zd", b1, b2);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("store_into_objvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "store_into_objvar %zd %zd", b1, b2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("push_objvar %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "push_objvar %zd %zd", b1, b2);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -383,77 +387,77 @@ return -1;
|
||||
FETCH_BYTE_CODE_TO (stix, b2);
|
||||
|
||||
handle_send_message:
|
||||
DECODE_OUT_3 ("send_message%s nargs=%d selector=%d", (((bcode >> 2) & 1)? "_to_super": ""), (int)b1, (int)b2);
|
||||
DECODE_OUT_3 (stix, "send_message%hs %zd @%zd", (((bcode >> 2) & 1)? "_to_super": ""), b1, b2);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_PUSH_RECEIVER:
|
||||
DECODE_OUT_0 ("push_receiver");
|
||||
DECODE_OUT_0 (stix, "push_receiver");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NIL:
|
||||
DECODE_OUT_0 ("push_nil");
|
||||
DECODE_OUT_0 (stix, "push_nil");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_TRUE:
|
||||
DECODE_OUT_0 ("push_true");
|
||||
DECODE_OUT_0 (stix, "push_true");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_FALSE:
|
||||
DECODE_OUT_0 ("push_false");
|
||||
DECODE_OUT_0 (stix, "push_false");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_CONTEXT:
|
||||
DECODE_OUT_0 ("push_context");
|
||||
DECODE_OUT_0 (stix, "push_context");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NEGONE:
|
||||
DECODE_OUT_0 ("push_negone");
|
||||
DECODE_OUT_0 (stix, "push_negone");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_ZERO:
|
||||
DECODE_OUT_0 ("push_zero");
|
||||
DECODE_OUT_0 (stix, "push_zero");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_ONE:
|
||||
DECODE_OUT_0 ("push_one");
|
||||
DECODE_OUT_0 (stix, "push_one");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_TWO:
|
||||
DECODE_OUT_0 ("push_two");
|
||||
DECODE_OUT_0 (stix, "push_two");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_INTLIT:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("push_intlit %d", (int)b1);
|
||||
DECODE_OUT_1 (stix, "push_intlit %zd", b1);
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NEGINTLIT:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("push_negintlit %d", (int)-b1);
|
||||
DECODE_OUT_1 (stix, "push_negintlit %zd", -b1);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_DUP_STACKTOP:
|
||||
DECODE_OUT_0 ("dup_stacktop");
|
||||
DECODE_OUT_0 (stix, "dup_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_POP_STACKTOP:
|
||||
DECODE_OUT_0 ("pop_stacktop");
|
||||
DECODE_OUT_0 (stix, "pop_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_STACKTOP:
|
||||
DECODE_OUT_0 ("return_stacktop");
|
||||
DECODE_OUT_0 (stix, "return_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_RECEIVER:
|
||||
DECODE_OUT_0 ("return_receiver");
|
||||
DECODE_OUT_0 (stix, "return_receiver");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_FROM_BLOCK:
|
||||
DECODE_OUT_0 ("return_from_block");
|
||||
DECODE_OUT_0 (stix, "return_from_block");
|
||||
break;
|
||||
|
||||
case BCODE_MAKE_BLOCK:
|
||||
@ -462,7 +466,7 @@ return -1;
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
FETCH_PARAM_CODE_TO (stix, b2);
|
||||
|
||||
DECODE_OUT_2 ("make_block %d %d", (int)b1, (int)b2);
|
||||
DECODE_OUT_2 (stix, "make_block %zd %zd", b1, b2);
|
||||
|
||||
STIX_ASSERT (b1 >= 0);
|
||||
STIX_ASSERT (b2 >= b1);
|
||||
@ -470,16 +474,16 @@ return -1;
|
||||
|
||||
|
||||
case BCODE_SEND_BLOCK_COPY:
|
||||
DECODE_OUT_0 ("send_block_copy");
|
||||
DECODE_OUT_0 (stix, "send_block_copy");
|
||||
break;
|
||||
|
||||
case BCODE_NOOP:
|
||||
/* do nothing */
|
||||
DECODE_OUT_0 ("noop");
|
||||
DECODE_OUT_0 (stix, "noop");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("UNKNOWN BYTE CODE ENCOUNTERED %x\n", (int)bcode);
|
||||
DECODE_OUT_1 (stix, "UNKNOWN BYTE CODE ENCOUNTERED %x", (int)bcode);
|
||||
stix->errnum = STIX_EINTERN;
|
||||
break;
|
||||
|
||||
@ -489,15 +493,9 @@ printf ("UNKNOWN BYTE CODE ENCOUNTERED %x\n", (int)bcode);
|
||||
/* print literal frame contents */
|
||||
for (ip = 0; ip < STIX_OBJ_GET_SIZE(mth) - STIX_METHOD_NAMED_INSTVARS; ip++)
|
||||
{
|
||||
printf (" %8lu ", (unsigned long int)ip);
|
||||
print_object (stix, mth->slot[ip]);
|
||||
printf ("\n");
|
||||
DECODE_OUT_2 (stix, " @%-3lu %O", (unsigned long int)ip, mth->slot[ip]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stix_decode (stix_t* stix, stix_oop_method_t mth)
|
||||
{
|
||||
return decode (stix, mth);
|
||||
}
|
||||
|
@ -26,7 +26,6 @@
|
||||
|
||||
#include "stix-prv.h"
|
||||
|
||||
|
||||
/* TODO: remove these headers after having migrated system-dependent functions of of this file */
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
@ -1214,15 +1213,15 @@ static int prim_dump (stix_t* stix, stix_ooi_t nargs)
|
||||
|
||||
STIX_ASSERT (nargs >= 0);
|
||||
|
||||
printf ("RECEIVER: ");
|
||||
stix_bfmtout (stix, "RECEIVER: ");
|
||||
print_object (stix, STIX_STACK_GET(stix, stix->sp - nargs));
|
||||
printf ("\n");
|
||||
stix_bfmtout (stix, "\n");
|
||||
for (i = nargs; i > 0; )
|
||||
{
|
||||
--i;
|
||||
printf ("ARGUMENT: ");
|
||||
stix_bfmtout (stix, "ARGUMENT: ");
|
||||
print_object (stix, STIX_STACK_GET(stix, stix->sp - i));
|
||||
printf ("\n");
|
||||
stix_bfmtout (stix, "\n");
|
||||
}
|
||||
|
||||
STIX_STACK_POPS (stix, nargs);
|
||||
@ -2667,7 +2666,7 @@ typedef struct prim_t prim_t;
|
||||
|
||||
static prim_t primitives[] =
|
||||
{
|
||||
{ 0, MAX_NARGS, prim_dump, "_dump" },
|
||||
{ 0, MAX_NARGS, prim_dump, "_dump" },
|
||||
|
||||
{ 1, 1, prim_identical, "_identical" },
|
||||
{ 1, 1, prim_not_identical, "_not_identical" },
|
||||
|
252
stix/lib/fmt.c
Normal file
252
stix/lib/fmt.c
Normal file
@ -0,0 +1,252 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2014-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "stix-prv.h"
|
||||
|
||||
#include <stdio.h> /* for snrintf(). used for floating-point number formatting */
|
||||
#include <stdarg.h>
|
||||
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
|
||||
# define snprintf _snprintf
|
||||
# if !defined(HAVE_SNPRINTF)
|
||||
# define HAVE_SNPRINTF
|
||||
# endif
|
||||
#endif
|
||||
#if defined(HAVE_QUADMATH_H)
|
||||
# include <quadmath.h> /* for quadmath_snprintf() */
|
||||
#endif
|
||||
/* TODO: remove stdio.h and quadmath.h once snprintf gets replaced by own
|
||||
floting-point conversion implementation*/
|
||||
|
||||
/* Max number conversion buffer length:
|
||||
* stix_intmax_t in base 2, plus NUL byte. */
|
||||
#define MAXNBUF (STIX_SIZEOF(stix_intmax_t) * 8 + 1)
|
||||
|
||||
enum
|
||||
{
|
||||
/* integer */
|
||||
LF_C = (1 << 0),
|
||||
LF_H = (1 << 1),
|
||||
LF_J = (1 << 2),
|
||||
LF_L = (1 << 3),
|
||||
LF_Q = (1 << 4),
|
||||
LF_T = (1 << 5),
|
||||
LF_Z = (1 << 6),
|
||||
|
||||
/* long double */
|
||||
LF_LD = (1 << 7),
|
||||
/* __float128 */
|
||||
LF_QD = (1 << 8)
|
||||
};
|
||||
|
||||
static struct
|
||||
{
|
||||
stix_uint8_t flag; /* for single occurrence */
|
||||
stix_uint8_t dflag; /* for double occurrence */
|
||||
} lm_tab[26] =
|
||||
{
|
||||
{ 0, 0 }, /* a */
|
||||
{ 0, 0 }, /* b */
|
||||
{ 0, 0 }, /* c */
|
||||
{ 0, 0 }, /* d */
|
||||
{ 0, 0 }, /* e */
|
||||
{ 0, 0 }, /* f */
|
||||
{ 0, 0 }, /* g */
|
||||
{ LF_H, LF_C }, /* h */
|
||||
{ 0, 0 }, /* i */
|
||||
{ LF_J, 0 }, /* j */
|
||||
{ 0, 0 }, /* k */
|
||||
{ LF_L, LF_Q }, /* l */
|
||||
{ 0, 0 }, /* m */
|
||||
{ 0, 0 }, /* n */
|
||||
{ 0, 0 }, /* o */
|
||||
{ 0, 0 }, /* p */
|
||||
{ LF_Q, 0 }, /* q */
|
||||
{ 0, 0 }, /* r */
|
||||
{ 0, 0 }, /* s */
|
||||
{ LF_T, 0 }, /* t */
|
||||
{ 0, 0 }, /* u */
|
||||
{ 0, 0 }, /* v */
|
||||
{ 0, 0 }, /* w */
|
||||
{ 0, 0 }, /* z */
|
||||
{ 0, 0 }, /* y */
|
||||
{ LF_Z, 0 }, /* z */
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
FLAGC_DOT = (1 << 0),
|
||||
FLAGC_SPACE = (1 << 1),
|
||||
FLAGC_SHARP = (1 << 2),
|
||||
FLAGC_SIGN = (1 << 3),
|
||||
FLAGC_LEFTADJ = (1 << 4),
|
||||
FLAGC_ZEROPAD = (1 << 5),
|
||||
FLAGC_WIDTH = (1 << 6),
|
||||
FLAGC_PRECISION = (1 << 7),
|
||||
FLAGC_STAR1 = (1 << 8),
|
||||
FLAGC_STAR2 = (1 << 9),
|
||||
FLAGC_LENMOD = (1 << 10) /* length modifier */
|
||||
};
|
||||
|
||||
static const stix_bch_t hex2ascii_lower[] =
|
||||
{
|
||||
'0','1','2','3','4','5','6','7','8','9',
|
||||
'a','b','c','d','e','f','g','h','i','j','k','l','m',
|
||||
'n','o','p','q','r','s','t','u','v','w','x','y','z'
|
||||
};
|
||||
|
||||
static const stix_bch_t hex2ascii_upper[] =
|
||||
{
|
||||
'0','1','2','3','4','5','6','7','8','9',
|
||||
'A','B','C','D','E','F','G','H','I','J','K','L','M',
|
||||
'N','O','P','Q','R','S','T','U','V','W','X','H','Z'
|
||||
};
|
||||
|
||||
static stix_ooch_t ooch_nullstr[] = { '(','n','u','l','l', ')','\0' };
|
||||
static stix_bch_t bch_nullstr[] = { '(','n','u','l','l', ')','\0' };
|
||||
|
||||
typedef int (*stix_fmtout_put_t) (
|
||||
stix_t* stix,
|
||||
stix_ooch_t c
|
||||
);
|
||||
|
||||
typedef struct stix_fmtout_t stix_fmtout_t;
|
||||
struct stix_fmtout_t
|
||||
{
|
||||
stix_oow_t count; /* out */
|
||||
stix_oow_t limit; /* in */
|
||||
stix_fmtout_put_t put;
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/*
|
||||
* Put a NUL-terminated ASCII number (base <= 36) in a buffer in reverse
|
||||
* order; return an optional length and a pointer to the last character
|
||||
* written in the buffer (i.e., the first character of the string).
|
||||
* The buffer pointed to by `nbuf' must have length >= MAXNBUF.
|
||||
*/
|
||||
|
||||
static stix_bch_t* sprintn_lower (stix_bch_t* nbuf, stix_uintmax_t num, int base, stix_ooi_t *lenp)
|
||||
{
|
||||
stix_bch_t* p;
|
||||
|
||||
p = nbuf;
|
||||
*p = '\0';
|
||||
do { *++p = hex2ascii_lower[num % base]; } while (num /= base);
|
||||
|
||||
if (lenp) *lenp = p - nbuf;
|
||||
return p; /* returns the end */
|
||||
}
|
||||
|
||||
static stix_bch_t* sprintn_upper (stix_bch_t* nbuf, stix_uintmax_t num, int base, stix_ooi_t *lenp)
|
||||
{
|
||||
stix_bch_t* p;
|
||||
|
||||
p = nbuf;
|
||||
*p = '\0';
|
||||
do { *++p = hex2ascii_upper[num % base]; } while (num /= base);
|
||||
|
||||
if (lenp) *lenp = p - nbuf;
|
||||
return p; /* returns the end */
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static int put_ooch (stix_t* stix, stix_ooch_t ch)
|
||||
{
|
||||
|
||||
if (stix->log.len >= stix->log.capa)
|
||||
{
|
||||
stix_oow_t newcapa;
|
||||
stix_ooch_t* tmp;
|
||||
|
||||
newcapa = stix->log.capa + 512; /* TODO: adjust this capacity */
|
||||
tmp = stix_reallocmem (stix, stix->log.ptr, newcapa * STIX_SIZEOF(*tmp));
|
||||
if (!tmp) return -1;
|
||||
|
||||
stix->log.ptr = tmp;
|
||||
stix->log.capa = newcapa;
|
||||
}
|
||||
|
||||
stix->log.ptr[stix->log.len++] = ch;
|
||||
if (ch == '\n')
|
||||
{
|
||||
stix->vmprim.log_write (stix, 0, stix->log.ptr, stix->log.len);
|
||||
/* TODO: error handling */
|
||||
stix->log.len = 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#undef fmtchar_t
|
||||
#undef fmtoutv
|
||||
#define fmtchar_t stix_bch_t
|
||||
#define fmtoutv stix_bfmtoutv
|
||||
#include "fmtoutv.h"
|
||||
|
||||
#undef fmtchar_t
|
||||
#undef fmtoutv
|
||||
#define fmtchar_t stix_ooch_t
|
||||
#define fmtoutv stix_oofmtoutv
|
||||
#include "fmtoutv.h"
|
||||
|
||||
stix_ooi_t stix_bfmtout (stix_t* stix, const stix_bch_t* fmt, ...)
|
||||
{
|
||||
stix_ooi_t x;
|
||||
va_list ap;
|
||||
stix_fmtout_t fo;
|
||||
|
||||
fo.count = 0;
|
||||
fo.limit = STIX_TYPE_MAX(stix_ooi_t);
|
||||
fo.put = put_ooch;
|
||||
|
||||
va_start (ap, fmt);
|
||||
x = stix_bfmtoutv (stix, fmt, &fo, ap);
|
||||
va_end (ap);
|
||||
|
||||
return (x <= -1)? -1: fo.count;
|
||||
}
|
||||
|
||||
stix_ooi_t stix_oofmtout (stix_t* stix, const stix_ooch_t* fmt, ...)
|
||||
{
|
||||
stix_ooi_t x;
|
||||
va_list ap;
|
||||
stix_fmtout_t fo;
|
||||
|
||||
fo.count = 0;
|
||||
fo.limit = STIX_TYPE_MAX(stix_ooi_t);
|
||||
fo.put = put_ooch;
|
||||
|
||||
va_start (ap, fmt);
|
||||
x = stix_oofmtoutv (stix, fmt, &fo, ap);
|
||||
va_end (ap);
|
||||
|
||||
return (x <= -1)? -1: fo.count;
|
||||
}
|
900
stix/lib/fmtoutv.h
Normal file
900
stix/lib/fmtoutv.h
Normal file
@ -0,0 +1,900 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2014-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains a formatted output routine derived from kvprintf()
|
||||
* of FreeBSD. It has been heavily modified and bug-fixed.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1986, 1988, 1991, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* (c) UNIX System Laboratories, Inc.
|
||||
* All or some portions of this file are derived from material licensed
|
||||
* to the University of California by American Telephone and Telegraph
|
||||
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
|
||||
* the permission of UNIX System Laboratories, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* NOTE: data output is aborted if the data limit is reached or
|
||||
* I/O error occurs */
|
||||
|
||||
#undef PUT_CHAR
|
||||
|
||||
#define PUT_CHAR(stix,c) do { \
|
||||
int xx; \
|
||||
if (data->count >= data->limit) goto done; \
|
||||
if ((xx = data->put (stix, c)) <= -1) goto oops; \
|
||||
if (xx == 0) goto done; \
|
||||
data->count++; \
|
||||
} while (0)
|
||||
|
||||
int fmtoutv (stix_t* stix, const fmtchar_t* fmt, stix_fmtout_t* data, va_list ap)
|
||||
{
|
||||
const fmtchar_t* percent;
|
||||
stix_bch_t nbuf[MAXNBUF], bch;
|
||||
const stix_bch_t* nbufp;
|
||||
int n, base, neg, sign;
|
||||
stix_ooi_t tmp, width, precision;
|
||||
stix_ooch_t ch, padc;
|
||||
int lm_flag, lm_dflag, flagc, numlen;
|
||||
stix_uintmax_t num = 0;
|
||||
int stop = 0;
|
||||
|
||||
#if 0
|
||||
stix_bchbuf_t* fltfmt;
|
||||
stix_oochbuf_t* fltout;
|
||||
#endif
|
||||
stix_bch_t* (*sprintn) (stix_bch_t* nbuf, stix_uintmax_t num, int base, stix_ooi_t* lenp);
|
||||
|
||||
data->count = 0;
|
||||
|
||||
#if 0
|
||||
fltfmt = &stix->d->fltfmt;
|
||||
fltout = &stix->d->fltout;
|
||||
|
||||
fltfmt->ptr = fltfmt->sbuf;
|
||||
fltfmt->capa = STIX_COUNTOF(fltfmt->sbuf) - 1;
|
||||
|
||||
fltout->ptr = fltout->sbuf;
|
||||
fltout->capa = STIX_COUNTOF(fltout->sbuf) - 1;
|
||||
#endif
|
||||
|
||||
while (1)
|
||||
{
|
||||
while ((ch = *fmt++) != '%' || stop)
|
||||
{
|
||||
if (ch == '\0') goto done;
|
||||
PUT_CHAR (stix, ch);
|
||||
}
|
||||
percent = fmt - 1;
|
||||
|
||||
padc = ' ';
|
||||
width = 0; precision = 0;
|
||||
neg = 0; sign = 0;
|
||||
|
||||
lm_flag = 0; lm_dflag = 0; flagc = 0;
|
||||
sprintn = sprintn_lower;
|
||||
|
||||
reswitch:
|
||||
switch (ch = *fmt++)
|
||||
{
|
||||
case '%': /* %% */
|
||||
bch = ch;
|
||||
goto print_lowercase_c;
|
||||
|
||||
/* flag characters */
|
||||
case '.':
|
||||
if (flagc & FLAGC_DOT) goto invalid_format;
|
||||
flagc |= FLAGC_DOT;
|
||||
goto reswitch;
|
||||
|
||||
case '#':
|
||||
if (flagc & (FLAGC_WIDTH | FLAGC_DOT | FLAGC_LENMOD)) goto invalid_format;
|
||||
flagc |= FLAGC_SHARP;
|
||||
goto reswitch;
|
||||
|
||||
case ' ':
|
||||
if (flagc & (FLAGC_WIDTH | FLAGC_DOT | FLAGC_LENMOD)) goto invalid_format;
|
||||
flagc |= FLAGC_SPACE;
|
||||
goto reswitch;
|
||||
|
||||
case '+': /* place sign for signed conversion */
|
||||
if (flagc & (FLAGC_WIDTH | FLAGC_DOT | FLAGC_LENMOD)) goto invalid_format;
|
||||
flagc |= FLAGC_SIGN;
|
||||
goto reswitch;
|
||||
|
||||
case '-': /* left adjusted */
|
||||
if (flagc & (FLAGC_WIDTH | FLAGC_DOT | FLAGC_LENMOD)) goto invalid_format;
|
||||
if (flagc & FLAGC_DOT)
|
||||
{
|
||||
goto invalid_format;
|
||||
}
|
||||
else
|
||||
{
|
||||
flagc |= FLAGC_LEFTADJ;
|
||||
if (flagc & FLAGC_ZEROPAD)
|
||||
{
|
||||
padc = ' ';
|
||||
flagc &= ~FLAGC_ZEROPAD;
|
||||
}
|
||||
}
|
||||
|
||||
goto reswitch;
|
||||
|
||||
case '*': /* take the length from the parameter */
|
||||
if (flagc & FLAGC_DOT)
|
||||
{
|
||||
if (flagc & (FLAGC_STAR2 | FLAGC_PRECISION)) goto invalid_format;
|
||||
flagc |= FLAGC_STAR2;
|
||||
|
||||
precision = va_arg(ap, stix_ooi_t); /* this deviates from the standard printf that accepts 'int' */
|
||||
if (precision < 0)
|
||||
{
|
||||
/* if precision is less than 0,
|
||||
* treat it as if no .precision is specified */
|
||||
flagc &= ~FLAGC_DOT;
|
||||
precision = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (flagc & (FLAGC_STAR1 | FLAGC_WIDTH)) goto invalid_format;
|
||||
flagc |= FLAGC_STAR1;
|
||||
|
||||
width = va_arg(ap, stix_ooi_t); /* it deviates from the standard printf that accepts 'int' */
|
||||
if (width < 0)
|
||||
{
|
||||
/*
|
||||
if (flagc & FLAGC_LEFTADJ)
|
||||
flagc &= ~FLAGC_LEFTADJ;
|
||||
else
|
||||
*/
|
||||
flagc |= FLAGC_LEFTADJ;
|
||||
width = -width;
|
||||
}
|
||||
}
|
||||
goto reswitch;
|
||||
|
||||
case '0': /* zero pad */
|
||||
if (flagc & FLAGC_LENMOD) goto invalid_format;
|
||||
if (!(flagc & (FLAGC_DOT | FLAGC_LEFTADJ)))
|
||||
{
|
||||
padc = '0';
|
||||
flagc |= FLAGC_ZEROPAD;
|
||||
goto reswitch;
|
||||
}
|
||||
/* end of flags characters */
|
||||
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
for (n = 0;; ++fmt)
|
||||
{
|
||||
n = n * 10 + ch - '0';
|
||||
ch = *fmt;
|
||||
if (ch < '0' || ch > '9') break;
|
||||
}
|
||||
if (flagc & FLAGC_DOT)
|
||||
{
|
||||
if (flagc & FLAGC_STAR2) goto invalid_format;
|
||||
precision = n;
|
||||
flagc |= FLAGC_PRECISION;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (flagc & FLAGC_STAR1) goto invalid_format;
|
||||
width = n;
|
||||
flagc |= FLAGC_WIDTH;
|
||||
}
|
||||
goto reswitch;
|
||||
|
||||
/* length modifiers */
|
||||
case 'h': /* short int */
|
||||
case 'l': /* long int */
|
||||
case 'q': /* long long int */
|
||||
case 'j': /* uintmax_t */
|
||||
case 'z': /* size_t */
|
||||
case 't': /* ptrdiff_t */
|
||||
if (lm_flag & (LF_LD | LF_QD)) goto invalid_format;
|
||||
|
||||
flagc |= FLAGC_LENMOD;
|
||||
if (lm_dflag)
|
||||
{
|
||||
/* error */
|
||||
goto invalid_format;
|
||||
}
|
||||
else if (lm_flag)
|
||||
{
|
||||
if (lm_tab[ch - 'a'].dflag && lm_flag == lm_tab[ch - 'a'].flag)
|
||||
{
|
||||
lm_flag &= ~lm_tab[ch - 'a'].flag;
|
||||
lm_flag |= lm_tab[ch - 'a'].dflag;
|
||||
lm_dflag |= lm_flag;
|
||||
goto reswitch;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* error */
|
||||
goto invalid_format;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lm_flag |= lm_tab[ch - 'a'].flag;
|
||||
goto reswitch;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'L': /* long double */
|
||||
if (flagc & FLAGC_LENMOD)
|
||||
{
|
||||
/* conflict with other length modifier */
|
||||
goto invalid_format;
|
||||
}
|
||||
flagc |= FLAGC_LENMOD;
|
||||
lm_flag |= LF_LD;
|
||||
goto reswitch;
|
||||
|
||||
case 'Q': /* __float128 */
|
||||
if (flagc & FLAGC_LENMOD)
|
||||
{
|
||||
/* conflict with other length modifier */
|
||||
goto invalid_format;
|
||||
}
|
||||
flagc |= FLAGC_LENMOD;
|
||||
lm_flag |= LF_QD;
|
||||
goto reswitch;
|
||||
|
||||
/* end of length modifiers */
|
||||
|
||||
case 'n':
|
||||
if (lm_flag & LF_J) /* j */
|
||||
*(va_arg(ap, stix_intmax_t*)) = data->count;
|
||||
else if (lm_flag & LF_Z) /* z */
|
||||
*(va_arg(ap, stix_ooi_t*)) = data->count;
|
||||
#if (STIX_SIZEOF_LONG_LONG > 0)
|
||||
else if (lm_flag & LF_Q) /* ll */
|
||||
*(va_arg(ap, long long int*)) = data->count;
|
||||
#endif
|
||||
else if (lm_flag & LF_L) /* l */
|
||||
*(va_arg(ap, long int*)) = data->count;
|
||||
else if (lm_flag & LF_H) /* h */
|
||||
*(va_arg(ap, short int*)) = data->count;
|
||||
else if (lm_flag & LF_C) /* hh */
|
||||
*(va_arg(ap, char*)) = data->count;
|
||||
else if (flagc & FLAGC_LENMOD)
|
||||
{
|
||||
stix->errnum = STIX_EINVAL;
|
||||
goto oops;
|
||||
}
|
||||
else
|
||||
*(va_arg(ap, int*)) = data->count;
|
||||
break;
|
||||
|
||||
/* signed integer conversions */
|
||||
case 'd':
|
||||
case 'i': /* signed conversion */
|
||||
base = 10;
|
||||
sign = 1;
|
||||
goto handle_sign;
|
||||
/* end of signed integer conversions */
|
||||
|
||||
/* unsigned integer conversions */
|
||||
case 'o':
|
||||
base = 8;
|
||||
goto handle_nosign;
|
||||
case 'u':
|
||||
base = 10;
|
||||
goto handle_nosign;
|
||||
case 'X':
|
||||
sprintn = sprintn_upper;
|
||||
case 'x':
|
||||
base = 16;
|
||||
goto handle_nosign;
|
||||
/* end of unsigned integer conversions */
|
||||
|
||||
case 'p': /* pointer */
|
||||
base = 16;
|
||||
|
||||
if (width == 0) flagc |= FLAGC_SHARP;
|
||||
else flagc &= ~FLAGC_SHARP;
|
||||
|
||||
num = (stix_uintptr_t)va_arg(ap, void*);
|
||||
goto number;
|
||||
|
||||
case 'c':
|
||||
{
|
||||
/* zeropad must not take effect for 'c' */
|
||||
if (flagc & FLAGC_ZEROPAD) padc = ' ';
|
||||
if (lm_flag & LF_L) goto uppercase_c;
|
||||
|
||||
lowercase_c:
|
||||
bch = STIX_SIZEOF(stix_bch_t) < STIX_SIZEOF(int)? va_arg(ap, int): va_arg(ap, stix_bch_t);
|
||||
|
||||
print_lowercase_c:
|
||||
/* precision 0 doesn't kill the letter */
|
||||
width--;
|
||||
if (!(flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
PUT_CHAR (stix, bch);
|
||||
if ((flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'C':
|
||||
{
|
||||
stix_ooch_t ooch;
|
||||
|
||||
/* zeropad must not take effect for 'C' */
|
||||
if (flagc & FLAGC_ZEROPAD) padc = ' ';
|
||||
if (lm_flag & LF_H) goto lowercase_c;
|
||||
uppercase_c:
|
||||
ooch = STIX_SIZEOF(stix_ooch_t) < STIX_SIZEOF(int)? va_arg(ap, int): va_arg(ap, stix_ooch_t);
|
||||
|
||||
/* precision 0 doesn't kill the letter */
|
||||
width--;
|
||||
if (!(flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
|
||||
PUT_CHAR (stix, ooch);
|
||||
|
||||
if ((flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 's':
|
||||
{
|
||||
const stix_bch_t* bsp;
|
||||
stix_oow_t bslen, slen;
|
||||
|
||||
/* zeropad must not take effect for 'S' */
|
||||
if (flagc & FLAGC_ZEROPAD) padc = ' ';
|
||||
if (lm_flag & LF_H) goto lowercase_s;
|
||||
lowercase_s:
|
||||
|
||||
bsp = va_arg (ap, stix_bch_t*);
|
||||
if (bsp == STIX_NULL) bsp = bch_nullstr;
|
||||
|
||||
/* get the length */
|
||||
for (bslen = 0; bsp[bslen]; bslen++);
|
||||
|
||||
if (stix_utf8toucs (bsp, &bslen, STIX_NULL, &slen) <= -1)
|
||||
{
|
||||
/* conversion error */
|
||||
stix->errnum = STIX_EECERR;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* slen holds the length after conversion */
|
||||
n = slen;
|
||||
if ((flagc & FLAGC_DOT) && precision < slen) n = precision;
|
||||
width -= n;
|
||||
|
||||
if (!(flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
|
||||
{
|
||||
stix_ooch_t conv_buf[32];
|
||||
stix_oow_t i, conv_len, src_len, tot_len = 0;
|
||||
while (n > 0)
|
||||
{
|
||||
STIX_ASSERT (bslen > tot_len);
|
||||
|
||||
src_len = bslen - tot_len;
|
||||
conv_len = STIX_COUNTOF(conv_buf);
|
||||
|
||||
/* this must not fail since the dry-run above was successful */
|
||||
stix_utf8toucs (&bsp[tot_len], &src_len, conv_buf, &conv_len);
|
||||
tot_len += src_len;
|
||||
|
||||
if (conv_len > n) conv_len = n;
|
||||
for (i = 0; i < conv_len; i++)
|
||||
{
|
||||
PUT_CHAR (stix, conv_buf[i]);
|
||||
}
|
||||
|
||||
n -= conv_len;
|
||||
}
|
||||
}
|
||||
|
||||
if ((flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'S':
|
||||
{
|
||||
const stix_ooch_t* sp;
|
||||
|
||||
/* zeropad must not take effect for 's' */
|
||||
if (flagc & FLAGC_ZEROPAD) padc = ' ';
|
||||
if (lm_flag & LF_L) goto uppercase_s;
|
||||
uppercase_s:
|
||||
sp = va_arg (ap, stix_ooch_t*);
|
||||
if (sp == STIX_NULL) sp = ooch_nullstr;
|
||||
|
||||
if (flagc & FLAGC_DOT)
|
||||
{
|
||||
for (n = 0; n < precision && sp[n]; n++);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (n = 0; sp[n]; n++);
|
||||
}
|
||||
|
||||
width -= n;
|
||||
|
||||
if (!(flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
while (n--) PUT_CHAR (stix, *sp++);
|
||||
if ((flagc & FLAGC_LEFTADJ) && width > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'O': /* object - ignore precision, width, adjustment */
|
||||
print_object (stix, va_arg (ap, stix_oop_t));
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'f':
|
||||
case 'F':
|
||||
case 'g':
|
||||
case 'G':
|
||||
/*
|
||||
case 'a':
|
||||
case 'A':
|
||||
*/
|
||||
{
|
||||
/* let me rely on snprintf until i implement float-point to string conversion */
|
||||
int q;
|
||||
stix_oow_t fmtlen;
|
||||
#if (STIX_SIZEOF___FLOAT128 > 0) && defined(HAVE_QUADMATH_SNPRINTF)
|
||||
__float128 v_qd;
|
||||
#endif
|
||||
long double v_ld;
|
||||
double v_d;
|
||||
int dtype = 0;
|
||||
stix_oow_t newcapa;
|
||||
|
||||
if (lm_flag & LF_J)
|
||||
{
|
||||
#if (STIX_SIZEOF___FLOAT128 > 0) && defined(HAVE_QUADMATH_SNPRINTF) && (STIX_SIZEOF_FLTMAX_T == STIX_SIZEOF___FLOAT128)
|
||||
v_qd = va_arg (ap, stix_fltmax_t);
|
||||
dtype = LF_QD;
|
||||
#elif STIX_SIZEOF_FLTMAX_T == STIX_SIZEOF_DOUBLE
|
||||
v_d = va_arg (ap, stix_fltmax_t);
|
||||
#elif STIX_SIZEOF_FLTMAX_T == STIX_SIZEOF_LONG_DOUBLE
|
||||
v_ld = va_arg (ap, stix_fltmax_t);
|
||||
dtype = LF_LD;
|
||||
#else
|
||||
#error Unsupported stix_flt_t
|
||||
#endif
|
||||
}
|
||||
else if (lm_flag & LF_Z)
|
||||
{
|
||||
/* stix_flt_t is limited to double or long double */
|
||||
|
||||
/* precedence goes to double if sizeof(double) == sizeof(long double)
|
||||
* for example, %Lf didn't work on some old platforms.
|
||||
* so i prefer the format specifier with no modifier.
|
||||
*/
|
||||
#if STIX_SIZEOF_FLT_T == STIX_SIZEOF_DOUBLE
|
||||
v_d = va_arg (ap, stix_flt_t);
|
||||
#elif STIX_SIZEOF_FLT_T == STIX_SIZEOF_LONG_DOUBLE
|
||||
v_ld = va_arg (ap, stix_flt_t);
|
||||
dtype = LF_LD;
|
||||
#else
|
||||
#error Unsupported stix_flt_t
|
||||
#endif
|
||||
}
|
||||
else if (lm_flag & (LF_LD | LF_L))
|
||||
{
|
||||
v_ld = va_arg (ap, long double);
|
||||
dtype = LF_LD;
|
||||
}
|
||||
#if (STIX_SIZEOF___FLOAT128 > 0) && defined(HAVE_QUADMATH_SNPRINTF)
|
||||
else if (lm_flag & (LF_QD | LF_Q))
|
||||
{
|
||||
v_qd = va_arg (ap, __float128);
|
||||
dtype = LF_QD;
|
||||
}
|
||||
#endif
|
||||
else if (flagc & FLAGC_LENMOD)
|
||||
{
|
||||
stix->errnum = STIX_EINVAL;
|
||||
goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
v_d = va_arg (ap, double);
|
||||
}
|
||||
|
||||
fmtlen = fmt - percent;
|
||||
if (fmtlen > fltfmt->capa)
|
||||
{
|
||||
if (fltfmt->ptr == fltfmt->sbuf)
|
||||
{
|
||||
fltfmt->ptr = STIX_MMGR_ALLOC (STIX_MMGR_GETDFL(), STIX_SIZEOF(*fltfmt->ptr) * (fmtlen + 1));
|
||||
if (fltfmt->ptr == STIX_NULL) goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
stix_mchar_t* tmpptr;
|
||||
|
||||
tmpptr = STIX_MMGR_REALLOC (STIX_MMGR_GETDFL(), fltfmt->ptr, STIX_SIZEOF(*fltfmt->ptr) * (fmtlen + 1));
|
||||
if (tmpptr == STIX_NULL) goto oops;
|
||||
fltfmt->ptr = tmpptr;
|
||||
}
|
||||
|
||||
fltfmt->capa = fmtlen;
|
||||
}
|
||||
|
||||
/* compose back the format specifier */
|
||||
fmtlen = 0;
|
||||
fltfmt->ptr[fmtlen++] = '%';
|
||||
if (flagc & FLAGC_SPACE) fltfmt->ptr[fmtlen++] = ' ';
|
||||
if (flagc & FLAGC_SHARP) fltfmt->ptr[fmtlen++] = '#';
|
||||
if (flagc & FLAGC_SIGN) fltfmt->ptr[fmtlen++] = '+';
|
||||
if (flagc & FLAGC_LEFTADJ) fltfmt->ptr[fmtlen++] = '-';
|
||||
if (flagc & FLAGC_ZEROPAD) fltfmt->ptr[fmtlen++] = '0';
|
||||
|
||||
if (flagc & FLAGC_STAR1) fltfmt->ptr[fmtlen++] = '*';
|
||||
else if (flagc & FLAGC_WIDTH)
|
||||
{
|
||||
fmtlen += stix_fmtuintmaxtombs (
|
||||
&fltfmt->ptr[fmtlen], fltfmt->capa - fmtlen,
|
||||
width, 10, -1, '\0', STIX_NULL);
|
||||
}
|
||||
if (flagc & FLAGC_DOT) fltfmt->ptr[fmtlen++] = '.';
|
||||
if (flagc & FLAGC_STAR2) fltfmt->ptr[fmtlen++] = '*';
|
||||
else if (flagc & FLAGC_PRECISION)
|
||||
{
|
||||
fmtlen += stix_fmtuintmaxtombs (
|
||||
&fltfmt->ptr[fmtlen], fltfmt->capa - fmtlen,
|
||||
precision, 10, -1, '\0', STIX_NULL);
|
||||
}
|
||||
|
||||
if (dtype == LF_LD)
|
||||
fltfmt->ptr[fmtlen++] = 'L';
|
||||
#if (STIX_SIZEOF___FLOAT128 > 0)
|
||||
else if (dtype == LF_QD)
|
||||
fltfmt->ptr[fmtlen++] = 'Q';
|
||||
#endif
|
||||
|
||||
fltfmt->ptr[fmtlen++] = ch;
|
||||
fltfmt->ptr[fmtlen] = '\0';
|
||||
|
||||
#if defined(HAVE_SNPRINTF)
|
||||
/* nothing special here */
|
||||
#else
|
||||
/* best effort to avoid buffer overflow when no snprintf is available.
|
||||
* i really can't do much if it happens. */
|
||||
newcapa = precision + width + 32;
|
||||
if (fltout->capa < newcapa)
|
||||
{
|
||||
STIX_ASSERT (fltout->ptr == fltout->sbuf);
|
||||
|
||||
fltout->ptr = STIX_MMGR_ALLOC (STIX_MMGR_GETDFL(), STIX_SIZEOF(char_t) * (newcapa + 1));
|
||||
if (fltout->ptr == STIX_NULL) goto oops;
|
||||
fltout->capa = newcapa;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
if (dtype == LF_LD)
|
||||
{
|
||||
#if defined(HAVE_SNPRINTF)
|
||||
q = snprintf ((stix_mchar_t*)fltout->ptr, fltout->capa + 1, fltfmt->ptr, v_ld);
|
||||
#else
|
||||
q = sprintf ((stix_mchar_t*)fltout->ptr, fltfmt->ptr, v_ld);
|
||||
#endif
|
||||
}
|
||||
#if (STIX_SIZEOF___FLOAT128 > 0) && defined(HAVE_QUADMATH_SNPRINTF)
|
||||
else if (dtype == LF_QD)
|
||||
{
|
||||
q = quadmath_snprintf ((stix_mchar_t*)fltout->ptr, fltout->capa + 1, fltfmt->ptr, v_qd);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
#if defined(HAVE_SNPRINTF)
|
||||
q = snprintf ((stix_mchar_t*)fltout->ptr, fltout->capa + 1, fltfmt->ptr, v_d);
|
||||
#else
|
||||
q = sprintf ((stix_mchar_t*)fltout->ptr, fltfmt->ptr, v_d);
|
||||
#endif
|
||||
}
|
||||
if (q <= -1) goto oops;
|
||||
if (q <= fltout->capa) break;
|
||||
|
||||
newcapa = fltout->capa * 2;
|
||||
if (newcapa < q) newcapa = q;
|
||||
|
||||
if (fltout->ptr == fltout->sbuf)
|
||||
{
|
||||
fltout->ptr = STIX_MMGR_ALLOC (STIX_MMGR_GETDFL(), STIX_SIZEOF(char_t) * (newcapa + 1));
|
||||
if (fltout->ptr == STIX_NULL) goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
char_t* tmpptr;
|
||||
|
||||
tmpptr = STIX_MMGR_REALLOC (STIX_MMGR_GETDFL(), fltout->ptr, STIX_SIZEOF(char_t) * (newcapa + 1));
|
||||
if (tmpptr == STIX_NULL) goto oops;
|
||||
fltout->ptr = tmpptr;
|
||||
}
|
||||
fltout->capa = newcapa;
|
||||
}
|
||||
|
||||
if (STIX_SIZEOF(char_t) != STIX_SIZEOF(stix_mchar_t))
|
||||
{
|
||||
fltout->ptr[q] = '\0';
|
||||
while (q > 0)
|
||||
{
|
||||
q--;
|
||||
fltout->ptr[q] = ((stix_mchar_t*)fltout->ptr)[q];
|
||||
}
|
||||
}
|
||||
|
||||
sp = fltout->ptr;
|
||||
flagc &= ~FLAGC_DOT;
|
||||
width = 0;
|
||||
precision = 0;
|
||||
goto print_lowercase_s;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
handle_nosign:
|
||||
sign = 0;
|
||||
if (lm_flag & LF_J)
|
||||
{
|
||||
#if defined(__GNUC__) && \
|
||||
(STIX_SIZEOF_UINTMAX_T > STIX_SIZEOF_OOW_T) && \
|
||||
(STIX_SIZEOF_UINTMAX_T != STIX_SIZEOF_LONG_LONG) && \
|
||||
(STIX_SIZEOF_UINTMAX_T != STIX_SIZEOF_LONG)
|
||||
/* GCC-compiled binaries crashed when getting stix_uintmax_t with va_arg.
|
||||
* This is just a work-around for it */
|
||||
int i;
|
||||
for (i = 0, num = 0; i < STIX_SIZEOF(stix_uintmax_t) / STIX_SIZEOF(stix_oow_t); i++)
|
||||
{
|
||||
#if defined(STIX_ENDIAN_BIG)
|
||||
num = num << (8 * STIX_SIZEOF(stix_oow_t)) | (va_arg (ap, stix_oow_t));
|
||||
#else
|
||||
register int shift = i * STIX_SIZEOF(stix_oow_t);
|
||||
stix_oow_t x = va_arg (ap, stix_oow_t);
|
||||
num |= (stix_uintmax_t)x << (shift * 8);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
num = va_arg (ap, stix_uintmax_t);
|
||||
#endif
|
||||
}
|
||||
#if 0
|
||||
else if (lm_flag & LF_T)
|
||||
num = va_arg (ap, stix_ptrdiff_t);
|
||||
#endif
|
||||
else if (lm_flag & LF_Z)
|
||||
num = va_arg (ap, stix_oow_t);
|
||||
#if (STIX_SIZEOF_LONG_LONG > 0)
|
||||
else if (lm_flag & LF_Q)
|
||||
num = va_arg (ap, unsigned long long int);
|
||||
#endif
|
||||
else if (lm_flag & (LF_L | LF_LD))
|
||||
num = va_arg (ap, unsigned long int);
|
||||
else if (lm_flag & LF_H)
|
||||
num = (unsigned short int)va_arg (ap, int);
|
||||
else if (lm_flag & LF_C)
|
||||
num = (unsigned char)va_arg (ap, int);
|
||||
else
|
||||
num = va_arg (ap, unsigned int);
|
||||
goto number;
|
||||
|
||||
handle_sign:
|
||||
if (lm_flag & LF_J)
|
||||
{
|
||||
#if defined(__GNUC__) && \
|
||||
(STIX_SIZEOF_INTMAX_T > STIX_SIZEOF_OOI_T) && \
|
||||
(STIX_SIZEOF_UINTMAX_T != STIX_SIZEOF_LONG_LONG) && \
|
||||
(STIX_SIZEOF_UINTMAX_T != STIX_SIZEOF_LONG)
|
||||
/* GCC-compiled binraries crashed when getting stix_uintmax_t with va_arg.
|
||||
* This is just a work-around for it */
|
||||
int i;
|
||||
for (i = 0, num = 0; i < STIX_SIZEOF(stix_intmax_t) / STIX_SIZEOF(stix_oow_t); i++)
|
||||
{
|
||||
#if defined(STIX_ENDIAN_BIG)
|
||||
num = num << (8 * STIX_SIZEOF(stix_oow_t)) | (va_arg (ap, stix_oow_t));
|
||||
#else
|
||||
register int shift = i * STIX_SIZEOF(stix_oow_t);
|
||||
stix_oow_t x = va_arg (ap, stix_oow_t);
|
||||
num |= (stix_uintmax_t)x << (shift * 8);
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
num = va_arg (ap, stix_intmax_t);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
else if (lm_flag & LF_T)
|
||||
num = va_arg(ap, stix_ptrdiff_t);
|
||||
#endif
|
||||
else if (lm_flag & LF_Z)
|
||||
num = va_arg (ap, stix_ooi_t);
|
||||
#if (STIX_SIZEOF_LONG_LONG > 0)
|
||||
else if (lm_flag & LF_Q)
|
||||
num = va_arg (ap, long long int);
|
||||
#endif
|
||||
else if (lm_flag & (LF_L | LF_LD))
|
||||
num = va_arg (ap, long int);
|
||||
else if (lm_flag & LF_H)
|
||||
num = (short int)va_arg (ap, int);
|
||||
else if (lm_flag & LF_C)
|
||||
num = (char)va_arg (ap, int);
|
||||
else
|
||||
num = va_arg (ap, int);
|
||||
|
||||
number:
|
||||
if (sign && (stix_intmax_t)num < 0)
|
||||
{
|
||||
neg = 1;
|
||||
num = -(stix_intmax_t)num;
|
||||
}
|
||||
|
||||
nbufp = sprintn (nbuf, num, base, &tmp);
|
||||
if ((flagc & FLAGC_SHARP) && num != 0)
|
||||
{
|
||||
if (base == 8) tmp++;
|
||||
else if (base == 16) tmp += 2;
|
||||
}
|
||||
if (neg) tmp++;
|
||||
else if (flagc & FLAGC_SIGN) tmp++;
|
||||
else if (flagc & FLAGC_SPACE) tmp++;
|
||||
|
||||
numlen = nbufp - nbuf;
|
||||
if ((flagc & FLAGC_DOT) && precision > numlen)
|
||||
{
|
||||
/* extra zeros fro precision specified */
|
||||
tmp += (precision - numlen);
|
||||
}
|
||||
|
||||
if (!(flagc & FLAGC_LEFTADJ) && !(flagc & FLAGC_ZEROPAD) && width > 0 && (width -= tmp) > 0)
|
||||
{
|
||||
while (width--) PUT_CHAR (stix, padc);
|
||||
}
|
||||
|
||||
if (neg) PUT_CHAR (stix, '-');
|
||||
else if (flagc & FLAGC_SIGN) PUT_CHAR (stix, '+');
|
||||
else if (flagc & FLAGC_SPACE) PUT_CHAR (stix, ' ');
|
||||
|
||||
if ((flagc & FLAGC_SHARP) && num != 0)
|
||||
{
|
||||
if (base == 8)
|
||||
{
|
||||
PUT_CHAR (stix, '0');
|
||||
}
|
||||
else if (base == 16)
|
||||
{
|
||||
PUT_CHAR (stix, '0');
|
||||
PUT_CHAR (stix, 'x');
|
||||
}
|
||||
}
|
||||
|
||||
if ((flagc & FLAGC_DOT) && precision > numlen)
|
||||
{
|
||||
/* extra zeros for precision specified */
|
||||
while (numlen < precision)
|
||||
{
|
||||
PUT_CHAR (stix, '0');
|
||||
numlen++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(flagc & FLAGC_LEFTADJ) && width > 0 && (width -= tmp) > 0)
|
||||
{
|
||||
while (width-- > 0) PUT_CHAR (stix, padc);
|
||||
}
|
||||
|
||||
while (*nbufp) PUT_CHAR (stix, *nbufp--); /* output actual digits */
|
||||
|
||||
if ((flagc & FLAGC_LEFTADJ) && width > 0 && (width -= tmp) > 0)
|
||||
{
|
||||
while (width-- > 0) PUT_CHAR (stix, padc);
|
||||
}
|
||||
break;
|
||||
|
||||
invalid_format:
|
||||
while (percent < fmt) PUT_CHAR (stix, *percent++);
|
||||
break;
|
||||
|
||||
default:
|
||||
while (percent < fmt) PUT_CHAR (stix, *percent++);
|
||||
/*
|
||||
* Since we ignore an formatting argument it is no
|
||||
* longer safe to obey the remaining formatting
|
||||
* arguments as the arguments will no longer match
|
||||
* the format specs.
|
||||
*/
|
||||
stop = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
return (stix_ooi_t)-1;
|
||||
}
|
||||
#undef PUT_CHAR
|
@ -342,10 +342,10 @@ static void log_write (stix_t* stix, int mask, const stix_ooch_t* msg, stix_oow_
|
||||
|
||||
msgidx = 0;
|
||||
|
||||
while (1)
|
||||
while (len > 0)
|
||||
{
|
||||
ucslen = len;
|
||||
bcslen = STIX_COUNTOF(buf) - len;
|
||||
bcslen = STIX_COUNTOF(buf);
|
||||
|
||||
n = stix_ucstoutf8 (&msg[msgidx], &ucslen, buf, &bcslen);
|
||||
if (n == 0)
|
||||
@ -592,7 +592,6 @@ int main (int argc, char* argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
stix_oow_t tab_size;
|
||||
|
||||
|
@ -573,8 +573,32 @@ struct stix_compiler_t
|
||||
} mth;
|
||||
};
|
||||
|
||||
typedef struct stix_bchbuf_t stix_bchbuf_t;
|
||||
struct stix_bchbuf_t
|
||||
{
|
||||
stix_bch_t sbuf[128];
|
||||
stix_bch_t* ptr;
|
||||
stix_oow_t capa;
|
||||
};
|
||||
|
||||
typedef struct stix_oochbuf_t stix_oochbuf_t;
|
||||
struct stix_oochbuf_t
|
||||
{
|
||||
stix_ooch_t sbuf[128];
|
||||
stix_ooch_t* ptr;
|
||||
stix_oow_t capa;
|
||||
};
|
||||
|
||||
struct stix_decoder_t
|
||||
{
|
||||
stix_oochbuf_t fltout;
|
||||
stix_bchbuf_t fltfmt;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if defined(STIX_USE_OBJECT_TRAILER)
|
||||
/* let it point to the trailer of the method */
|
||||
# define SET_ACTIVE_METHOD_CODE(stix) ((stix)->active_code = (stix_oob_t*)&(stix)->active_method->slot[STIX_OBJ_GET_SIZE((stix)->active_method) + 1 - STIX_METHOD_NAMED_INSTVARS])
|
||||
@ -1299,6 +1323,21 @@ int stix_getprimno (
|
||||
const stix_oocs_t* name
|
||||
);
|
||||
|
||||
/* ========================================================================= */
|
||||
/* fmt.c */
|
||||
/* ========================================================================= */
|
||||
stix_ooi_t stix_bfmtout (
|
||||
stix_t* stix,
|
||||
const stix_bch_t* fmt,
|
||||
...
|
||||
);
|
||||
|
||||
|
||||
stix_ooi_t stix_oofmtout (
|
||||
stix_t* stix,
|
||||
const stix_ooch_t* fmt,
|
||||
...
|
||||
);
|
||||
/* TODO: remove debugging functions */
|
||||
/* ========================================================================= */
|
||||
/* debug.c */
|
||||
@ -1309,6 +1348,8 @@ void print_oocs (const stix_oocs_t* name);
|
||||
void print_object (stix_t* stix, stix_oop_t oop);
|
||||
void dump_object (stix_t* stix, stix_oop_t oop, const char* title);
|
||||
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
@ -55,7 +55,7 @@ extern "C" {
|
||||
|
||||
|
||||
/* ========================================================================= */
|
||||
/* stix-utl.c */
|
||||
/* utl.c */
|
||||
/* ========================================================================= */
|
||||
stix_oow_t stix_hashbytes (
|
||||
const stix_oob_t* ptr,
|
||||
@ -147,6 +147,7 @@ stix_oow_t stix_countbcstr (
|
||||
const stix_bch_t* str
|
||||
);
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
@ -157,6 +157,16 @@ void stix_fini (stix_t* stix)
|
||||
|
||||
/* deregister all callbacks */
|
||||
while (stix->cblist) stix_deregcb (stix, stix->cblist);
|
||||
|
||||
if (stix->log.ptr)
|
||||
{
|
||||
/* make sure to flush your log message */
|
||||
/* TODO: flush unwritten message */
|
||||
|
||||
stix_freemem (stix, stix->log.ptr);
|
||||
stix->log.capa = 0;
|
||||
stix->log.len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
stix_mmgr_t* stix_getmmgr (stix_t* stix)
|
||||
|
@ -738,6 +738,7 @@ typedef struct stix_prim_mod_data_t stix_prim_mod_data_t;
|
||||
* ========================================================================= */
|
||||
#if defined(STIX_INCLUDE_COMPILER)
|
||||
typedef struct stix_compiler_t stix_compiler_t;
|
||||
typedef struct stix_decoder_t stix_decoder_t;
|
||||
#endif
|
||||
|
||||
struct stix_t
|
||||
@ -757,6 +758,14 @@ struct stix_t
|
||||
|
||||
stix_cb_t* cblist;
|
||||
stix_rbt_t pmtable; /* primitive module table */
|
||||
|
||||
struct
|
||||
{
|
||||
stix_ooch_t* ptr;
|
||||
stix_oow_t len;
|
||||
stix_oow_t capa;
|
||||
} log;
|
||||
|
||||
/* ========================= */
|
||||
|
||||
stix_heap_t* permheap; /* TODO: put kernel objects to here */
|
||||
@ -841,11 +850,10 @@ struct stix_t
|
||||
|
||||
#if defined(STIX_INCLUDE_COMPILER)
|
||||
stix_compiler_t* c;
|
||||
stix_decoder_t* d;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if defined(STIX_USE_PROCSTK)
|
||||
/* TODO: stack bound check when pushing */
|
||||
#define STIX_STACK_PUSH(stix,v) \
|
||||
|
@ -496,7 +496,7 @@ int stix_utf8toucs (const stix_bch_t* bcs, stix_oow_t* bcslen, stix_uch_t* ucs,
|
||||
}
|
||||
}
|
||||
|
||||
int stix_ucstoutf8 (const stix_uch_t* ucs, stix_oow_t *ucslen, stix_bch_t* bcs, stix_oow_t* bcslen)
|
||||
int stix_ucstoutf8 (const stix_uch_t* ucs, stix_oow_t* ucslen, stix_bch_t* bcs, stix_oow_t* bcslen)
|
||||
{
|
||||
if (*ucslen == ~(stix_oow_t)0)
|
||||
{
|
||||
@ -514,7 +514,7 @@ int stix_ucstoutf8 (const stix_uch_t* ucs, stix_oow_t *ucslen, stix_bch_t* bcs,
|
||||
stix_oow_t stix_ucslen (const stix_uch_t* ucs)
|
||||
{
|
||||
const stix_uch_t* ptr = ucs;
|
||||
while (*ptr) ptr = STIX_INCPTR(const stix_uch_t, ptr, 1);
|
||||
return STIX_SUBPTR(const stix_uch_t, ptr, ucs);
|
||||
while (*ptr) ptr++;
|
||||
return ptr - ucs;
|
||||
}
|
||||
*/
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
@ -188,4 +187,3 @@ stix_bch_t* stix_findbchar (const stix_bch_t* ptr, stix_oow_t len, stix_bch_t c)
|
||||
|
||||
return STIX_NULL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user