From 7505e0723ff192fb1cfa6e5e73b9f578f4c1bfc1 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 3 Oct 2011 01:25:23 +0000 Subject: [PATCH] * added QSE_SIO_NOCLOSE. * enhanced qse_sed_comp() to accept an array of qse_sed_iostd_t --- qse/cmd/sed/sed.c | 163 +++++++------ qse/configure | 61 +++-- qse/configure.ac | 42 ++-- qse/doc/Doxyfile.in | 2 +- qse/doc/image/Makefile.am | 5 + qse/doc/image/Makefile.in | 387 +++++++++++++++++++++++++++++++ qse/doc/image/qse-logo.png | Bin 0 -> 17031 bytes qse/doc/page/main.doc | 6 +- qse/doc/page/mem.doc | 35 ++- qse/include/qse/cmn/fio.h | 29 +-- qse/include/qse/cmn/pma.h | 7 + qse/include/qse/cmn/sio.h | 1 + qse/include/qse/sed/Sed.hpp | 23 +- qse/include/qse/sed/sed.h | 3 +- qse/include/qse/sed/std.h | 8 +- qse/include/qse/types.h | 1 + qse/lib/cmn/fio.c | 34 ++- qse/lib/cmn/pma.c | 6 +- qse/lib/cmn/sio.c | 8 +- qse/lib/cmn/tre-match-parallel.c | 8 +- qse/lib/cmn/tre.h | 4 +- qse/lib/sed/Sed.cpp | 37 ++- qse/lib/sed/sed.c | 129 ++++++++++- qse/lib/sed/sed.h | 9 +- qse/lib/sed/std.c | 329 ++++++++++++++++++++------ qse/samples/Makefile.in | 2 +- qse/samples/sed/sed02.cpp | 8 +- qse/samples/sed/sed03.cpp | 3 +- 28 files changed, 1065 insertions(+), 285 deletions(-) create mode 100644 qse/doc/image/Makefile.am create mode 100644 qse/doc/image/Makefile.in create mode 100644 qse/doc/image/qse-logo.png diff --git a/qse/cmd/sed/sed.c b/qse/cmd/sed/sed.c index bd6b7813..f18e892d 100644 --- a/qse/cmd/sed/sed.c +++ b/qse/cmd/sed/sed.c @@ -48,8 +48,18 @@ # include #endif -static const qse_char_t* g_script_file = QSE_NULL; -static qse_char_t* g_script = QSE_NULL; +static struct +{ + qse_sed_iostd_t* io; + qse_size_t capa; + qse_size_t size; +} g_script = +{ + QSE_NULL, + 0, + 0 +}; + static qse_char_t* g_output_file = QSE_NULL; static int g_infile_pos = 0; static int g_option = 0; @@ -104,10 +114,12 @@ static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[]) qse_fprintf (out, QSE_T("USAGE: %s [options] script [file]\n"), b); qse_fprintf (out, QSE_T(" %s [options] -f script-file [file]\n"), b); + qse_fprintf (out, QSE_T(" %s [options] -e script [file]\n"), b); qse_fprintf (out, QSE_T("options as follows:\n")); qse_fprintf (out, QSE_T(" -h show this message\n")); qse_fprintf (out, QSE_T(" -n disable auto-print\n")); + qse_fprintf (out, QSE_T(" -e script specify a script. \n")); qse_fprintf (out, QSE_T(" -f file specify a script file\n")); qse_fprintf (out, QSE_T(" -o file specify an output file\n")); qse_fprintf (out, QSE_T(" -r use the extended regular expression\n")); @@ -124,14 +136,61 @@ static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[]) #endif } +static int add_script (const qse_char_t* str, int mem) +{ + if (g_script.size >= g_script.capa) + { + qse_sed_iostd_t* tmp; + + tmp = QSE_MMGR_REALLOC ( + QSE_MMGR_GETDFL(), + g_script.io, + QSE_SIZEOF(*g_script.io) * (g_script.capa + 16 + 1)); + if (tmp == QSE_NULL) + { + qse_fprintf (QSE_STDERR, QSE_T("ERROR: out of memory while processing %s\n"), str); + return -1; + } + + g_script.io = tmp; + g_script.capa += 16; + } + + if (mem) + { + g_script.io[g_script.size].type = QSE_SED_IOSTD_MEM; + g_script.io[g_script.size].u.mem.ptr = str; + g_script.io[g_script.size].u.mem.len = qse_strlen(str); + } + else + { + g_script.io[g_script.size].type = QSE_SED_IOSTD_FILE; + g_script.io[g_script.size].u.file = + (qse_strcmp (str, QSE_T("-")) == 0)? QSE_NULL: str; + } + g_script.size++; + return 0; +} + +static void free_scripts (void) +{ + if (g_script.io) + { + QSE_MMGR_FREE (QSE_MMGR_GETDFL(), g_script.io); + g_script.io = QSE_NULL; + g_script.capa = 0; + g_script.size = 0; + } +} + static int handle_args (int argc, qse_char_t* argv[]) { static qse_opt_t opt = { #if defined(QSE_BUILD_DEBUG) - QSE_T("hnf:o:rRsawxym:X:"), + QSE_T("hne:f:o:rRsawxym:X:"), #else - QSE_T("hnf:o:rRsawxym:"), + QSE_T("hne:f:o:rRsawxym:"), #endif QSE_NULL }; @@ -143,7 +202,7 @@ static int handle_args (int argc, qse_char_t* argv[]) { default: print_usage (QSE_STDERR, argc, argv); - return -1; + goto oops; case QSE_T('?'): qse_fprintf (QSE_STDERR, @@ -151,7 +210,7 @@ static int handle_args (int argc, qse_char_t* argv[]) opt.opt ); print_usage (QSE_STDERR, argc, argv); - return -1; + goto oops; case QSE_T(':'): qse_fprintf (QSE_STDERR, @@ -159,18 +218,22 @@ static int handle_args (int argc, qse_char_t* argv[]) opt.opt ); print_usage (QSE_STDERR, argc, argv); - return -1; + goto oops; case QSE_T('h'): print_usage (QSE_STDOUT, argc, argv); - return 0; + goto done; case QSE_T('n'): g_option |= QSE_SED_QUIET; break; + case QSE_T('e'): + if (add_script (opt.arg, 1) <= -1) goto oops; + break; + case QSE_T('f'): - g_script_file = opt.arg; + if (add_script (opt.arg, 0) <= -1) goto oops; break; case QSE_T('o'): @@ -217,71 +280,28 @@ static int handle_args (int argc, qse_char_t* argv[]) } } - if (opt.ind < argc && g_script_file == QSE_NULL) - g_script = argv[opt.ind++]; + if (opt.ind < argc && g_script.size <= 0) + { + if (add_script (argv[opt.ind++], 1) <= -1) goto oops; + } if (opt.ind < argc) g_infile_pos = opt.ind; - if (g_script_file == QSE_NULL && g_script == QSE_NULL) + if (g_script.size <= 0) { print_usage (QSE_STDERR, argc, argv); - return -1; + goto oops; } - + g_script.io[g_script.size].type = QSE_SED_IOSTD_NULL; return 1; -} -qse_char_t* load_script_file (qse_sed_t* sed, const qse_char_t* file) -{ - qse_str_t script; - qse_sio_t* fp; - qse_xstr_t xstr; - qse_char_t buf[256]; +oops: + free_scripts (); + return -1; - fp = qse_sio_open ( - qse_sed_getmmgr(sed), 0, file, - QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); - if (fp == QSE_NULL) - { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open %s\n"), file); - return QSE_NULL; - } - - if (qse_str_init (&script, QSE_MMGR_GETDFL(), 1024) <= -1) - { - qse_sio_close (fp); - qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot load %s\n"), file); - return QSE_NULL; - } - - while (1) - { - qse_ssize_t n; - - n = qse_sio_gets (fp, buf, QSE_COUNTOF(buf)); - if (n == 0) break; - if (n <= -1) - { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot read %s\n"), file); - qse_str_fini (&script); - qse_sio_close (fp); - return QSE_NULL; - } - - if (qse_str_ncat (&script, buf, n) == (qse_size_t)-1) - { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: out of memory\n")); - qse_str_fini (&script); - qse_sio_close (fp); - return QSE_NULL; - } - } - - qse_str_yield (&script, &xstr, 0); - qse_str_fini (&script); - qse_sio_close (fp); - - return xstr.ptr; +done: + free_scripts (); + return 0; } void print_exec_error (qse_sed_t* sed) @@ -484,15 +504,7 @@ int sed_main (int argc, qse_char_t* argv[]) qse_sed_setoption (sed, g_option); - if (g_script_file) - { - QSE_ASSERT (g_script == QSE_NULL); - - g_script = load_script_file (sed, g_script_file); - if (g_script == QSE_NULL) goto oops; - } - - if (qse_sed_compstd (sed, g_script) == -1) + if (qse_sed_compstd (sed, g_script.io) == -1) { const qse_sed_loc_t* errloc = qse_sed_geterrloc(sed); if (errloc->line > 0 || errloc->colm > 0) @@ -625,8 +637,7 @@ if (g_trace) qse_sed_setexechook (sed, trace); oops: if (sed) qse_sed_close (sed); if (xma_mmgr.ctx) qse_xma_close (xma_mmgr.ctx); - if (g_script_file != QSE_NULL && g_script != QSE_NULL) - QSE_MMGR_FREE (QSE_MMGR_GETDFL(), g_script); + free_scripts (); return ret; } diff --git a/qse/configure b/qse/configure index d735ccc5..dc3402d4 100755 --- a/qse/configure +++ b/qse/configure @@ -15507,7 +15507,8 @@ $as_echo_n "checking size of char... " >&6; } if test "${ac_cv_sizeof_char+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" " +"; then : else if test "$ac_cv_type_char" = yes; then @@ -15540,7 +15541,8 @@ $as_echo_n "checking size of short... " >&6; } if test "${ac_cv_sizeof_short+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" " +"; then : else if test "$ac_cv_type_short" = yes; then @@ -15573,7 +15575,8 @@ $as_echo_n "checking size of int... " >&6; } if test "${ac_cv_sizeof_int+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" " +"; then : else if test "$ac_cv_type_int" = yes; then @@ -15606,7 +15609,8 @@ $as_echo_n "checking size of long... " >&6; } if test "${ac_cv_sizeof_long+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" " +"; then : else if test "$ac_cv_type_long" = yes; then @@ -15639,7 +15643,8 @@ $as_echo_n "checking size of long long... " >&6; } if test "${ac_cv_sizeof_long_long+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" " +"; then : else if test "$ac_cv_type_long_long" = yes; then @@ -15672,7 +15677,8 @@ $as_echo_n "checking size of __int8... " >&6; } if test "${ac_cv_sizeof___int8+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int8))" "ac_cv_sizeof___int8" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int8))" "ac_cv_sizeof___int8" " +"; then : else if test "$ac_cv_type___int8" = yes; then @@ -15705,7 +15711,8 @@ $as_echo_n "checking size of __int16... " >&6; } if test "${ac_cv_sizeof___int16+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int16))" "ac_cv_sizeof___int16" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int16))" "ac_cv_sizeof___int16" " +"; then : else if test "$ac_cv_type___int16" = yes; then @@ -15738,7 +15745,8 @@ $as_echo_n "checking size of __int32... " >&6; } if test "${ac_cv_sizeof___int32+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int32))" "ac_cv_sizeof___int32" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int32))" "ac_cv_sizeof___int32" " +"; then : else if test "$ac_cv_type___int32" = yes; then @@ -15771,7 +15779,8 @@ $as_echo_n "checking size of __int64... " >&6; } if test "${ac_cv_sizeof___int64+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" " +"; then : else if test "$ac_cv_type___int64" = yes; then @@ -15804,7 +15813,8 @@ $as_echo_n "checking size of __int128... " >&6; } if test "${ac_cv_sizeof___int128+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128))" "ac_cv_sizeof___int128" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128))" "ac_cv_sizeof___int128" " +"; then : else if test "$ac_cv_type___int128" = yes; then @@ -15837,7 +15847,8 @@ $as_echo_n "checking size of __int8_t... " >&6; } if test "${ac_cv_sizeof___int8_t+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int8_t))" "ac_cv_sizeof___int8_t" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int8_t))" "ac_cv_sizeof___int8_t" " +"; then : else if test "$ac_cv_type___int8_t" = yes; then @@ -15870,7 +15881,8 @@ $as_echo_n "checking size of __int16_t... " >&6; } if test "${ac_cv_sizeof___int16_t+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int16_t))" "ac_cv_sizeof___int16_t" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int16_t))" "ac_cv_sizeof___int16_t" " +"; then : else if test "$ac_cv_type___int16_t" = yes; then @@ -15903,7 +15915,8 @@ $as_echo_n "checking size of __int32_t... " >&6; } if test "${ac_cv_sizeof___int32_t+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int32_t))" "ac_cv_sizeof___int32_t" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int32_t))" "ac_cv_sizeof___int32_t" " +"; then : else if test "$ac_cv_type___int32_t" = yes; then @@ -15936,7 +15949,8 @@ $as_echo_n "checking size of __int64_t... " >&6; } if test "${ac_cv_sizeof___int64_t+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64_t))" "ac_cv_sizeof___int64_t" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64_t))" "ac_cv_sizeof___int64_t" " +"; then : else if test "$ac_cv_type___int64_t" = yes; then @@ -15969,7 +15983,8 @@ $as_echo_n "checking size of __int128_t... " >&6; } if test "${ac_cv_sizeof___int128_t+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128_t))" "ac_cv_sizeof___int128_t" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128_t))" "ac_cv_sizeof___int128_t" " +"; then : else if test "$ac_cv_type___int128_t" = yes; then @@ -16002,7 +16017,8 @@ $as_echo_n "checking size of void *... " >&6; } if test "${ac_cv_sizeof_void_p+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" " +"; then : else if test "$ac_cv_type_void_p" = yes; then @@ -16035,7 +16051,8 @@ $as_echo_n "checking size of float... " >&6; } if test "${ac_cv_sizeof_float+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" " +"; then : else if test "$ac_cv_type_float" = yes; then @@ -16068,7 +16085,8 @@ $as_echo_n "checking size of double... " >&6; } if test "${ac_cv_sizeof_double+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" " +"; then : else if test "$ac_cv_type_double" = yes; then @@ -16101,7 +16119,8 @@ $as_echo_n "checking size of long double... " >&6; } if test "${ac_cv_sizeof_long_double+set}" = set; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" " +"; then : else if test "$ac_cv_type_long_double" = yes; then @@ -16125,6 +16144,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. @@ -17270,7 +17290,7 @@ QSE_PROJECT_AUTHOR="${PACKAGE_BUGREPORT}" QSE_PROJECT_URL="${PACKAGE_URL}" -ac_config_files="$ac_config_files Makefile README include/Makefile include/qse/Makefile include/qse/cmn/Makefile include/qse/awk/Makefile include/qse/cut/Makefile include/qse/sed/Makefile include/qse/stx/Makefile include/qse/net/Makefile lib/Makefile lib/cmn/Makefile lib/awk/Makefile lib/cut/Makefile lib/sed/Makefile lib/stx/Makefile lib/net/Makefile cmd/Makefile cmd/awk/Makefile cmd/cut/Makefile cmd/sed/Makefile cmd/stx/Makefile samples/Makefile samples/cmn/Makefile samples/awk/Makefile samples/cut/Makefile samples/sed/Makefile samples/net/Makefile regress/Makefile regress/awk/Makefile regress/awk/regress.sh regress/sed/Makefile regress/sed/regress.sh doc/Makefile doc/page/Makefile doc/Doxyfile" +ac_config_files="$ac_config_files Makefile README include/Makefile include/qse/Makefile include/qse/cmn/Makefile include/qse/awk/Makefile include/qse/cut/Makefile include/qse/sed/Makefile include/qse/stx/Makefile include/qse/net/Makefile lib/Makefile lib/cmn/Makefile lib/awk/Makefile lib/cut/Makefile lib/sed/Makefile lib/stx/Makefile lib/net/Makefile cmd/Makefile cmd/awk/Makefile cmd/cut/Makefile cmd/sed/Makefile cmd/stx/Makefile samples/Makefile samples/cmn/Makefile samples/awk/Makefile samples/cut/Makefile samples/sed/Makefile samples/net/Makefile regress/Makefile regress/awk/Makefile regress/awk/regress.sh regress/sed/Makefile regress/sed/regress.sh doc/Makefile doc/page/Makefile doc/image/Makefile doc/Doxyfile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -18396,6 +18416,7 @@ do "regress/sed/regress.sh") CONFIG_FILES="$CONFIG_FILES regress/sed/regress.sh" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/page/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page/Makefile" ;; + "doc/image/Makefile") CONFIG_FILES="$CONFIG_FILES doc/image/Makefile" ;; "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; diff --git a/qse/configure.ac b/qse/configure.ac index ba07539b..b056434e 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -109,31 +109,32 @@ AC_CHECK_FUNCS([powf fmodf sinf cosf tanf atanf atan2f logf expf sqrtf]) LIBS="$OLDLIBS" dnl check the size of primitive data types -AC_CHECK_SIZEOF(char) -AC_CHECK_SIZEOF(short) -AC_CHECK_SIZEOF(int) -AC_CHECK_SIZEOF(long) -AC_CHECK_SIZEOF(long long) -AC_CHECK_SIZEOF(__int8) -AC_CHECK_SIZEOF(__int16) -AC_CHECK_SIZEOF(__int32) -AC_CHECK_SIZEOF(__int64) -AC_CHECK_SIZEOF(__int128) -AC_CHECK_SIZEOF(__int8_t) -AC_CHECK_SIZEOF(__int16_t) -AC_CHECK_SIZEOF(__int32_t) -AC_CHECK_SIZEOF(__int64_t) -AC_CHECK_SIZEOF(__int128_t) +AC_CHECK_SIZEOF(char,,[[]]) +AC_CHECK_SIZEOF(short,,[[]]) +AC_CHECK_SIZEOF(int,,[[]]) +AC_CHECK_SIZEOF(long,,[[]]) +AC_CHECK_SIZEOF(long long,,[[]]) +AC_CHECK_SIZEOF(__int8,,[[]]) +AC_CHECK_SIZEOF(__int16,,[[]]) +AC_CHECK_SIZEOF(__int32,,[[]]) +AC_CHECK_SIZEOF(__int64,,[[]]) +AC_CHECK_SIZEOF(__int128,,[[]]) +AC_CHECK_SIZEOF(__int8_t,,[[]]) +AC_CHECK_SIZEOF(__int16_t,,[[]]) +AC_CHECK_SIZEOF(__int32_t,,[[]]) +AC_CHECK_SIZEOF(__int64_t,,[[]]) +AC_CHECK_SIZEOF(__int128_t,,[[]]) dnl AC_CHECK_SIZEOF doesn't work without white-space between void and * -AC_CHECK_SIZEOF(void *) -AC_CHECK_SIZEOF(float) -AC_CHECK_SIZEOF(double) -AC_CHECK_SIZEOF(long double) +AC_CHECK_SIZEOF(void *,,[[]]) +AC_CHECK_SIZEOF(float,,[[]]) +AC_CHECK_SIZEOF(double,,[[]]) +AC_CHECK_SIZEOF(long double,,[[]]) + AC_CHECK_SIZEOF(wchar_t) AC_CHECK_SIZEOF(off_t) AC_CHECK_SIZEOF(off64_t) -AC_CHECK_SIZEOF(mbstate_t,[],[#include ]) +AC_CHECK_SIZEOF(mbstate_t,,[#include ]) AX_CHECK_NUMVALOF(MB_LEN_MAX,[32],[#include ]) AC_DEFINE_UNQUOTED(QSE_SIZEOF_CHAR, ${ac_cv_sizeof_char}, [sizeof(char)]) @@ -286,6 +287,7 @@ AC_CONFIG_FILES([ regress/sed/regress.sh doc/Makefile doc/page/Makefile + doc/image/Makefile doc/Doxyfile ]) AC_OUTPUT diff --git a/qse/doc/Doxyfile.in b/qse/doc/Doxyfile.in index 8fd0890c..495a72eb 100644 --- a/qse/doc/Doxyfile.in +++ b/qse/doc/Doxyfile.in @@ -647,7 +647,7 @@ EXAMPLE_RECURSIVE = YES # directories that contain image that are included in the documentation (see # the \image command). -IMAGE_PATH = +IMAGE_PATH = @srcdir@/image # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program diff --git a/qse/doc/image/Makefile.am b/qse/doc/image/Makefile.am new file mode 100644 index 00000000..83178d89 --- /dev/null +++ b/qse/doc/image/Makefile.am @@ -0,0 +1,5 @@ + +AUTOMAKE_OPTIONS = no-dependencies + +EXTRA_DIST = \ + qse-logo.png diff --git a/qse/doc/image/Makefile.in b/qse/doc/image/Makefile.in new file mode 100644 index 00000000..9ab6a966 --- /dev/null +++ b/qse/doc/image/Makefile.in @@ -0,0 +1,387 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/image +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/qse/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +depcomp = +am__depfiles_maybe = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_MODE = @BUILD_MODE@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHAR_MODE = @CHAR_MODE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +HAVE_CXX = @HAVE_CXX@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +QSE_PROJECT_AUTHOR = @QSE_PROJECT_AUTHOR@ +QSE_PROJECT_URL = @QSE_PROJECT_URL@ +QSE_SIZEOF_CHAR = @QSE_SIZEOF_CHAR@ +QSE_SIZEOF_DOUBLE = @QSE_SIZEOF_DOUBLE@ +QSE_SIZEOF_FLOAT = @QSE_SIZEOF_FLOAT@ +QSE_SIZEOF_INT = @QSE_SIZEOF_INT@ +QSE_SIZEOF_LONG = @QSE_SIZEOF_LONG@ +QSE_SIZEOF_LONG_DOUBLE = @QSE_SIZEOF_LONG_DOUBLE@ +QSE_SIZEOF_LONG_LONG = @QSE_SIZEOF_LONG_LONG@ +QSE_SIZEOF_SHORT = @QSE_SIZEOF_SHORT@ +QSE_SIZEOF_VOID_P = @QSE_SIZEOF_VOID_P@ +QSE_SIZEOF_WCHAR_T = @QSE_SIZEOF_WCHAR_T@ +RANLIB = @RANLIB@ +RM = @RM@ +RMDIR = @RMDIR@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TRUE = @TRUE@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = no-dependencies +EXTRA_DIST = \ + qse-logo.png + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/image/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/image/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/qse/doc/image/qse-logo.png b/qse/doc/image/qse-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6970d5e01279b2236b630d3c1b642712269088c2 GIT binary patch literal 17031 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 #include @@ -42,6 +46,9 @@ struct qse_pma_blk_t qse_pma_blk_t* next; }; +/** + * The qse_pma_t type defines a pool-base block allocator. + */ typedef struct qse_pma_t qse_pma_t; struct qse_pma_t diff --git a/qse/include/qse/cmn/sio.h b/qse/include/qse/cmn/sio.h index d005b138..2b0267dc 100644 --- a/qse/include/qse/cmn/sio.h +++ b/qse/include/qse/cmn/sio.h @@ -33,6 +33,7 @@ enum qse_sio_open_flag_t { QSE_SIO_HANDLE = QSE_FIO_HANDLE, + QSE_SIO_NOCLOSE = QSE_FIO_NOCLOSE, QSE_SIO_IGNOREMBWCERR = QSE_FIO_IGNOREMBWCERR, QSE_SIO_READ = QSE_FIO_READ, diff --git a/qse/include/qse/sed/Sed.hpp b/qse/include/qse/sed/Sed.hpp index 0d176cd4..22f0c965 100644 --- a/qse/include/qse/sed/Sed.hpp +++ b/qse/include/qse/sed/Sed.hpp @@ -177,23 +177,11 @@ public: void close (); /// - /// The compile() function compiles a null-terminated string pointed - /// to by @a sptr. + /// The compile() function compiles a script from a stream + /// @a iostream. /// @return 0 on success, -1 on failure /// - int compile ( - const char_t* sptr ///< a pointer to a null-terminated string - ); - - /// - /// The compile() function compiles a string pointed to by @a sptr - /// and of the length @a slen. - /// @return 0 on success, -1 on failure - /// - int compile ( - const char_t* sptr, ///< a pointer to a string - size_t slen ///< the number of characters in the string - ); + int compile (Stream& sstream); /// /// The execute() function executes compiled commands over the I/O @@ -202,7 +190,6 @@ public: /// int execute (Stream& iostream); - /// /// The stop() function makes a request to break a running loop /// inside execute(). Note that this does not affect blocking @@ -310,11 +297,15 @@ protected: sed_t* sed; /// default error formatting string getter errstr_t dflerrstr; + /// Stream to read script from + Stream* sstream; /// I/O stream to read data from and write output to. Stream* iostream; private: + static ssize_t sin ( + sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len); static ssize_t xin ( sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len); static ssize_t xout ( diff --git a/qse/include/qse/sed/sed.h b/qse/include/qse/sed/sed.h index 9a9c6a19..42cc411a 100644 --- a/qse/include/qse/sed/sed.h +++ b/qse/include/qse/sed/sed.h @@ -369,8 +369,7 @@ void qse_sed_seterror ( */ int qse_sed_comp ( qse_sed_t* sed, /**< stream editor */ - const qse_char_t* ptr, /**< pointer to a string containing commands */ - qse_size_t len /**< the number of characters in the string */ + qse_sed_io_fun_t inf /**< script stream reader */ ); /** diff --git a/qse/include/qse/sed/std.h b/qse/include/qse/sed/std.h index 73823ec7..56fa0ded 100644 --- a/qse/include/qse/sed/std.h +++ b/qse/include/qse/sed/std.h @@ -95,13 +95,13 @@ void* qse_sed_getxtnstd ( ); /** - * The qse_sed_compstd() function compiles a null-terminated sed script. - * Call qse_sed_comp() for a length delimited script. + * The qse_sed_compstd() function compiles sed scripts specified in + * a null-terminated array of stream resources. * @return 0 on success, -1 on failure */ int qse_sed_compstd ( qse_sed_t* sed, /**< stream editor */ - const qse_char_t* str /**< null-terminated script */ + qse_sed_iostd_t in[] /**< input scripts */ ); /** @@ -109,7 +109,7 @@ int qse_sed_compstd ( * over input streams @a in and an output stream @a out. * * If @a in is not #QSE_NULL, it must point to a null-terminated array - * of standard I/O resources. if in[0].type is QSE_SED_IOSTD_NULL, this + * of stream resources. if in[0].type is QSE_SED_IOSTD_NULL, this * function returns failure, requiring at least 1 valid resource to be * included in the array. * diff --git a/qse/include/qse/types.h b/qse/include/qse/types.h index 86666201..16c21306 100644 --- a/qse/include/qse/types.h +++ b/qse/include/qse/types.h @@ -119,6 +119,7 @@ typedef enum qse_tri_t qse_tri_t; /** @typedef qse_ulong_t * The qse_ulong_t type defines the largest unsigned integer type supported */ +/* TODO: use qse_int128_t in defining qse_long_t */ #if QSE_SIZEOF_LONG >= QSE_SIZEOF_LONG_LONG typedef long qse_long_t; typedef unsigned long qse_ulong_t; diff --git a/qse/lib/cmn/fio.c b/qse/lib/cmn/fio.c index 3639e20c..534b13e1 100644 --- a/qse/lib/cmn/fio.c +++ b/qse/lib/cmn/fio.c @@ -406,15 +406,19 @@ int qse_fio_init ( void qse_fio_fini (qse_fio_t* fio) { if (fio->tio != QSE_NULL) qse_tio_close (fio->tio); + + if (!(fio->flags & QSE_FIO_NOCLOSE)) + { #if defined(_WIN32) - CloseHandle (fio->handle); + CloseHandle (fio->handle); #elif defined(__OS2__) - DosClose (fio->handle); + DosClose (fio->handle); #elif defined(__DOS__) - close (fio->handle); + close (fio->handle); #else - QSE_CLOSE (fio->handle); + QSE_CLOSE (fio->handle); #endif + } } qse_fio_hnd_t qse_fio_gethandle (qse_fio_t* fio) @@ -437,7 +441,10 @@ qse_fio_off_t qse_fio_seek ( FILE_CURRENT, FILE_END }; - LARGE_INTEGER x, y; + LARGE_INTEGER x; +#if 0 + LARGE_INTEGER y; +#endif QSE_ASSERT (QSE_SIZEOF(offset) <= QSE_SIZEOF(x.QuadPart)); @@ -856,13 +863,18 @@ static qse_ssize_t fio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size int qse_getstdfiohandle (qse_fio_std_t std, qse_fio_hnd_t* hnd) { +#if defined(_WIN32) + DWORD tab[] = + { + STD_INPUT_HANDLE, + STD_OUTPUT_HANDLE, + STD_ERROR_HANDLE + }; +#else + qse_fio_hnd_t tab[] = { -#if defined(_WIN32) - (HANDLE)STD_INPUT_HANDLE, - (HANDLE)STD_OUTPUT_HANDLE, - (HANDLE)STD_ERROR_HANDLE -#elif defined(__OS2__) +#if defined(__OS2__) (HFILE)0, (HFILE)1, (HFILE)2 #elif defined(__DOS__) 0, 1, 2 @@ -871,6 +883,8 @@ int qse_getstdfiohandle (qse_fio_std_t std, qse_fio_hnd_t* hnd) #endif }; +#endif + if (std < 0 || std >= QSE_COUNTOF(tab)) return -1; #if defined(_WIN32) diff --git a/qse/lib/cmn/pma.c b/qse/lib/cmn/pma.c index 87a22f70..fc6ef96c 100644 --- a/qse/lib/cmn/pma.c +++ b/qse/lib/cmn/pma.c @@ -43,8 +43,8 @@ /* Returns number of bytes to add to (char *)ptr to make it properly aligned for the type. */ #define ALIGN(ptr, type) \ - ((((long)ptr) % sizeof(type))? \ - (sizeof(type) - (((long)ptr) % QSE_SIZEOF(type))) : 0) + ((((qse_uintptr_t)ptr) % QSE_SIZEOF(type))? \ + (QSE_SIZEOF(type) - (((qse_uintptr_t)ptr) % QSE_SIZEOF(type))) : 0) QSE_IMPLEMENT_COMMON_FUNCTIONS (pma) @@ -133,7 +133,7 @@ void* qse_pma_alloc (qse_pma_t* pma, qse_size_t size) } /* Make sure the next pointer will be aligned. */ - size += ALIGN((long)(pma->ptr + size), long); + size += ALIGN((qse_uintptr_t)(pma->ptr + size), qse_uintptr_t); /* Allocate from current block. */ ptr = pma->ptr; diff --git a/qse/lib/cmn/sio.c b/qse/lib/cmn/sio.c index b1d84084..4f193b23 100644 --- a/qse/lib/cmn/sio.c +++ b/qse/lib/cmn/sio.c @@ -41,6 +41,8 @@ static qse_sio_t __sio_in = 0, /* errnum */ #if defined(_WIN32) + /* this is not a handle. it is adjusted to + * an actual handle in __sio_input () */ (HANDLE)STD_INPUT_HANDLE, /* handle */ #elif defined(__OS2__) (HFILE)0, /* handle */ @@ -85,6 +87,8 @@ static qse_sio_t __sio_out = 0, #if defined(_WIN32) + /* this is not a handle. it is adjusted to + * an actual handle in __sio_output () */ (HANDLE)STD_OUTPUT_HANDLE, #elif defined(__OS2__) (HFILE)1, @@ -129,6 +133,8 @@ static qse_sio_t __sio_err = 0, #if defined(_WIN32) + /* this is not a handle. it is adjusted to + * an actual handle in __sio_output () */ (HANDLE)STD_ERROR_HANDLE, #elif defined(__OS2__) (HFILE)2, @@ -200,7 +206,7 @@ qse_sio_t* qse_sio_openstd ( qse_fio_hnd_t hnd; if (qse_getstdfiohandle (std, &hnd) <= -1) return QSE_NULL; return qse_sio_open (mmgr, xtnsize, - (const qse_char_t*)&hnd, flags | QSE_SIO_HANDLE); + (const qse_char_t*)&hnd, flags | QSE_SIO_HANDLE /*| QSE_SIO_NOCLOSE*/); } void qse_sio_close (qse_sio_t* sio) diff --git a/qse/lib/cmn/tre-match-parallel.c b/qse/lib/cmn/tre-match-parallel.c index 321bf748..2eac0722 100644 --- a/qse/lib/cmn/tre-match-parallel.c +++ b/qse/lib/cmn/tre-match-parallel.c @@ -178,16 +178,16 @@ tre_tnfa_run_parallel(qse_mmgr_t* mmgr, const tre_tnfa_t *tnfa, const void *stri /* Get the various pointers within tmp_buf (properly aligned). */ tmp_tags = (void *)buf; tmp_buf = buf + tbytes; - tmp_buf += ALIGN(tmp_buf, long); + tmp_buf += ALIGN(tmp_buf, qse_uintptr_t); reach_next = (void *)tmp_buf; tmp_buf += rbytes; - tmp_buf += ALIGN(tmp_buf, long); + tmp_buf += ALIGN(tmp_buf, qse_uintptr_t); reach = (void *)tmp_buf; tmp_buf += rbytes; - tmp_buf += ALIGN(tmp_buf, long); + tmp_buf += ALIGN(tmp_buf, qse_uintptr_t); reach_pos = (void *)tmp_buf; tmp_buf += pbytes; - tmp_buf += ALIGN(tmp_buf, long); + tmp_buf += ALIGN(tmp_buf, qse_uintptr_t); for (i = 0; i < tnfa->num_states; i++) { reach[i].tags = (void *)tmp_buf; diff --git a/qse/lib/cmn/tre.h b/qse/lib/cmn/tre.h index 26cdb4b6..4624a9cc 100644 --- a/qse/lib/cmn/tre.h +++ b/qse/lib/cmn/tre.h @@ -281,8 +281,8 @@ typedef enum { STR_WIDE, STR_BYTE, STR_MBS, STR_USER } tre_str_type_t; /* Returns number of bytes to add to (char *)ptr to make it properly aligned for the type. */ #define ALIGN(ptr, type) \ - ((((long)ptr) % sizeof(type)) \ - ? (sizeof(type) - (((long)ptr) % sizeof(type))) \ + ((((qse_uintptr_t)ptr) % QSE_SIZEOF(type)) \ + ? (QSE_SIZEOF(type) - (((qse_uintptr_t)ptr) % QSE_SIZEOF(type))) \ : 0) #undef MAX diff --git a/qse/lib/sed/Sed.cpp b/qse/lib/sed/Sed.cpp index 6ce89cd6..7c925650 100644 --- a/qse/lib/sed/Sed.cpp +++ b/qse/lib/sed/Sed.cpp @@ -48,16 +48,12 @@ void Sed::close () } } -int Sed::compile (const char_t* sptr) +int Sed::compile (Stream& sstream) { QSE_ASSERT (sed != QSE_NULL); - return qse_sed_comp (sed, sptr, qse_strlen(sptr)); -} -int Sed::compile (const char_t* sptr, size_t slen) -{ - QSE_ASSERT (sed != QSE_NULL); - return qse_sed_comp (sed, sptr, slen); + this->sstream = &sstream; + return qse_sed_comp (sed, sin); } int Sed::execute (Stream& iostream) @@ -145,6 +141,33 @@ void Sed::setConsoleLine (size_t num) qse_sed_setlinnum (sed, num); } +Sed::ssize_t Sed::sin ( + sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len) +{ + Sed* sed = *(Sed**)QSE_XTN(s); + + Stream::Data iodata (sed, Stream::READ, arg); + + try + { + switch (cmd) + { + case QSE_SED_IO_OPEN: + return sed->sstream->open (iodata); + case QSE_SED_IO_CLOSE: + return sed->sstream->close (iodata); + case QSE_SED_IO_READ: + return sed->sstream->read (iodata, buf, len); + default: + return -1; + } + } + catch (...) + { + return -1; + } +} + Sed::ssize_t Sed::xin ( sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len) { diff --git a/qse/lib/sed/sed.c b/qse/lib/sed/sed.c index 22b882bd..a0c3aab2 100644 --- a/qse/lib/sed/sed.c +++ b/qse/lib/sed/sed.c @@ -347,8 +347,101 @@ static int matchtre ( #define NXTSC(sed) getnextsc(sed) #define PEEPNXTSC(sed) ((sed->src.cur < sed->src.end)? *sed->src.cur: QSE_CHAR_EOF) +static int open_script_stream (qse_sed_t* sed) +{ + qse_ssize_t n; + + sed->errnum = QSE_SED_ENOERR; + n = sed->src.fun (sed, QSE_SED_IO_OPEN, &sed->src.arg, QSE_NULL, 0); + if (n <= -1) + { + if (sed->errnum == QSE_SED_ENOERR) + SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); + return -1; + } + + sed->src.cur = sed->src.buf; + sed->src.end = sed->src.buf; + sed->src.cc = QSE_CHAR_EOF; + sed->src.loc.line = 1; + sed->src.loc.colm = 0; + + if (n == 0) + { + sed->src.eof = 1; + return 0; /* end of file */ + } + else + { + sed->src.eof = 0; + return 1; + } +} + +static int close_script_stream (qse_sed_t* sed) +{ + qse_ssize_t n; + + sed->errnum = QSE_SED_ENOERR; + n = sed->src.fun (sed, QSE_SED_IO_CLOSE, &sed->src.arg, QSE_NULL, 0); + if (n <= -1) + { + if (sed->errnum == QSE_SED_ENOERR) + SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); + return -1; + } + + return 0; +} + +static int read_script_stream (qse_sed_t* sed, qse_size_t rem) +{ + qse_ssize_t n; + + sed->errnum = QSE_SED_ENOERR; + n = sed->src.fun ( + sed, QSE_SED_IO_READ, &sed->src.arg, + &sed->src.buf[rem], QSE_COUNTOF(sed->src.buf) - rem + ); + if (n <= -1) + { + if (sed->errnum == QSE_SED_ENOERR) + SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); + return -1; + } + + if (n == 0) + { + sed->src.eof = 1; + return 0; + } + + sed->src.end = &sed->src.buf[rem] + n; + return 1; +} + static qse_cint_t getnextsc (qse_sed_t* sed) { + if (sed->src.cur + 1 >= sed->src.end && !sed->src.eof) + { + qse_size_t rem = sed->src.end - sed->src.cur; + if (sed->src.cur != sed->src.buf && rem > 0) + { + QSE_MEMCPY (sed->src.buf, sed->src.cur, rem * QSE_SIZEOF(qse_char_t)); + sed->src.cur = sed->src.buf; + sed->src.end = sed->src.buf + rem; + } + if (read_script_stream (sed, rem) <= -1) return -1; + + if (sed->src.cur + 1 >= sed->src.end && !sed->src.eof) + { + /* read again if it didn't read enough */ + qse_size_t rem = sed->src.end - sed->src.cur; + QSE_ASSERT (sed->src.buf == sed->src.cur); + if (read_script_stream (sed, rem) <= -1) return -1; + } + } + if (sed->src.cur < sed->src.end) { if (sed->src.cc == QSE_T('\n')) @@ -1598,16 +1691,22 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) return 0; } -int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) +int qse_sed_comp (qse_sed_t* sed, qse_sed_io_fun_t inf) { qse_cint_t c; qse_sed_cmd_t* cmd = QSE_NULL; qse_sed_loc_t a1_loc; + if (inf == QSE_NULL) + { + qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); + return -1; + } + /* store the source code pointers */ - sed->src.ptr = sptr; - sed->src.end = sptr + slen; - sed->src.cur = sptr; + sed->src.fun = inf; + if (open_script_stream (sed) <= -1) return -1; + sed->src.loc.line = 1; sed->src.loc.colm = 0; sed->src.cc = QSE_CHAR_EOF; @@ -1730,17 +1829,19 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) if (cmd->a1.type == QSE_SED_ADR_LINE && cmd->a1.u.lno <= 0) { if (cmd->a2.type == QSE_SED_ADR_STEP || - ((sed->option & QSE_SED_EXTENDEDADR) && cmd->a2.type == QSE_SED_ADR_REX)) + ((sed->option & QSE_SED_EXTENDEDADR) && + cmd->a2.type == QSE_SED_ADR_REX)) { /* 0 as the first address is allowed in this two contexts. * 0~step * 0,/regex/ - * however, '0~0' is not allowed. but at this point '0~0' is - * already transformed to '0'. and disallowing it is achieved - * gratuitously. + * '0~0' is not allowed. but at this point '0~0' + * is already transformed to '0'. and disallowing it is + * achieved gratuitously. */ /* nothing to do - adding negation to the condition dropped - * code readability so i decided to write this part of code this way. + * code readability so i decided to write this part of code + * this way. */ } else @@ -1785,13 +1886,15 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) if (sed->tmp.grp.level != 0) { SETERR0 (sed, QSE_SED_EGRNBA, &sed->src.loc); - return -1; + goto oops; } + close_script_stream (sed); return 0; oops: if (cmd) free_address (sed, cmd); + close_script_stream (sed); return -1; } @@ -2185,6 +2288,7 @@ static int write_file ( qse_char_t buf[512]; #endif + arg.handle = QSE_NULL; arg.path = cmd->u.file.ptr; sed->errnum = QSE_SED_ENOERR; n = sed->e.in.fun (sed, QSE_SED_IO_OPEN, &arg, QSE_NULL, 0); @@ -2304,7 +2408,10 @@ static int emit_append (qse_sed_t* sed, qse_sed_app_t* app) return write_file (sed, app->cmd, 1); default: - QSE_ASSERT (!"should never happen - app->cmd->type must be one of APPEND,READ_FILE,READ_FILELN"); + QSE_ASSERTX ( + !"should never happen", + "app->cmd->type must be one of APPEND,READ_FILE,READ_FILELN" + ); SETERR0 (sed, QSE_SED_EINTERN, &app->cmd->loc); return -1; } diff --git a/qse/lib/sed/sed.h b/qse/lib/sed/sed.h index d3c457b3..cc40e138 100644 --- a/qse/lib/sed/sed.h +++ b/qse/lib/sed/sed.h @@ -191,8 +191,13 @@ struct qse_sed_t /** source text pointers */ struct { - qse_sed_loc_t loc; /**< location */ - qse_cint_t cc; /**< last character read */ + qse_sed_io_fun_t fun; /**< input stream handler */ + qse_sed_io_arg_t arg; + qse_char_t buf[1024]; + int eof; + + qse_sed_loc_t loc; /**< location */ + qse_cint_t cc; /**< last character read */ const qse_char_t* ptr; /**< beginning of the source text */ const qse_char_t* end; /**< end of the source text */ const qse_char_t* cur; /**< current source text pointer */ diff --git a/qse/lib/sed/std.c b/qse/lib/sed/std.c index 63d32cff..26863738 100644 --- a/qse/lib/sed/std.c +++ b/qse/lib/sed/std.c @@ -24,20 +24,35 @@ #include #include "../cmn/mem.h" +typedef struct xtn_in_t xtn_in_t; +struct xtn_in_t +{ + qse_sed_iostd_t* ptr; + qse_sed_iostd_t* cur; + qse_size_t mempos; +}; + +typedef struct xtn_out_t xtn_out_t; +struct xtn_out_t +{ + qse_sed_iostd_t* ptr; + qse_str_t* memstr; +}; + +typedef struct xtn_t xtn_t; struct xtn_t { struct { - qse_sed_iostd_t* in; - qse_sed_iostd_t* out; - - qse_sed_iostd_t* in_cur; - qse_size_t in_mempos; - qse_str_t* out_memstr; + xtn_in_t in; + } s; + struct + { + xtn_in_t in; + xtn_out_t out; } e; }; -typedef struct xtn_t xtn_t; qse_sed_t* qse_sed_openstd (qse_size_t xtnsize) { @@ -65,9 +80,30 @@ void* qse_sed_getxtnstd (qse_sed_t* sed) return (void*)((xtn_t*)QSE_XTN(sed) + 1); } -int qse_sed_compstd (qse_sed_t* sed, const qse_char_t* sptr) +static int verify_iostd_in (qse_sed_t* sed, qse_sed_iostd_t in[]) { - return qse_sed_comp (sed, sptr, qse_strlen(sptr)); + qse_size_t i; + + if (in[0].type == QSE_SED_IOSTD_NULL) + { + /* if 'in' is specified, it must contains at least one + * valid entry */ + qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); + return -1; + } + + for (i = 0; in[i].type != QSE_SED_IOSTD_NULL; i++) + { + if (in[i].type != QSE_SED_IOSTD_SIO && + in[i].type != QSE_SED_IOSTD_FILE && + in[i].type != QSE_SED_IOSTD_MEM) + { + qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); + return -1; + } + } + + return 0; } static qse_sio_t* open_sio (qse_sed_t* sed, const qse_char_t* file, int flags) @@ -112,7 +148,8 @@ static void close_main_stream ( if (io->type == QSE_SED_IOSTD_FILE) qse_sio_close (arg->handle); } -static int open_console_input_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io) +static int open_input_stream ( + qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io, xtn_in_t* base) { xtn_t* xtn = (xtn_t*) QSE_XTN (sed); @@ -136,14 +173,21 @@ static int open_console_input_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse case QSE_SED_IOSTD_MEM: /* don't store anything to arg->handle */ - xtn->e.in_mempos = 0; + base->mempos = 0; break; } +#if 0 + if (base == &xtn->s.in) + { + qse_sed_setfilename (sed, ....); + } +#endif + return 0; } -static int open_console_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io) +static int open_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io) { xtn_t* xtn = (xtn_t*) QSE_XTN (sed); @@ -184,8 +228,8 @@ static int open_console_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qs case QSE_SED_IOSTD_MEM: /* don't store anything to arg->handle */ - xtn->e.out_memstr = qse_str_open (sed->mmgr, 0, 512); - if (xtn->e.out_memstr == QSE_NULL) + xtn->e.out.memstr = qse_str_open (sed->mmgr, 0, 512); + if (xtn->e.out.memstr == QSE_NULL) { qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL); return -1; @@ -196,34 +240,68 @@ static int open_console_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qs return 0; } -static qse_ssize_t read_main_input_stream ( - qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_char_t* buf, qse_size_t len) +static qse_ssize_t read_input_stream ( + qse_sed_t* sed, qse_sed_io_arg_t* arg, + qse_char_t* buf, qse_size_t len, xtn_in_t* base) { xtn_t* xtn = (xtn_t*) QSE_XTN (sed); qse_sed_iostd_t* io, * next; void* old, * new; qse_ssize_t n = 0; + int newline_forced = 0; if (len > QSE_TYPE_MAX(qse_ssize_t)) len = QSE_TYPE_MAX(qse_ssize_t); do { - io = xtn->e.in_cur; + io = base->cur; QSE_ASSERT (io != QSE_NULL); if (io->type == QSE_SED_IOSTD_MEM) { n = 0; - while (xtn->e.in_mempos < io->u.mem.len && n < len) - buf[n++] = io->u.mem.ptr[xtn->e.in_mempos++]; + while (base->mempos < io->u.mem.len && n < len) + buf[n++] = io->u.mem.ptr[base->mempos++]; } else n = qse_sio_getsn (arg->handle, buf, len); - - if (n != 0) break; + if (n != 0) + { + if (n <= -1) + { + if (io->type == QSE_SED_IOSTD_FILE) + { + qse_cstr_t ea; + ea.ptr = io->u.file; + ea.len = qse_strlen (io->u.file); + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + } + else n += newline_forced; /* success */ + break; + } - /* end of file on the current input stream */ + /* ============================================= */ + /* == end of file on the current input stream == */ + /* ============================================= */ - next = xtn->e.in_cur + 1; + if (base == &xtn->s.in && !newline_forced) + { + /* == ONLY FOR A SCRIPT STREAM == + * squeeze in a new line in case the previous script + * stream doesn't end with a line terminator.*/ + + /* TODO: support different line terminator */ + buf[0] = QSE_T('\n'); + buf++; len--; + newline_forced = 1; + + /* set the line number to 0 for the newline + * squeezed in */ + sed->src.loc.line = 0; + sed->src.loc.colm = 0; + } + + next = base->cur + 1; if (next->type == QSE_SED_IOSTD_NULL) { /* no next stream available - return 0 */ @@ -233,9 +311,17 @@ static qse_ssize_t read_main_input_stream ( old = arg->handle; /* try to open the next input stream */ - if (open_console_input_stream (sed, arg, next) <= -1) + if (open_input_stream (sed, arg, next, base) <= -1) { /* failed to open the next input stream */ + if (next->type == QSE_SED_IOSTD_FILE) + { + qse_cstr_t ea; + ea.ptr = next->u.file; + ea.len = qse_strlen (next->u.file); + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + n = -1; break; } @@ -245,14 +331,51 @@ static qse_ssize_t read_main_input_stream ( close_main_stream (sed, arg, io); arg->handle = new; - xtn->e.in_cur++; + base->cur++; } while (1); return n; } -static qse_ssize_t xin ( +static qse_ssize_t s_in ( + qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg, + qse_char_t* buf, qse_size_t len) +{ + xtn_t* xtn = (xtn_t*) QSE_XTN (sed); + + switch (cmd) + { + case QSE_SED_IO_OPEN: + { + if (open_input_stream (sed, arg, xtn->s.in.cur, &xtn->s.in) <= -1) return -1; + return 1; + } + + case QSE_SED_IO_CLOSE: + { + close_main_stream (sed, arg, xtn->s.in.cur); + return 0; + } + + case QSE_SED_IO_READ: + { + return read_input_stream (sed, arg, buf, len, &xtn->s.in); + } + + default: + { + QSE_ASSERTX ( + !"should never happen", + "cmd must be one of OPEN,CLOSE,READ" + ); + qse_sed_seterrnum (sed, QSE_SED_EINTERN, QSE_NULL); + return -1; + } + } +} + +static qse_ssize_t x_in ( qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg, qse_char_t* buf, qse_size_t len) { @@ -265,8 +388,8 @@ static qse_ssize_t xin ( { if (arg->path == QSE_NULL) { - /* not file specified. console stream */ - if (xtn->e.in == QSE_NULL) + /* no file specified. console stream */ + if (xtn->e.in.ptr == QSE_NULL) { sio = open_sio_std ( sed, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); @@ -275,7 +398,7 @@ static qse_ssize_t xin ( } else { - if (open_console_input_stream (sed, arg, xtn->e.in_cur) <= -1) return -1; + if (open_input_stream (sed, arg, xtn->e.in.cur, &xtn->e.in) <= -1) return -1; } } else @@ -293,10 +416,10 @@ static qse_ssize_t xin ( if (arg->path == QSE_NULL) { /* main data stream */ - if (xtn->e.in == QSE_NULL) + if (xtn->e.in.ptr == QSE_NULL) qse_sio_close (arg->handle); else - close_main_stream (sed, arg, xtn->e.in_cur); + close_main_stream (sed, arg, xtn->e.in.cur); } else { @@ -311,23 +434,48 @@ static qse_ssize_t xin ( if (arg->path == QSE_NULL) { /* main data stream */ - if (xtn->e.in == QSE_NULL) - return qse_sio_getsn (arg->handle, buf, len); + if (xtn->e.in.ptr == QSE_NULL) + { + qse_ssize_t n; + n = qse_sio_getsn (arg->handle, buf, len); + if (n <= -1) + { + qse_cstr_t ea; + ea.ptr = QSE_T("stdin"); + ea.len = 5; + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + return n; + } else - return read_main_input_stream (sed, arg, buf, len); + return read_input_stream (sed, arg, buf, len, &xtn->e.in); } else { - return qse_sio_getsn (arg->handle, buf, len); + qse_ssize_t n; + n = qse_sio_getsn (arg->handle, buf, len); + if (n <= -1) + { + qse_cstr_t ea; + ea.ptr = arg->path; + ea.len = qse_strlen (arg->path); + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + return n; } } default: + QSE_ASSERTX ( + !"should never happen", + "cmd must be one of OPEN,CLOSE,READ" + ); + qse_sed_seterrnum (sed, QSE_SED_EINTERN, QSE_NULL); return -1; } } -static qse_ssize_t xout ( +static qse_ssize_t x_out ( qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg, qse_char_t* dat, qse_size_t len) { @@ -340,7 +488,7 @@ static qse_ssize_t xout ( { if (arg->path == QSE_NULL) { - if (xtn->e.out == QSE_NULL) + if (xtn->e.out.ptr== QSE_NULL) { sio = open_sio_std ( sed, QSE_SIO_STDOUT, @@ -354,7 +502,7 @@ static qse_ssize_t xout ( } else { - if (open_console_output_stream (sed, arg, xtn->e.out) <= -1) return -1; + if (open_output_stream (sed, arg, xtn->e.out.ptr) <= -1) return -1; } } else @@ -377,10 +525,10 @@ static qse_ssize_t xout ( { if (arg->path == QSE_NULL) { - if (xtn->e.out == QSE_NULL) + if (xtn->e.out.ptr== QSE_NULL) qse_sio_close (arg->handle); else - close_main_stream (sed, arg, xtn->e.out); + close_main_stream (sed, arg, xtn->e.out.ptr); } else { @@ -394,18 +542,27 @@ static qse_ssize_t xout ( if (arg->path == QSE_NULL) { /* main data stream */ - if (xtn->e.out == QSE_NULL) + if (xtn->e.out.ptr== QSE_NULL) { - return qse_sio_putsn (arg->handle, dat, len); + qse_ssize_t n; + n = qse_sio_putsn (arg->handle, dat, len); + if (n <= -1) + { + qse_cstr_t ea; + ea.ptr = QSE_T("stdin"); + ea.len = 5; + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + return n; } else { - qse_sed_iostd_t* io = xtn->e.out; + qse_sed_iostd_t* io = xtn->e.out.ptr; if (io->type == QSE_SED_IOSTD_MEM) { if (len > QSE_TYPE_MAX(qse_ssize_t)) len = QSE_TYPE_MAX(qse_ssize_t); - if (qse_str_ncat (xtn->e.out_memstr, dat, len) == (qse_size_t)-1) + if (qse_str_ncat (xtn->e.out.memstr, dat, len) == (qse_size_t)-1) { qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL); return -1; @@ -415,50 +572,70 @@ static qse_ssize_t xout ( } else { - return qse_sio_putsn (arg->handle, dat, len); + qse_ssize_t n; + n = qse_sio_putsn (arg->handle, dat, len); + if (n <= -1) + { + qse_cstr_t ea; + ea.ptr = io->u.file; + ea.len = qse_strlen(io->u.file); + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + return n; } } } else { - return qse_sio_putsn (arg->handle, dat, len); + qse_ssize_t n; + n = qse_sio_putsn (arg->handle, dat, len); + if (n <= -1) + { + qse_cstr_t ea; + ea.ptr = arg->path; + ea.len = qse_strlen(arg->path); + qse_sed_seterrnum (sed, QSE_SED_EIOFIL, &ea); + } + return n; } } default: + QSE_ASSERTX ( + !"should never happen", + "cmd must be one of OPEN,CLOSE,WRITE" + ); + qse_sed_seterrnum (sed, QSE_SED_EINTERN, QSE_NULL); return -1; } } +int qse_sed_compstd (qse_sed_t* sed, qse_sed_iostd_t in[]) +{ + xtn_t* xtn = (xtn_t*) QSE_XTN (sed); + + if (in == QSE_NULL) + { + /* it requires a valid array unlike qse_sed_execstd(). */ + qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); + return -1; + } + if (verify_iostd_in (sed, in) <= -1) return -1; + + QSE_MEMSET (&xtn->s, 0, QSE_SIZEOF(xtn->s)); + xtn->s.in.ptr = in; + xtn->s.in.cur = in; + + return qse_sed_comp (sed, s_in); +} + int qse_sed_execstd ( qse_sed_t* sed, qse_sed_iostd_t in[], qse_sed_iostd_t* out) { int n; xtn_t* xtn = (xtn_t*) QSE_XTN (sed); - if (in) - { - qse_size_t i; - - if (in[0].type == QSE_SED_IOSTD_NULL) - { - /* if 'in' is specified, it must contains at least one - * valid entry */ - qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); - return -1; - } - - for (i = 0; in[i].type != QSE_SED_IOSTD_NULL; i++) - { - if (in[i].type != QSE_SED_IOSTD_SIO && - in[i].type != QSE_SED_IOSTD_FILE && - in[i].type != QSE_SED_IOSTD_MEM) - { - qse_sed_seterrnum (sed, QSE_SED_EINVAL, QSE_NULL); - return -1; - } - } - } + if (in && verify_iostd_in (sed, in) <= -1) return -1; if (out) { @@ -472,18 +649,18 @@ int qse_sed_execstd ( } QSE_MEMSET (&xtn->e, 0, QSE_SIZEOF(xtn->e)); - xtn->e.in = in; - xtn->e.out = out; - xtn->e.in_cur = in; + xtn->e.in.ptr = in; + xtn->e.in.cur = in; + xtn->e.out.ptr= out; - n = qse_sed_exec (sed, xin, xout); + n = qse_sed_exec (sed, x_in, x_out); if (n >= 0 && out && out->type == QSE_SED_IOSTD_MEM) { - QSE_ASSERT (xtn->e.out_memstr != QSE_NULL); - qse_str_yield (xtn->e.out_memstr, &out->u.mem, 0); + QSE_ASSERT (xtn->e.out.memstr != QSE_NULL); + qse_str_yield (xtn->e.out.memstr, &out->u.mem, 0); } - if (xtn->e.out_memstr) qse_str_close (xtn->e.out_memstr); + if (xtn->e.out.memstr) qse_str_close (xtn->e.out.memstr); return n; } diff --git a/qse/samples/Makefile.in b/qse/samples/Makefile.in index fd90816d..d5840adc 100644 --- a/qse/samples/Makefile.in +++ b/qse/samples/Makefile.in @@ -231,7 +231,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = cmn awk cut sed net +SUBDIRS = cmn awk cut sed all: all-recursive .SUFFIXES: diff --git a/qse/samples/sed/sed02.cpp b/qse/samples/sed/sed02.cpp index 043f2224..18a53c49 100644 --- a/qse/samples/sed/sed02.cpp +++ b/qse/samples/sed/sed02.cpp @@ -45,7 +45,9 @@ int sed_main (int argc, qse_char_t* argv[]) return -1; } - if (sed.compile (argv[1]) == -1) + + QSE::StdSed::StringStream sstream (argv[1]); + if (sed.compile (sstream) == -1) { xcout << QSE_T("ERR: cannot compile - ") << sed.getErrorMessage() << std::endl; sed.close (); @@ -54,9 +56,9 @@ int sed_main (int argc, qse_char_t* argv[]) qse_char_t* infile = (argc >= 3)? argv[2]: QSE_NULL; qse_char_t* outfile = (argc >= 4)? argv[3]: QSE_NULL; - QSE::StdSed::FileStream stream (infile, outfile); + QSE::StdSed::FileStream fstream (infile, outfile); - if (sed.execute (stream) == -1) + if (sed.execute (fstream) == -1) { xcout << QSE_T("ERR: cannot execute - ") << sed.getErrorMessage() << std::endl; sed.close (); diff --git a/qse/samples/sed/sed03.cpp b/qse/samples/sed/sed03.cpp index a739122b..0d4edc5d 100644 --- a/qse/samples/sed/sed03.cpp +++ b/qse/samples/sed/sed03.cpp @@ -49,7 +49,8 @@ public: void compile (const char_t* sptr) { - if (QSE::StdSed::compile (sptr) <= -1) + QSE::StdSed::StringStream stream(sptr); + if (QSE::StdSed::compile (stream) <= -1) throw Error (getErrorMessage()); }