diff --git a/qse/bld/qse.bkl b/qse/bld/qse.bkl
index adce4623..a1353b7d 100644
--- a/qse/bld/qse.bkl
+++ b/qse/bld/qse.bkl
@@ -236,7 +236,7 @@
- mod-dir.c mod-str.c mod-sys.c
+ mod-dir.c mod-sed.c mod-str.c mod-sys.c
@@ -347,6 +347,23 @@
$(SYSLIB_SOCKET2)
+
+ qsesed
+ qsesed
+ ../../lib/sed
+ $(SOURCES_LIBQSESED)
+ libqsecmn
+ dllqsecmn
+
+
+
+ qsesed
+ ../../lib/sed
+ $(SOURCES_LIBQSESED)
+ libqsecmn
+ libqsecmn
+
+
qseawk
qseawk
@@ -373,6 +390,18 @@
dllqseawk
+
+ $(AWKMODPREFIX)sed$(AWKMODPOSTFIX)
+ $(AWKMODPREFIX)sed$(AWKMODPOSTFIX)
+ ../../lib/awk
+ mod-sed.c
+ libqsecmn
+ libqseawk
+ libqsesed
+ dllqseawk
+ dllqsesed
+
+
$(AWKMODPREFIX)str$(AWKMODPOSTFIX)
$(AWKMODPREFIX)str$(AWKMODPOSTFIX)
@@ -393,23 +422,6 @@
dllqseawk
-
- qsesed
- qsesed
- ../../lib/sed
- $(SOURCES_LIBQSESED)
- libqsecmn
- dllqsecmn
-
-
-
- qsesed
- ../../lib/sed
- $(SOURCES_LIBQSESED)
- libqsecmn
- libqsecmn
-
-
qsehttp
qsehttp
diff --git a/qse/doc/page/awk-lang.md b/qse/doc/page/awk-lang.md
index c838e646..0d2d587a 100644
--- a/qse/doc/page/awk-lang.md
+++ b/qse/doc/page/awk-lang.md
@@ -984,4 +984,66 @@ Now you run the following script on a UTF-8 console of a Linux box.
Note that 你 has been converted to a question mark since the letter is
not supported by cp949.
+
+Modules
+-------
+QSEAWK supports various external modules.
+
+## String ##
+
+The *str* module provides an extensive set of string manipulation functions.
+
+- str::index
+- str::isalnum
+- str::isalpha
+- str::isblank
+- str::iscntrl
+- str::isdigit
+- str::isgraph
+- str::islower
+- str::isprint
+- str::ispunct
+- str::isspace
+- str::isupper
+- str::isxdigit
+- str::ltrim
+- str::normspace
+- str::rindex
+- str::rtrim
+- str::trim
+
+## Directory ##
+
+The *dir* module provides an interface to read file names in a specified directory.
+
+- dir::open
+- dir::close
+- dir::read
+- dir::reset
+- dir::errno
+- dir::errstr
+
+~~~~~{.awk}
+ BEGIN {
+ x = dir::open (".");
+ while ((dir::read(x, file)) > 0) print file;
+ dir::close(x);
+ }'
+~~~~~
+
+## SED ##
+
+The *sed* module provides built-in sed capabilities.
+
+- sed::file_to_file
+- sed::str_to_str
+
+~~~~~{.awk}
+ BEGIN {
+ sed::file_to_file ("s/[a-z]/#/g", "in.txt", "out.txt");
+ }'
+~~~~~
+
+
[awkbook]: http://cm.bell-labs.com/cm/cs/awkbook/
+
diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h
index 1da185a1..3ffb788f 100644
--- a/qse/include/qse/awk/awk.h
+++ b/qse/include/qse/awk/awk.h
@@ -2648,6 +2648,33 @@ QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup (
qse_size_t* len /**< result length */
);
+
+/**
+ * The qse_awk_rtx_getvalstr() function returns a string
+ * pointer converted from a value \a val. If the value
+ * type is #QSE_AWK_VAL_STR, it simply returns the internal
+ * pointer without duplication. Otherwise, it calls
+ * qse_awk_rtx_valtostrdup(). The length of the returned
+ * string is stored into the location pointed to by \a len.
+ */
+QSE_EXPORT qse_char_t* qse_awk_rtx_getvalstr (
+ qse_awk_rtx_t* rtx, /**< runtime context */
+ const qse_awk_val_t* val, /**< value to convert */
+ qse_size_t* len /**< result length */
+);
+
+/**
+ * The qse_awk_rtx_freevalstr() function frees the memory pointed
+ * to by \a str if \a val is not of the #QSE_AWK_VAL_STR type.
+ * This function expects a value pointer and a string pointer
+ * passed to and returned by qse_awk_rtx_getvalstr() respectively.
+ */
+QSE_EXPORT void qse_awk_rtx_freevalstr (
+ qse_awk_rtx_t* rtx, /**< runtime context */
+ const qse_awk_val_t* val, /**< value to convert */
+ qse_char_t* str /**< string pointer */
+);
+
/**
* The qse_awk_rtx_valtonum() function converts a value to a number.
* If the value is converted to an integer, it is stored in the memory
diff --git a/qse/include/qse/sed/stdsed.h b/qse/include/qse/sed/stdsed.h
index 3fc0a299..fc6822fc 100644
--- a/qse/include/qse/sed/stdsed.h
+++ b/qse/include/qse/sed/stdsed.h
@@ -169,6 +169,17 @@ QSE_EXPORT int qse_sed_compstdstr (
const qse_char_t* script
);
+/**
+ * The qse_sed_compstd() function compiles a sed script of the
+ * length @a script_len pointed to by @a script.
+ * @return 0 on success, -1 on failure
+ */
+QSE_EXPORT int qse_sed_compstdstrx (
+ qse_sed_t* sed,
+ const qse_char_t* script,
+ qse_size_t script_len
+);
+
/**
* The qse_sed_execstd() function executes a compiled script
* over input streams @a in and an output stream @a out.
diff --git a/qse/lib/Makefile.am b/qse/lib/Makefile.am
index 3ba3d3ec..2ffe121a 100644
--- a/qse/lib/Makefile.am
+++ b/qse/lib/Makefile.am
@@ -1,2 +1,2 @@
-SUBDIRS = cmn awk sed xli http
+SUBDIRS = cmn sed awk xli http
DIST_SUBDIRS = $(SUBDIRS)
diff --git a/qse/lib/Makefile.in b/qse/lib/Makefile.in
index a10611d4..01653a1b 100644
--- a/qse/lib/Makefile.in
+++ b/qse/lib/Makefile.in
@@ -271,7 +271,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-SUBDIRS = cmn awk sed xli http
+SUBDIRS = cmn sed awk xli http
DIST_SUBDIRS = $(SUBDIRS)
all: all-recursive
diff --git a/qse/lib/awk/Makefile.am b/qse/lib/awk/Makefile.am
index 7d19f4c0..7356aa16 100644
--- a/qse/lib/awk/Makefile.am
+++ b/qse/lib/awk/Makefile.am
@@ -43,6 +43,7 @@ if ENABLE_STATIC_MODULE
##################################################
libqseawk_la_SOURCES += \
mod-dir.c mod-dir.h \
+ mod-sed.c mod-sed.h \
mod-str.c mod-str.h \
mod-sys.c mod-sys.h
@@ -74,6 +75,12 @@ libqseawk_dir_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
libqseawk_dir_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
libqseawk_dir_la_LIBADD = $(LIBADD_MOD_COMMON)
+modexec_LTLIBRARIES += libqseawk-sed.la
+libqseawk_sed_la_SOURCES = mod-sed.c mod-sed.h
+libqseawk_sed_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
+libqseawk_sed_la_LDFLAGS = $(LDFLAGS_MOD_COMMON) -L../sed
+libqseawk_sed_la_LIBADD = $(LIBADD_MOD_COMMON) -lqsesed
+
modexec_LTLIBRARIES += libqseawk-str.la
libqseawk_str_la_SOURCES = mod-str.c mod-str.h
libqseawk_str_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
diff --git a/qse/lib/awk/Makefile.in b/qse/lib/awk/Makefile.in
index 28fc0603..36d17994 100644
--- a/qse/lib/awk/Makefile.in
+++ b/qse/lib/awk/Makefile.in
@@ -46,6 +46,7 @@ host_triplet = @host@
##################################################
@ENABLE_STATIC_MODULE_TRUE@am__append_4 = \
@ENABLE_STATIC_MODULE_TRUE@ mod-dir.c mod-dir.h \
+@ENABLE_STATIC_MODULE_TRUE@ mod-sed.c mod-sed.h \
@ENABLE_STATIC_MODULE_TRUE@ mod-str.c mod-str.h \
@ENABLE_STATIC_MODULE_TRUE@ mod-sys.c mod-sys.h
@@ -127,6 +128,18 @@ libqseawk_mpi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
@ENABLE_STATIC_MODULE_FALSE@@HAVE_C_MPI_TRUE@am_libqseawk_mpi_la_rpath = \
@ENABLE_STATIC_MODULE_FALSE@@HAVE_C_MPI_TRUE@ -rpath \
@ENABLE_STATIC_MODULE_FALSE@@HAVE_C_MPI_TRUE@ $(modexecdir)
+@ENABLE_STATIC_MODULE_FALSE@libqseawk_sed_la_DEPENDENCIES = \
+@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
+am__libqseawk_sed_la_SOURCES_DIST = mod-sed.c mod-sed.h
+@ENABLE_STATIC_MODULE_FALSE@am_libqseawk_sed_la_OBJECTS = \
+@ENABLE_STATIC_MODULE_FALSE@ libqseawk_sed_la-mod-sed.lo
+libqseawk_sed_la_OBJECTS = $(am_libqseawk_sed_la_OBJECTS)
+libqseawk_sed_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(AM_CFLAGS) $(CFLAGS) $(libqseawk_sed_la_LDFLAGS) $(LDFLAGS) \
+ -o $@
+@ENABLE_STATIC_MODULE_FALSE@am_libqseawk_sed_la_rpath = -rpath \
+@ENABLE_STATIC_MODULE_FALSE@ $(modexecdir)
@ENABLE_STATIC_MODULE_FALSE@libqseawk_str_la_DEPENDENCIES = \
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
am__libqseawk_str_la_SOURCES_DIST = mod-str.c mod-str.h
@@ -169,10 +182,11 @@ libqseawk_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_3)
am__libqseawk_la_SOURCES_DIST = awk.c err.c tree.c parse.c run.c rec.c \
val.c fnc.c misc.c rio.c std.c awk.h err.h rio.h val.h fnc.h \
- misc.h parse.h run.h tree.h mod-dir.c mod-dir.h mod-str.c \
- mod-str.h mod-sys.c mod-sys.h mod-mpi.c mod-mpi.h mod-uci.c \
- mod-uci.h
+ misc.h parse.h run.h tree.h mod-dir.c mod-dir.h mod-sed.c \
+ mod-sed.h mod-str.c mod-str.h mod-sys.c mod-sys.h mod-mpi.c \
+ mod-mpi.h mod-uci.c mod-uci.h
@ENABLE_STATIC_MODULE_TRUE@am__objects_1 = libqseawk_la-mod-dir.lo \
+@ENABLE_STATIC_MODULE_TRUE@ libqseawk_la-mod-sed.lo \
@ENABLE_STATIC_MODULE_TRUE@ libqseawk_la-mod-str.lo \
@ENABLE_STATIC_MODULE_TRUE@ libqseawk_la-mod-sys.lo
@ENABLE_STATIC_MODULE_TRUE@@HAVE_C_MPI_TRUE@am__objects_2 = libqseawk_la-mod-mpi.lo
@@ -239,11 +253,12 @@ AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libqseawk_dir_la_SOURCES) $(libqseawk_mpi_la_SOURCES) \
- $(libqseawk_str_la_SOURCES) $(libqseawk_sys_la_SOURCES) \
- $(libqseawk_uci_la_SOURCES) $(libqseawk_la_SOURCES) \
- $(libqseawkxx_la_SOURCES)
+ $(libqseawk_sed_la_SOURCES) $(libqseawk_str_la_SOURCES) \
+ $(libqseawk_sys_la_SOURCES) $(libqseawk_uci_la_SOURCES) \
+ $(libqseawk_la_SOURCES) $(libqseawkxx_la_SOURCES)
DIST_SOURCES = $(am__libqseawk_dir_la_SOURCES_DIST) \
$(am__libqseawk_mpi_la_SOURCES_DIST) \
+ $(am__libqseawk_sed_la_SOURCES_DIST) \
$(am__libqseawk_str_la_SOURCES_DIST) \
$(am__libqseawk_sys_la_SOURCES_DIST) \
$(am__libqseawk_uci_la_SOURCES_DIST) \
@@ -462,12 +477,17 @@ libqseawk_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_9)
@ENABLE_STATIC_MODULE_FALSE@LIBADD_MOD_COMMON = -lqseawk -lqsecmn
@ENABLE_STATIC_MODULE_FALSE@modexecdir = $(libdir)
@ENABLE_STATIC_MODULE_FALSE@modexec_LTLIBRARIES = libqseawk-dir.la \
-@ENABLE_STATIC_MODULE_FALSE@ libqseawk-str.la libqseawk-sys.la \
-@ENABLE_STATIC_MODULE_FALSE@ $(am__append_10) $(am__append_11)
+@ENABLE_STATIC_MODULE_FALSE@ libqseawk-sed.la libqseawk-str.la \
+@ENABLE_STATIC_MODULE_FALSE@ libqseawk-sys.la $(am__append_10) \
+@ENABLE_STATIC_MODULE_FALSE@ $(am__append_11)
@ENABLE_STATIC_MODULE_FALSE@libqseawk_dir_la_SOURCES = mod-dir.c mod-dir.h
@ENABLE_STATIC_MODULE_FALSE@libqseawk_dir_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
@ENABLE_STATIC_MODULE_FALSE@libqseawk_dir_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
@ENABLE_STATIC_MODULE_FALSE@libqseawk_dir_la_LIBADD = $(LIBADD_MOD_COMMON)
+@ENABLE_STATIC_MODULE_FALSE@libqseawk_sed_la_SOURCES = mod-sed.c mod-sed.h
+@ENABLE_STATIC_MODULE_FALSE@libqseawk_sed_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
+@ENABLE_STATIC_MODULE_FALSE@libqseawk_sed_la_LDFLAGS = $(LDFLAGS_MOD_COMMON) -L../sed
+@ENABLE_STATIC_MODULE_FALSE@libqseawk_sed_la_LIBADD = $(LIBADD_MOD_COMMON) -lqsesed
@ENABLE_STATIC_MODULE_FALSE@libqseawk_str_la_SOURCES = mod-str.c mod-str.h
@ENABLE_STATIC_MODULE_FALSE@libqseawk_str_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
@ENABLE_STATIC_MODULE_FALSE@libqseawk_str_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
@@ -584,6 +604,8 @@ libqseawk-dir.la: $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_DEPENDENCIES) $
$(AM_V_CCLD)$(libqseawk_dir_la_LINK) $(am_libqseawk_dir_la_rpath) $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_LIBADD) $(LIBS)
libqseawk-mpi.la: $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_DEPENDENCIES) $(EXTRA_libqseawk_mpi_la_DEPENDENCIES)
$(AM_V_CCLD)$(libqseawk_mpi_la_LINK) $(am_libqseawk_mpi_la_rpath) $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_LIBADD) $(LIBS)
+libqseawk-sed.la: $(libqseawk_sed_la_OBJECTS) $(libqseawk_sed_la_DEPENDENCIES) $(EXTRA_libqseawk_sed_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libqseawk_sed_la_LINK) $(am_libqseawk_sed_la_rpath) $(libqseawk_sed_la_OBJECTS) $(libqseawk_sed_la_LIBADD) $(LIBS)
libqseawk-str.la: $(libqseawk_str_la_OBJECTS) $(libqseawk_str_la_DEPENDENCIES) $(EXTRA_libqseawk_str_la_DEPENDENCIES)
$(AM_V_CCLD)$(libqseawk_str_la_LINK) $(am_libqseawk_str_la_rpath) $(libqseawk_str_la_OBJECTS) $(libqseawk_str_la_LIBADD) $(LIBS)
libqseawk-sys.la: $(libqseawk_sys_la_OBJECTS) $(libqseawk_sys_la_DEPENDENCIES) $(EXTRA_libqseawk_sys_la_DEPENDENCIES)
@@ -608,6 +630,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-misc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-dir.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-mpi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-sed.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-str.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-sys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-mod-uci.Plo@am__quote@
@@ -619,6 +642,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-tree.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_la-val.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_mpi_la-mod-mpi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_sed_la-mod-sed.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_str_la-mod-str.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_sys_la-mod-sys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_uci_la-mod-uci.Plo@am__quote@
@@ -660,6 +684,13 @@ libqseawk_mpi_la-mod-mpi.lo: mod-mpi.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) $(libqseawk_mpi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libqseawk_mpi_la-mod-mpi.lo `test -f 'mod-mpi.c' || echo '$(srcdir)/'`mod-mpi.c
+libqseawk_sed_la-mod-sed.lo: mod-sed.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqseawk_sed_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libqseawk_sed_la-mod-sed.lo -MD -MP -MF $(DEPDIR)/libqseawk_sed_la-mod-sed.Tpo -c -o libqseawk_sed_la-mod-sed.lo `test -f 'mod-sed.c' || echo '$(srcdir)/'`mod-sed.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libqseawk_sed_la-mod-sed.Tpo $(DEPDIR)/libqseawk_sed_la-mod-sed.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mod-sed.c' object='libqseawk_sed_la-mod-sed.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) $(libqseawk_sed_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libqseawk_sed_la-mod-sed.lo `test -f 'mod-sed.c' || echo '$(srcdir)/'`mod-sed.c
+
libqseawk_str_la-mod-str.lo: mod-str.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqseawk_str_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libqseawk_str_la-mod-str.lo -MD -MP -MF $(DEPDIR)/libqseawk_str_la-mod-str.Tpo -c -o libqseawk_str_la-mod-str.lo `test -f 'mod-str.c' || echo '$(srcdir)/'`mod-str.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libqseawk_str_la-mod-str.Tpo $(DEPDIR)/libqseawk_str_la-mod-str.Plo
@@ -765,6 +796,13 @@ libqseawk_la-mod-dir.lo: mod-dir.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) $(libqseawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libqseawk_la-mod-dir.lo `test -f 'mod-dir.c' || echo '$(srcdir)/'`mod-dir.c
+libqseawk_la-mod-sed.lo: mod-sed.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqseawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libqseawk_la-mod-sed.lo -MD -MP -MF $(DEPDIR)/libqseawk_la-mod-sed.Tpo -c -o libqseawk_la-mod-sed.lo `test -f 'mod-sed.c' || echo '$(srcdir)/'`mod-sed.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libqseawk_la-mod-sed.Tpo $(DEPDIR)/libqseawk_la-mod-sed.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mod-sed.c' object='libqseawk_la-mod-sed.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) $(libqseawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libqseawk_la-mod-sed.lo `test -f 'mod-sed.c' || echo '$(srcdir)/'`mod-sed.c
+
libqseawk_la-mod-str.lo: mod-str.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqseawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libqseawk_la-mod-str.lo -MD -MP -MF $(DEPDIR)/libqseawk_la-mod-str.Tpo -c -o libqseawk_la-mod-str.lo `test -f 'mod-str.c' || echo '$(srcdir)/'`mod-str.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libqseawk_la-mod-str.Tpo $(DEPDIR)/libqseawk_la-mod-str.Plo
diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp
index e3b2e54b..5356c1fd 100644
--- a/qse/lib/awk/StdAwk.cpp
+++ b/qse/lib/awk/StdAwk.cpp
@@ -937,13 +937,13 @@ int StdAwk::open_console_in (Console& io)
v = (qse_awk_val_t*)QSE_HTB_VPTR(pair);
QSE_ASSERT (v != QSE_NULL);
- as.ptr = qse_awk_rtx_valtostrdup (rtx, v, &as.len);
+ as.ptr = qse_awk_rtx_getvalstr (rtx, v, &as.len);
if (as.ptr == QSE_NULL) return -1;
if (as.len == 0)
{
/* the name is empty */
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
this->runarg_index++;
goto nextfile;
}
@@ -955,7 +955,7 @@ int StdAwk::open_console_in (Console& io)
arg.ptr = as.ptr;
arg.len = qse_strlen (as.ptr);
((Run*)io)->setError (QSE_AWK_EIONMNL, &arg);
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
@@ -967,21 +967,20 @@ int StdAwk::open_console_in (Console& io)
sio = open_sio (QSE_NULL, io, file, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL)
{
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
if (qse_awk_rtx_setfilename (rtx, file, qse_strlen(file)) <= -1)
{
qse_sio_close (sio);
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
- if (this->console_cmgr)
- qse_sio_setcmgr (sio, this->console_cmgr);
+ if (this->console_cmgr) qse_sio_setcmgr (sio, this->console_cmgr);
io.setHandle (sio);
diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c
index ce4eca65..2bc9672d 100644
--- a/qse/lib/awk/fnc.c
+++ b/qse/lib/awk/fnc.c
@@ -214,33 +214,16 @@ static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
if (nargs >= 2) a1 = qse_awk_rtx_getarg (rtx, 1);
QSE_ASSERT (a0 != QSE_NULL);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- name = ((qse_awk_val_str_t*)a0)->val.ptr;
- len = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- name = qse_awk_rtx_valtostrdup (rtx, a0, &len);
- if (name == QSE_NULL) return -1;
- }
+ name = qse_awk_rtx_getvalstr (rtx, a0, &len);
+ if (name == QSE_NULL) return -1;
if (a1)
{
- if (a1->type == QSE_AWK_VAL_STR)
+ opt = qse_awk_rtx_getvalstr (rtx, a1, &optlen);
+ if (opt == QSE_NULL)
{
- opt = ((qse_awk_val_str_t*)a1)->val.ptr;
- optlen = ((qse_awk_val_str_t*)a1)->val.len;
- }
- else
- {
- opt = qse_awk_rtx_valtostrdup (rtx, a1, &optlen);
- if (opt == QSE_NULL)
- {
- if (a1->type != QSE_AWK_VAL_STR)
- QSE_AWK_FREE (rtx->awk, name);
- return -1;
- }
+ qse_awk_rtx_freevalstr (rtx, a0, name);
+ return -1;
}
}
@@ -291,10 +274,8 @@ static int fnc_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
*/
skip_close:
- if (a1 != QSE_NULL && a1->type != QSE_AWK_VAL_STR)
- QSE_AWK_FREE (rtx->awk, opt);
-
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, name);
+ if (a1) qse_awk_rtx_freevalstr (rtx, a1, opt);
+ qse_awk_rtx_freevalstr (rtx, a0, name);
v = qse_awk_rtx_makeintval (rtx, (qse_awk_int_t)n);
if (v == QSE_NULL) return -1;
@@ -333,15 +314,15 @@ static int flush_io (
return n;
}
-static int fnc_fflush (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
+static int fnc_fflush (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
- qse_awk_val_t* a0;
+ qse_awk_val_t* a0, * v;
qse_char_t* str0;
qse_size_t len0;
int n;
- nargs = qse_awk_rtx_getnargs (run);
+ nargs = qse_awk_rtx_getnargs (rtx);
QSE_ASSERT (nargs == 0 || nargs == 1);
if (nargs == 0)
@@ -356,23 +337,15 @@ static int fnc_fflush (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
* BEGIN { flush(); } # flush() returns -1
* BEGIN { print 1; flush(); } # flush() returns 0
*/
- n = qse_awk_rtx_flushio (run, QSE_AWK_OUT_CONSOLE, QSE_T(""));
+ n = qse_awk_rtx_flushio (rtx, QSE_AWK_OUT_CONSOLE, QSE_T(""));
}
else
{
qse_char_t* ptr, * end;
- a0 = qse_awk_rtx_getarg (run, 0);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str0 = ((qse_awk_val_str_t*)a0)->val.ptr;
- len0 = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str0 = qse_awk_rtx_valtostrdup (run, a0, &len0);
- if (str0 == QSE_NULL) return -1;
- }
+ a0 = qse_awk_rtx_getarg (rtx, 0);
+ str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
+ if (str0 == QSE_NULL) return -1;
/* the target name contains a null character.
* make fflush return -1 */
@@ -408,19 +381,19 @@ static int fnc_fflush (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
*/
n = flush_io (
- run, QSE_AWK_OUT_FILE,
+ rtx, QSE_AWK_OUT_FILE,
((len0 == 0)? QSE_NULL: str0), 1);
/*if (n == -99) return -1;*/
n = flush_io (
- run, QSE_AWK_OUT_APFILE,
+ rtx, QSE_AWK_OUT_APFILE,
((len0 == 0)? QSE_NULL: str0), n);
/*if (n == -99) return -1;*/
n = flush_io (
- run, QSE_AWK_OUT_PIPE,
+ rtx, QSE_AWK_OUT_PIPE,
((len0 == 0)? QSE_NULL: str0), n);
/*if (n == -99) return -1;*/
n = flush_io (
- run, QSE_AWK_OUT_RWPIPE,
+ rtx, QSE_AWK_OUT_RWPIPE,
((len0 == 0)? QSE_NULL: str0), n);
/*if (n == -99) return -1;*/
@@ -431,20 +404,20 @@ static int fnc_fflush (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
if (n != 0) n = -1;
skip_flush:
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str0);
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
}
- a0 = qse_awk_rtx_makeintval (run, (qse_awk_int_t)n);
- if (a0 == QSE_NULL) return -1;
+ v = qse_awk_rtx_makeintval (rtx, (qse_awk_int_t)n);
+ if (v == QSE_NULL) return -1;
- qse_awk_rtx_setretval (run, a0);
+ qse_awk_rtx_setretval (rtx, v);
return 0;
}
static int fnc_index (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
- qse_awk_val_t* a0, * a1;
+ qse_awk_val_t* a0, * a1, * v;
qse_char_t* str0, * str1, * ptr;
qse_size_t len0, len1;
qse_awk_int_t idx, start = 1;
@@ -465,31 +438,14 @@ static int fnc_index (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
if (n <= -1) return -1;
}
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str0 = ((qse_awk_val_str_t*)a0)->val.ptr;
- len0 = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str0 = qse_awk_rtx_valtostrdup (rtx, a0, &len0);
- if (str0 == QSE_NULL) return -1;
- }
+ str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
+ if (str0 == QSE_NULL) return -1;
- if (a1->type == QSE_AWK_VAL_STR)
+ str1 = qse_awk_rtx_getvalstr (rtx, a1, &len1);
+ if (str1 == QSE_NULL)
{
- str1 = ((qse_awk_val_str_t*)a1)->val.ptr;
- len1 = ((qse_awk_val_str_t*)a1)->val.len;
- }
- else
- {
- str1 = qse_awk_rtx_valtostrdup (rtx, a1, &len1);
- if (str1 == QSE_NULL)
- {
- if (a0->type != QSE_AWK_VAL_STR)
- QSE_AWK_FREE (rtx->awk, str0);
- return -1;
- }
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
+ return -1;
}
if (start == 0) start = 1;
@@ -502,13 +458,13 @@ static int fnc_index (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
idx = (ptr == QSE_NULL)? 0: ((qse_awk_int_t)(ptr-str0) + 1);
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str0);
- if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str1);
+ qse_awk_rtx_freevalstr (rtx, a1, str1);
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
- a0 = qse_awk_rtx_makeintval (rtx, idx);
- if (a0 == QSE_NULL) return -1;
+ v = qse_awk_rtx_makeintval (rtx, idx);
+ if (v == QSE_NULL) return -1;
- qse_awk_rtx_setretval (rtx, a0);
+ qse_awk_rtx_setretval (rtx, v);
return 0;
}
@@ -572,21 +528,13 @@ static int fnc_substr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
a1 = qse_awk_rtx_getarg (rtx, 1);
a2 = (nargs >= 3)? qse_awk_rtx_getarg (rtx, 2): QSE_NULL;
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str = ((qse_awk_val_str_t*)a0)->val.ptr;
- len = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str = qse_awk_rtx_valtostrdup (rtx, a0, &len);
- if (str == QSE_NULL) return -1;
- }
+ str = qse_awk_rtx_getvalstr (rtx, a0, &len);
+ if (str == QSE_NULL) return -1;
n = qse_awk_rtx_valtoint (rtx, a1, &lindex);
if (n <= -1)
{
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
+ qse_awk_rtx_freevalstr (rtx, a0, str);
return -1;
}
@@ -596,8 +544,7 @@ static int fnc_substr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
n = qse_awk_rtx_valtoint (rtx, a2, &lcount);
if (n <= -1)
{
- if (a0->type != QSE_AWK_VAL_STR)
- QSE_AWK_FREE (rtx->awk, str);
+ qse_awk_rtx_freevalstr (rtx, a0, str);
return -1;
}
}
@@ -615,11 +562,11 @@ static int fnc_substr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
r = qse_awk_rtx_makestrval (rtx, &str[lindex], (qse_size_t)lcount);
if (r == QSE_NULL)
{
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
+ qse_awk_rtx_freevalstr (rtx, a0, str);
return -1;
}
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
+ qse_awk_rtx_freevalstr (rtx, a0, str);
qse_awk_rtx_setretval (rtx, r);
return 0;
}
@@ -825,77 +772,61 @@ oops:
return -1;
}
-static int fnc_tolower (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
+static int fnc_tolower (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
qse_size_t i;
qse_awk_val_t* a0, * r;
qse_xstr_t str;
- nargs = qse_awk_rtx_getnargs (run);
+ nargs = qse_awk_rtx_getnargs (rtx);
QSE_ASSERT (nargs == 1);
- a0 = qse_awk_rtx_getarg (run, 0);
+ a0 = qse_awk_rtx_getarg (rtx, 0);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str.ptr = ((qse_awk_val_str_t*)a0)->val.ptr;
- str.len = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str.ptr = qse_awk_rtx_valtostrdup (run, a0, &str.len);
- if (str.ptr == QSE_NULL) return -1;
- }
+ str.ptr = qse_awk_rtx_getvalstr (rtx, a0, &str.len);
+ if (str.ptr == QSE_NULL) return -1;
- for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOLOWER (run->awk, str.ptr[i]);
+ for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOLOWER (rtx->awk, str.ptr[i]);
- r = qse_awk_rtx_makestrvalwithcstr (run, (qse_cstr_t*)&str);
+ r = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)&str);
if (r == QSE_NULL)
{
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
+ qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
return -1;
}
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
- qse_awk_rtx_setretval (run, r);
+ qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
+ qse_awk_rtx_setretval (rtx, r);
return 0;
}
-static int fnc_toupper (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
+static int fnc_toupper (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
qse_size_t i;
qse_awk_val_t* a0, * r;
qse_xstr_t str;
- nargs = qse_awk_rtx_getnargs (run);
+ nargs = qse_awk_rtx_getnargs (rtx);
QSE_ASSERT (nargs == 1);
- a0 = qse_awk_rtx_getarg (run, 0);
+ a0 = qse_awk_rtx_getarg (rtx, 0);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str.ptr = ((qse_awk_val_str_t*)a0)->val.ptr;
- str.len = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str.ptr = qse_awk_rtx_valtostrdup (run, a0, &str.len);
- if (str.ptr == QSE_NULL) return -1;
- }
+ str.ptr = qse_awk_rtx_getvalstr (rtx, a0, &str.len);
+ if (str.ptr == QSE_NULL) return -1;
- for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOUPPER (run->awk, str.ptr[i]);
+ for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOUPPER (rtx->awk, str.ptr[i]);
- r = qse_awk_rtx_makestrvalwithcstr (run, (qse_cstr_t*)&str);
+ r = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)&str);
if (r == QSE_NULL)
{
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
+ qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
return -1;
}
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
- qse_awk_rtx_setretval (run, r);
+ qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
+ qse_awk_rtx_setretval (rtx, r);
return 0;
}
@@ -1211,16 +1142,8 @@ static int fnc_match (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
}
}
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str0 = ((qse_awk_val_str_t*)a0)->val.ptr;
- len0 = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str0 = qse_awk_rtx_valtostrdup (rtx, a0, &len0);
- if (str0 == QSE_NULL) return -1;
- }
+ str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
+ if (str0 == QSE_NULL) return -1;
if (start == 0) start = 1;
else if (start < 0) start = len0 + start + 1;
@@ -1238,7 +1161,7 @@ static int fnc_match (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
if (n <= -1) return -1;
}
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str0);
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
idx = (n == 0)? 0: ((qse_awk_int_t)(mat.ptr-str0) + 1);
@@ -1278,7 +1201,7 @@ static int fnc_match (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
return 0;
}
-static int fnc_sprintf (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
+static int fnc_sprintf (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
qse_awk_val_t* a0;
@@ -1287,45 +1210,38 @@ static int fnc_sprintf (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
qse_xstr_t cs0;
qse_xstr_t x;
- nargs = qse_awk_rtx_getnargs (run);
+ nargs = qse_awk_rtx_getnargs (rtx);
QSE_ASSERT (nargs > 0);
- if (qse_str_init (&out, run->awk->mmgr, 256) <= -1)
+ if (qse_str_init (&out, rtx->awk->mmgr, 256) <= -1)
{
- qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
+ qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
goto oops;
}
out_inited = 1;
- if (qse_str_init (&fbu, run->awk->mmgr, 256) <= -1)
+ if (qse_str_init (&fbu, rtx->awk->mmgr, 256) <= -1)
{
- qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
+ qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
goto oops;
}
fbu_inited = 1;
- a0 = qse_awk_rtx_getarg (run, 0);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- cs0 = ((qse_awk_val_str_t*)a0)->val;
- }
- else
- {
- cs0.ptr = qse_awk_rtx_valtostrdup (run, a0, &cs0.len);
- if (cs0.ptr == QSE_NULL) goto oops;
- }
+ a0 = qse_awk_rtx_getarg (rtx, 0);
+ cs0.ptr = qse_awk_rtx_getvalstr (rtx, a0, &cs0.len);
+ if (cs0.ptr == QSE_NULL) goto oops;
- x.ptr = qse_awk_rtx_format (run,
+ x.ptr = qse_awk_rtx_format (rtx,
&out, &fbu, cs0.ptr, cs0.len, nargs, QSE_NULL, &x.len);
- if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, cs0.ptr);
+ qse_awk_rtx_freevalstr (rtx, a0, cs0.ptr);
if (x.ptr == QSE_NULL) goto oops;
- a0 = qse_awk_rtx_makestrvalwithcstr (run, (qse_cstr_t*)&x);
+ a0 = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)&x);
if (a0 == QSE_NULL) goto oops;
qse_str_fini (&fbu);
qse_str_fini (&out);
- qse_awk_rtx_setretval (run, a0);
+ qse_awk_rtx_setretval (rtx, a0);
return 0;
oops:
diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c
index 2a4df02c..c3c9d878 100644
--- a/qse/lib/awk/misc.c
+++ b/qse/lib/awk/misc.c
@@ -1303,29 +1303,17 @@ int qse_awk_rtx_matchrex (
{
code = ((qse_awk_val_rex_t*)val)->code[icase];
}
- else if (val->type == QSE_AWK_VAL_STR)
- {
- /* build a regular expression */
- qse_awk_val_str_t* strv = (qse_awk_val_str_t*)val;
- x = icase? qse_awk_buildrex (rtx->awk, strv->val.ptr, strv->val.len, &awkerr, QSE_NULL, &code):
- qse_awk_buildrex (rtx->awk, strv->val.ptr, strv->val.len, &awkerr, &code, QSE_NULL);
- if (x <= -1)
- {
- qse_awk_rtx_seterrnum (rtx, awkerr, QSE_NULL);
- return -1;
- }
- }
else
{
/* convert to a string and build a regular expression */
-
qse_xstr_t tmp;
- tmp.ptr = qse_awk_rtx_valtostrdup (rtx, val, &tmp.len);
+
+ tmp.ptr = qse_awk_rtx_getvalstr (rtx, val, &tmp.len);
if (tmp.ptr == QSE_NULL) return -1;
x = icase? qse_awk_buildrex (rtx->awk, tmp.ptr, tmp.len, &awkerr, QSE_NULL, &code):
qse_awk_buildrex (rtx->awk, tmp.ptr, tmp.len, &awkerr, &code, QSE_NULL);
- qse_awk_rtx_freemem (rtx, tmp.ptr);
+ qse_awk_rtx_freevalstr (rtx, val, tmp.ptr);
if (x <= -1)
{
qse_awk_rtx_seterrnum (rtx, awkerr, QSE_NULL);
diff --git a/qse/lib/awk/mod-dir.c b/qse/lib/awk/mod-dir.c
index 36114b7d..eb8e8ae5 100644
--- a/qse/lib/awk/mod-dir.c
+++ b/qse/lib/awk/mod-dir.c
@@ -371,16 +371,18 @@ static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
qse_awk_int_t ret;
qse_char_t* path;
qse_awk_val_t* retv;
+ qse_awk_val_t* a0;
list = rtx_to_list (rtx, fi);
- path = qse_awk_rtx_valtostrdup (rtx, qse_awk_rtx_getarg (rtx, 0), QSE_NULL);
+ a0 = qse_awk_rtx_getarg (rtx, 0);
+ path = qse_awk_rtx_getvalstr (rtx, a0, QSE_NULL);
if (path)
{
node = new_dir_node (rtx, list, path);
if (node) ret = node->id;
else ret = -1;
- qse_awk_rtx_freemem (rtx, path);
+ qse_awk_rtx_freevalstr (rtx, a0, path);
}
else
{
@@ -440,11 +442,14 @@ static int fnc_dir_reset (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
}
else
{
- path = qse_awk_rtx_valtostrdup (rtx, qse_awk_rtx_getarg(rtx, 1), QSE_NULL);
+ qse_awk_val_t* a1;
+
+ a1 = qse_awk_rtx_getarg (rtx, 1);
+ path = qse_awk_rtx_getvalstr (rtx, a1, QSE_NULL);
if (path)
{
ret = reset_byid (rtx, list, id, path);
- qse_awk_rtx_freemem (rtx, path);
+ qse_awk_rtx_freevalstr (rtx, a1, path);
}
else
{
diff --git a/qse/lib/awk/mod-sed.c b/qse/lib/awk/mod-sed.c
new file mode 100644
index 00000000..db16c1e2
--- /dev/null
+++ b/qse/lib/awk/mod-sed.c
@@ -0,0 +1,212 @@
+/*
+ * $Id$
+ *
+ Copyright 2006-2014 Chung, Hyung-Hwan.
+ This file is part of QSE.
+
+ QSE is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ QSE is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with QSE. If not, see .
+ */
+
+#include "mod-str.h"
+#include
+#include "../cmn/mem.h"
+
+#if 0
+static int fnc_errno (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ uctx_list_t* list;
+ qse_awk_val_t* retv;
+
+ list = rtx_to_list (rtx, fi);
+
+ retv = qse_awk_rtx_makeintval (rtx, list->errnum);
+ if (retv == QSE_NULL) return -1;
+
+ qse_awk_rtx_setretval (rtx, retv);
+ return 0;
+}
+
+static qse_char_t* errmsg[] =
+{
+ QSE_T("no error"),
+ QSE_T("out of memory"),
+ QSE_T("invalid data"),
+ QSE_T("not found"),
+ QSE_T("I/O error"),
+ QSE_T("parse error"),
+ QSE_T("duplicate data"),
+ QSE_T("unknown error")
+};
+
+static int fnc_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ uctx_list_t* list;
+ qse_awk_val_t* retv;
+ qse_awk_int_t errnum;
+
+ list = rtx_to_list (rtx, fi);
+
+ if (qse_awk_rtx_getnargs (rtx) <= 0 ||
+ qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 0), &errnum) <= -1)
+ {
+ errnum = list->errnum;
+ }
+
+ if (errnum < 0 || errnum >= QSE_COUNTOF(errmsg)) errnum = QSE_COUNTOF(errmsg) - 1;
+
+ retv = qse_awk_rtx_makestrvalwithstr (rtx, errmsg[errnum]);
+ if (retv == QSE_NULL) return -1;
+
+ qse_awk_rtx_setretval (rtx, retv);
+ return 0;
+}
+#endif
+
+static int fnc_file_to_file (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ qse_sed_t* sed = QSE_NULL;
+ qse_awk_val_t* retv;
+ qse_awk_val_t* a[3];
+ qse_char_t* str[3];
+ qse_size_t len[3];
+ int i = 0, ret = 0;
+
+ /* result = sed::file_to_file ("s/ABC/123/g", input_file, output_file [, option_string]) */
+
+ sed = qse_sed_openstdwithmmgr (qse_awk_rtx_getmmgr(rtx), 0);
+ if (sed == QSE_NULL)
+ {
+ ret = -2;
+ goto oops;
+ }
+
+/* TODO qse_set_opt (TRAIT) using the optional parameter */
+
+ for (i = 0; i < 3; i++)
+ {
+ a[i] = qse_awk_rtx_getarg (rtx, i);
+ str[i] = qse_awk_rtx_getvalstr (rtx, a[i], &len[i]);
+ if (str[i] == QSE_NULL)
+ {
+ ret = -2;
+ goto oops;
+ }
+ }
+
+ if (qse_sed_compstdstrx (sed, str[0], len[0]) <= -1)
+ {
+ ret = -3; /* compile error */
+ goto oops;
+ }
+
+ if (qse_sed_execstdfile (sed, str[1], str[2], QSE_NULL) <= -1)
+ {
+ ret = -4;
+ goto oops;
+ }
+
+oops:
+ retv = qse_awk_rtx_makeintval (rtx, ret);
+ if (retv == QSE_NULL) retv = qse_awk_rtx_makeintval (rtx, -1);
+
+ while (i > 0)
+ {
+ --i;
+ qse_awk_rtx_freevalstr (rtx, a[i], str[i]);
+ }
+
+ if (sed) qse_sed_close (sed);
+ qse_awk_rtx_setretval (rtx, retv);
+ return 0;
+}
+
+static int fnc_str_to_str (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
+{
+ return -1;
+}
+
+typedef struct fnctab_t fnctab_t;
+struct fnctab_t
+{
+ const qse_char_t* name;
+ qse_awk_mod_sym_fnc_t info;
+};
+
+static fnctab_t fnctab[] =
+{
+ /* keep this table sorted for binary search in query(). */
+ { QSE_T("file_to_file"), { { 3, 3, QSE_NULL }, fnc_file_to_file, 0 } },
+ { QSE_T("str_to_str"), { { 3, 3, QSE_T("vvr")}, fnc_str_to_str, 0 } }
+};
+
+static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym)
+{
+ qse_cstr_t ea;
+ int left, right, mid, n;
+
+ left = 0; right = QSE_COUNTOF(fnctab) - 1;
+
+ while (left <= right)
+ {
+ mid = (left + right) / 2;
+
+ n = qse_strcmp (fnctab[mid].name, name);
+ if (n > 0) right = mid - 1;
+ else if (n < 0) left = mid + 1;
+ else
+ {
+ sym->type = QSE_AWK_MOD_FNC;
+ sym->u.fnc = fnctab[mid].info;
+ return 0;
+ }
+ }
+
+
+ ea.ptr = name;
+ ea.len = qse_strlen(name);
+ qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL);
+ return -1;
+}
+
+/* TODO: proper resource management */
+
+static int init (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx)
+{
+ return 0;
+}
+
+static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx)
+{
+ /* TODO: anything */
+}
+
+static void unload (qse_awk_mod_t* mod, qse_awk_t* awk)
+{
+ /* TODO: anything */
+}
+
+int qse_awk_mod_sed (qse_awk_mod_t* mod, qse_awk_t* awk)
+{
+ mod->query = query;
+ mod->unload = unload;
+
+ mod->init = init;
+ mod->fini = fini;
+ /*
+ mod->ctx...
+ */
+
+ return 0;
+}
+
diff --git a/qse/lib/awk/mod-sed.h b/qse/lib/awk/mod-sed.h
new file mode 100644
index 00000000..9d96b86c
--- /dev/null
+++ b/qse/lib/awk/mod-sed.h
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ *
+ Copyright 2006-2014 Chung, Hyung-Hwan.
+ This file is part of QSE.
+
+ QSE is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ QSE is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with QSE. If not, see .
+ */
+
+#ifndef _QSE_LIB_AWK_MOD_SED_H_
+#define _QSE_LIB_AWK_MOD_SED_H_
+
+#include
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+QSE_EXPORT int qse_awk_mod_sed (qse_awk_mod_t* mod, qse_awk_t* awk);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+
diff --git a/qse/lib/awk/mod-str.c b/qse/lib/awk/mod-str.c
index a8489ffb..f855e77e 100644
--- a/qse/lib/awk/mod-str.c
+++ b/qse/lib/awk/mod-str.c
@@ -31,14 +31,16 @@ static int fnc_normspace (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
*/
qse_xstr_t path;
qse_awk_val_t* retv;
+ qse_awk_val_t* a0;
- path.ptr = qse_awk_rtx_valtostrdup (
- rtx, qse_awk_rtx_getarg(rtx, 0), &path.len);
+ a0 = qse_awk_rtx_getarg(rtx, 0);
+
+ path.ptr = qse_awk_rtx_getvalstr (rtx, a0, &path.len);
if (path.ptr)
{
path.len = qse_strxpac (path.ptr, path.len);
retv = qse_awk_rtx_makestrval (rtx, path.ptr, path.len);
- qse_awk_rtx_freemem (rtx, path.ptr);
+ qse_awk_rtx_freevalstr (rtx, a0, path.ptr);
if (retv) qse_awk_rtx_setretval (rtx, retv);
}
@@ -50,14 +52,16 @@ static int trim (qse_awk_rtx_t* rtx, int flags)
qse_xstr_t path;
qse_char_t* npath;
qse_awk_val_t* retv;
+ qse_awk_val_t* a0;
- path.ptr = qse_awk_rtx_valtostrdup (
- rtx, qse_awk_rtx_getarg(rtx, 0), &path.len);
+ a0 = qse_awk_rtx_getarg(rtx, 0);
+
+ path.ptr = qse_awk_rtx_getvalstr (rtx, a0, &path.len);
if (path.ptr)
{
npath = qse_strxtrmx (path.ptr, &path.len, flags);
retv = qse_awk_rtx_makestrval (rtx, npath, path.len);
- qse_awk_rtx_freemem (rtx, path.ptr);
+ qse_awk_rtx_freevalstr (rtx, a0, path.ptr);
if (retv) qse_awk_rtx_setretval (rtx, retv);
}
@@ -106,31 +110,15 @@ static int index_or_rindex (qse_awk_rtx_t* rtx, int rindex)
if (n <= -1) return -1;
}
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str0 = ((qse_awk_val_str_t*)a0)->val.ptr;
- len0 = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str0 = qse_awk_rtx_valtostrdup (rtx, a0, &len0);
- if (str0 == QSE_NULL) return -1;
- }
+ str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
+ if (str0 == QSE_NULL) return -1;
- if (a1->type == QSE_AWK_VAL_STR)
+ str1 = qse_awk_rtx_getvalstr (rtx, a1, &len1);
+ if (str1 == QSE_NULL)
{
- str1 = ((qse_awk_val_str_t*)a1)->val.ptr;
- len1 = ((qse_awk_val_str_t*)a1)->val.len;
- }
- else
- {
- str1 = qse_awk_rtx_valtostrdup (rtx, a1, &len1);
- if (str1 == QSE_NULL)
- {
- if (a0->type != QSE_AWK_VAL_STR)
- qse_awk_rtx_freemem (rtx, str0);
- return -1;
- }
+ if (a0->type != QSE_AWK_VAL_STR)
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
+ return -1;
}
if (nargs < 3)
@@ -158,8 +146,8 @@ static int index_or_rindex (qse_awk_rtx_t* rtx, int rindex)
idx = (ptr == QSE_NULL)? 0: ((qse_awk_int_t)(ptr-str0) + 1);
- if (a0->type != QSE_AWK_VAL_STR) qse_awk_rtx_freemem (rtx, str0);
- if (a1->type != QSE_AWK_VAL_STR) qse_awk_rtx_freemem (rtx, str1);
+ qse_awk_rtx_freevalstr (rtx, a1, str1);
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
a0 = qse_awk_rtx_makeintval (rtx, idx);
if (a0 == QSE_NULL) return -1;
@@ -187,16 +175,8 @@ static int is_class (qse_awk_rtx_t* rtx, qse_ctype_t ctype)
a0 = qse_awk_rtx_getarg (rtx, 0);
- if (a0->type == QSE_AWK_VAL_STR)
- {
- str0 = ((qse_awk_val_str_t*)a0)->val.ptr;
- len0 = ((qse_awk_val_str_t*)a0)->val.len;
- }
- else
- {
- str0 = qse_awk_rtx_valtostrdup (rtx, a0, &len0);
- if (str0 == QSE_NULL) return -1;
- }
+ str0 = qse_awk_rtx_getvalstr (rtx, a0, &len0);
+ if (str0 == QSE_NULL) return -1;
if (len0 <= 0) tmp = 0;
else
@@ -212,7 +192,7 @@ static int is_class (qse_awk_rtx_t* rtx, qse_ctype_t ctype)
}
}
while (len0 > 0);
- if (a0->type != QSE_AWK_VAL_STR) qse_awk_rtx_freemem (rtx, str0);
+ qse_awk_rtx_freevalstr (rtx, a0, str0);
}
a0 = qse_awk_rtx_makeintval (rtx, tmp);
diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c
index 7aedef8f..4b0b1dd8 100644
--- a/qse/lib/awk/parse.c
+++ b/qse/lib/awk/parse.c
@@ -6585,6 +6585,7 @@ int qse_awk_putsrcstrn (
#include "mod-dir.h"
#include "mod-str.h"
#include "mod-sys.h"
+#include "mod-sed.h"
#if defined(HAVE_MPI)
# include "mod-mpi.h"
#endif
@@ -6608,6 +6609,7 @@ static struct
#if defined(HAVE_MPI)
{ QSE_T("mpi"), qse_awk_mod_mpi },
#endif
+ { QSE_T("sed"), qse_awk_mod_sed },
{ QSE_T("str"), qse_awk_mod_str },
{ QSE_T("sys"), qse_awk_mod_sys },
#if defined(HAVE_UCI)
diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c
index 95e1dab0..278c891e 100644
--- a/qse/lib/awk/run.c
+++ b/qse/lib/awk/run.c
@@ -21,9 +21,9 @@
#include "awk.h"
#include
-#ifdef DEBUG_RUN
+//#ifdef DEBUG_RUN
#include
-#endif
+//#endif
#define PRINT_IOERR -99
@@ -4965,49 +4965,26 @@ static qse_awk_val_t* eval_binop_match0 (
const qse_awk_loc_t* lloc, const qse_awk_loc_t* rloc, int ret)
{
qse_awk_val_t* res;
+ qse_xstr_t out;
int n;
- if (left->type == QSE_AWK_VAL_STR)
- {
- n = qse_awk_rtx_matchrex (
- rtx, right,
- xstr_to_cstr(&((qse_awk_val_str_t*)left)->val),
- xstr_to_cstr(&((qse_awk_val_str_t*)left)->val), QSE_NULL);
- if (n <= -1)
- {
- ADJERR_LOC (rtx, lloc);
- return QSE_NULL;
- }
+ out.ptr = qse_awk_rtx_getvalstr (rtx, left, &out.len);
+ if (out.ptr == QSE_NULL) return QSE_NULL;
- res = qse_awk_rtx_makeintval (rtx, (n == ret));
- if (res == QSE_NULL)
- {
- ADJERR_LOC (rtx, lloc);
- return QSE_NULL;
- }
+ n = qse_awk_rtx_matchrex (rtx, right, &out, &out, QSE_NULL);
+ qse_awk_rtx_freevalstr (rtx, left, out.ptr);
+
+ if (n <= -1)
+ {
+ ADJERR_LOC (rtx, lloc);
+ return QSE_NULL;
}
- else
+
+ res = qse_awk_rtx_makeintval (rtx, (n == ret));
+ if (res == QSE_NULL)
{
- qse_xstr_t out;
-
- out.ptr = qse_awk_rtx_valtostrdup (rtx, left, &out.len);
- if (out.ptr == QSE_NULL) return QSE_NULL;
-
- n = qse_awk_rtx_matchrex (rtx, right, &out, &out, QSE_NULL);
- QSE_AWK_FREE (rtx->awk, out.ptr);
-
- if (n <= -1)
- {
- ADJERR_LOC (rtx, lloc);
- return QSE_NULL;
- }
-
- res = qse_awk_rtx_makeintval (rtx, (n == ret));
- if (res == QSE_NULL)
- {
- ADJERR_LOC (rtx, lloc);
- return QSE_NULL;
- }
+ ADJERR_LOC (rtx, lloc);
+ return QSE_NULL;
}
return res;
diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c
index 433dc007..34ab028d 100644
--- a/qse/lib/awk/std.c
+++ b/qse/lib/awk/std.c
@@ -1561,13 +1561,13 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
v = QSE_HTB_VPTR(pair);
QSE_ASSERT (v != QSE_NULL);
- as.ptr = qse_awk_rtx_valtostrdup (rtx, v, &as.len);
+ as.ptr = qse_awk_rtx_getvalstr (rtx, v, &as.len);
if (as.ptr == QSE_NULL) return -1;
if (as.len == 0)
{
/* the name is empty */
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
rxtn->c.in.index++;
goto nextfile;
}
@@ -1584,7 +1584,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EIONMNL, &errarg);
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
@@ -1597,7 +1597,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL)
{
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
@@ -1607,11 +1607,11 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
rtx, file, qse_strlen(file)) <= -1)
{
qse_sio_close (sio);
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
return -1;
}
- qse_awk_rtx_freemem (rtx, as.ptr);
+ qse_awk_rtx_freevalstr (rtx, v, as.ptr);
riod->handle = sio;
/* increment the counter of files successfully opened */
@@ -2209,22 +2209,14 @@ static int fnc_srand (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
static int fnc_system (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
- qse_awk_val_t* v;
+ qse_awk_val_t* v, * a0;
qse_char_t* str;
qse_size_t len;
int n = 0;
- v = qse_awk_rtx_getarg (rtx, 0);
- if (v->type == QSE_AWK_VAL_STR)
- {
- str = ((qse_awk_val_str_t*)v)->val.ptr;
- len = ((qse_awk_val_str_t*)v)->val.len;
- }
- else
- {
- str = qse_awk_rtx_valtostrdup (rtx, v, &len);
- if (str == QSE_NULL) return -1;
- }
+ a0 = qse_awk_rtx_getarg (rtx, 0);
+ str = qse_awk_rtx_getvalstr (rtx, a0, &len);
+ if (str == QSE_NULL) return -1;
/* the target name contains a null character.
* make system return -1 */
@@ -2255,7 +2247,7 @@ static int fnc_system (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
#endif
skip_system:
- if (v->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
+ qse_awk_rtx_freevalstr (rtx, a0, str);
v = qse_awk_rtx_makeintval (rtx, (qse_awk_int_t)n);
if (v == QSE_NULL) return -1;
@@ -2333,19 +2325,11 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
for (i = 0; i < 3; i++)
{
v[i] = qse_awk_rtx_getarg (rtx, i);
- if (v[i]->type == QSE_AWK_VAL_STR)
+ ptr[i] = qse_awk_rtx_getvalstr (rtx, v[i], &len[i]);
+ if (ptr[i] == QSE_NULL)
{
- ptr[i] = ((qse_awk_val_str_t*)v[i])->val.ptr;
- len[i] = ((qse_awk_val_str_t*)v[i])->val.len;
- }
- else
- {
- ptr[i] = qse_awk_rtx_valtostrdup (rtx, v[i], &len[i]);
- if (ptr[i] == QSE_NULL)
- {
- ret = -1;
- goto done;
- }
+ ret = -1;
+ goto done;
}
if (qse_strxchr (ptr[i], len[i], QSE_T('\0')))
@@ -2430,8 +2414,7 @@ done:
while (i > 0)
{
i--;
- if (v[i]->type != QSE_AWK_VAL_STR)
- QSE_AWK_FREE (rtx->awk, ptr[i]);
+ qse_awk_rtx_freevalstr (rtx, v[i], ptr[i]);
}
if (ret >= 0)
@@ -2463,19 +2446,11 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
for (i = 0; i < 2; i++)
{
v[i] = qse_awk_rtx_getarg (rtx, i);
- if (v[i]->type == QSE_AWK_VAL_STR)
+ ptr[i] = qse_awk_rtx_getvalstr (rtx, v[i], &len[i]);
+ if (ptr[i] == QSE_NULL)
{
- ptr[i] = ((qse_awk_val_str_t*)v[i])->val.ptr;
- len[i] = ((qse_awk_val_str_t*)v[i])->val.len;
- }
- else
- {
- ptr[i] = qse_awk_rtx_valtostrdup (rtx, v[i], &len[i]);
- if (ptr[i] == QSE_NULL)
- {
- ret = -1;
- goto done;
- }
+ ret = -1;
+ goto done;
}
if (qse_strxchr (ptr[i], len[i], QSE_T('\0'))) goto done;
@@ -2521,7 +2496,7 @@ done:
while (i > 0)
{
i--;
- if (v[i]->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, ptr[i]);
+ qse_awk_rtx_freevalstr (rtx, v[i], ptr[i]);
}
if (ret >= 0)
diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c
index f0b6951e..8644d1e5 100644
--- a/qse/lib/awk/val.c
+++ b/qse/lib/awk/val.c
@@ -1471,6 +1471,31 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup (
#endif
}
+qse_char_t* qse_awk_rtx_getvalstr (
+ qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
+{
+ if (v->type == QSE_AWK_VAL_STR)
+ {
+ if (len) *len = ((qse_awk_val_str_t*)v)->val.len;
+ return ((qse_awk_val_str_t*)v)->val.ptr;
+ }
+ else
+ {
+ return qse_awk_rtx_valtostrdup (rtx, v, len);
+ }
+}
+
+void qse_awk_rtx_freevalstr (
+ qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_char_t* str)
+{
+ if (v->type != QSE_AWK_VAL_STR &&
+ str != ((qse_awk_val_str_t*)v)->val.ptr)
+ {
+ qse_awk_rtx_freemem (rtx, str);
+ }
+}
+
+
static int val_ref_to_num (
qse_awk_rtx_t* rtx, const qse_awk_val_ref_t* ref, qse_awk_int_t* l, qse_awk_flt_t* r)
{
diff --git a/qse/lib/sed/std.c b/qse/lib/sed/std.c
index 01d767fc..8295282f 100644
--- a/qse/lib/sed/std.c
+++ b/qse/lib/sed/std.c
@@ -849,6 +849,18 @@ int qse_sed_compstdstr (qse_sed_t* sed, const qse_char_t* script)
return qse_sed_compstd (sed, in, QSE_NULL);
}
+int qse_sed_compstdstrx (qse_sed_t* sed, const qse_char_t* script, qse_size_t script_len)
+{
+ qse_sed_iostd_t in[2];
+
+ in[0].type = QSE_SED_IOSTD_STR;
+ in[0].u.str.ptr = (qse_char_t*)script;
+ in[0].u.str.len = script_len;
+ in[1].type = QSE_SED_IOSTD_NULL;
+
+ return qse_sed_compstd (sed, in, QSE_NULL);
+}
+
int qse_sed_execstdfile (
qse_sed_t* sed, const qse_char_t* infile,
const qse_char_t* outfile, qse_cmgr_t* cmgr)