From 393dd9be8d64c898a77e9ce3a44644a92348b065 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 25 Jun 2009 02:29:33 +0000 Subject: [PATCH] improved the standard console handler to handle when ARGV has been overridden in a script --- qse/Makefile.am | 2 +- qse/Makefile.in | 2 +- qse/cmd/awk/regress.sh | 19 ------ qse/configure | 12 ++-- qse/configure.ac | 10 +-- qse/include/qse/awk/awk.h | 30 ++++----- qse/include/qse/awk/std.h | 3 +- qse/lib/awk/err.c | 4 +- qse/lib/awk/fnc.c | 4 +- qse/lib/awk/misc.c | 6 +- qse/lib/awk/parse.c | 14 +++-- qse/lib/awk/run.c | 39 +++++++++--- qse/lib/awk/std.c | 89 ++++++++++++++++++++++++++- qse/lib/awk/tree.c | 63 ++++++++++++++----- qse/regress/awk/adm.d1 | 14 +++++ qse/regress/awk/asm.awk | 51 +++++++++++++++ qse/regress/awk/asm.d1 | 14 +++++ qse/regress/awk/asm.d2 | 11 ++++ qse/{cmd => regress}/awk/emp-001.awk | 0 qse/{cmd => regress}/awk/emp-002.awk | 0 qse/{cmd => regress}/awk/emp-003.awk | 0 qse/{cmd => regress}/awk/emp-004.awk | 0 qse/{cmd => regress}/awk/emp-005.awk | 0 qse/{cmd => regress}/awk/emp-006.awk | 0 qse/{cmd => regress}/awk/emp-007.awk | 0 qse/{cmd => regress}/awk/emp-008.awk | 0 qse/{cmd => regress}/awk/emp-009.awk | 0 qse/{cmd => regress}/awk/emp-010.awk | 0 qse/{cmd => regress}/awk/emp-011.awk | 0 qse/{cmd => regress}/awk/emp-012.awk | 0 qse/{cmd => regress}/awk/emp-013.awk | 0 qse/{cmd => regress}/awk/emp-014.awk | 0 qse/{cmd => regress}/awk/emp-015.awk | 0 qse/{cmd => regress}/awk/emp-016.awk | 0 qse/{cmd => regress}/awk/emp-017.awk | 0 qse/{cmd => regress}/awk/emp-018.awk | 0 qse/{cmd => regress}/awk/emp-019.awk | 0 qse/{cmd => regress}/awk/emp-020.awk | 0 qse/{cmd => regress}/awk/emp-021.awk | 0 qse/{cmd => regress}/awk/emp-022.awk | 0 qse/{cmd => regress}/awk/emp-023.awk | 0 qse/{cmd => regress}/awk/emp-024.awk | 0 qse/{cmd => regress}/awk/emp-025.awk | 0 qse/{cmd => regress}/awk/emp-026.awk | 0 qse/{cmd => regress}/awk/emp-027.awk | 0 qse/regress/awk/emp.d | 6 ++ qse/regress/awk/hanoi.awk | 40 ++++++++++++ qse/regress/awk/quicksort.awk | 56 +++++++++++++++++ qse/regress/awk/quicksort.d | 16 +++++ qse/regress/awk/quicksort2.awk | 17 +++++ qse/regress/awk/quicksort2.d | 16 +++++ qse/regress/awk/regress.sh | 85 +++++++++++++++++++++++++ qse/regress/awk/stripcomment.awk | 11 ++++ qse/regress/awk/stripcomment.d | 10 +++ qse/regress/awk/wordfreq.awk | 20 ++++++ qse/{test => samples}/Makefile.am | 0 qse/{test => samples}/Makefile.in | 6 +- qse/{test => samples}/awk/Makefile.am | 0 qse/{test => samples}/awk/Makefile.in | 6 +- qse/{test => samples}/awk/awk01.c | 0 qse/{test => samples}/awk/awk02.c | 0 qse/{test => samples}/awk/awk03.c | 0 qse/{test => samples}/awk/awk04.c | 0 qse/{test => samples}/awk/awk05.cpp | 0 qse/{test => samples}/cmn/Makefile.am | 0 qse/{test => samples}/cmn/Makefile.in | 6 +- qse/{test => samples}/cmn/chr.c | 0 qse/{test => samples}/cmn/fio.c | 0 qse/{test => samples}/cmn/lda.c | 0 qse/{test => samples}/cmn/map.c | 0 qse/{test => samples}/cmn/pio.c | 0 qse/{test => samples}/cmn/sio.c | 0 qse/{test => samples}/cmn/sll.c | 0 qse/{test => samples}/cmn/str.c | 0 qse/{test => samples}/cmn/time.c | 0 qse/{test => samples}/sed/Makefile.am | 0 qse/{test => samples}/sed/Makefile.in | 6 +- qse/{test => samples}/sed/sed01.c | 0 qse/{test => samples}/sed/sed02.cpp | 0 qse/{test => samples}/sed/sed03.cpp | 0 qse/{test => samples}/utl/Makefile.am | 0 qse/{test => samples}/utl/Makefile.in | 6 +- 82 files changed, 593 insertions(+), 101 deletions(-) create mode 100644 qse/regress/awk/adm.d1 create mode 100644 qse/regress/awk/asm.awk create mode 100644 qse/regress/awk/asm.d1 create mode 100644 qse/regress/awk/asm.d2 rename qse/{cmd => regress}/awk/emp-001.awk (100%) rename qse/{cmd => regress}/awk/emp-002.awk (100%) rename qse/{cmd => regress}/awk/emp-003.awk (100%) rename qse/{cmd => regress}/awk/emp-004.awk (100%) rename qse/{cmd => regress}/awk/emp-005.awk (100%) rename qse/{cmd => regress}/awk/emp-006.awk (100%) rename qse/{cmd => regress}/awk/emp-007.awk (100%) rename qse/{cmd => regress}/awk/emp-008.awk (100%) rename qse/{cmd => regress}/awk/emp-009.awk (100%) rename qse/{cmd => regress}/awk/emp-010.awk (100%) rename qse/{cmd => regress}/awk/emp-011.awk (100%) rename qse/{cmd => regress}/awk/emp-012.awk (100%) rename qse/{cmd => regress}/awk/emp-013.awk (100%) rename qse/{cmd => regress}/awk/emp-014.awk (100%) rename qse/{cmd => regress}/awk/emp-015.awk (100%) rename qse/{cmd => regress}/awk/emp-016.awk (100%) rename qse/{cmd => regress}/awk/emp-017.awk (100%) rename qse/{cmd => regress}/awk/emp-018.awk (100%) rename qse/{cmd => regress}/awk/emp-019.awk (100%) rename qse/{cmd => regress}/awk/emp-020.awk (100%) rename qse/{cmd => regress}/awk/emp-021.awk (100%) rename qse/{cmd => regress}/awk/emp-022.awk (100%) rename qse/{cmd => regress}/awk/emp-023.awk (100%) rename qse/{cmd => regress}/awk/emp-024.awk (100%) rename qse/{cmd => regress}/awk/emp-025.awk (100%) rename qse/{cmd => regress}/awk/emp-026.awk (100%) rename qse/{cmd => regress}/awk/emp-027.awk (100%) create mode 100644 qse/regress/awk/emp.d create mode 100644 qse/regress/awk/hanoi.awk create mode 100644 qse/regress/awk/quicksort.awk create mode 100644 qse/regress/awk/quicksort.d create mode 100644 qse/regress/awk/quicksort2.awk create mode 100644 qse/regress/awk/quicksort2.d create mode 100755 qse/regress/awk/regress.sh create mode 100644 qse/regress/awk/stripcomment.awk create mode 100644 qse/regress/awk/stripcomment.d create mode 100644 qse/regress/awk/wordfreq.awk rename qse/{test => samples}/Makefile.am (100%) rename qse/{test => samples}/Makefile.in (99%) rename qse/{test => samples}/awk/Makefile.am (100%) rename qse/{test => samples}/awk/Makefile.in (99%) rename qse/{test => samples}/awk/awk01.c (100%) rename qse/{test => samples}/awk/awk02.c (100%) rename qse/{test => samples}/awk/awk03.c (100%) rename qse/{test => samples}/awk/awk04.c (100%) rename qse/{test => samples}/awk/awk05.cpp (100%) rename qse/{test => samples}/cmn/Makefile.am (100%) rename qse/{test => samples}/cmn/Makefile.in (99%) rename qse/{test => samples}/cmn/chr.c (100%) rename qse/{test => samples}/cmn/fio.c (100%) rename qse/{test => samples}/cmn/lda.c (100%) rename qse/{test => samples}/cmn/map.c (100%) rename qse/{test => samples}/cmn/pio.c (100%) rename qse/{test => samples}/cmn/sio.c (100%) rename qse/{test => samples}/cmn/sll.c (100%) rename qse/{test => samples}/cmn/str.c (100%) rename qse/{test => samples}/cmn/time.c (100%) rename qse/{test => samples}/sed/Makefile.am (100%) rename qse/{test => samples}/sed/Makefile.in (99%) rename qse/{test => samples}/sed/sed01.c (100%) rename qse/{test => samples}/sed/sed02.cpp (100%) rename qse/{test => samples}/sed/sed03.cpp (100%) rename qse/{test => samples}/utl/Makefile.am (100%) rename qse/{test => samples}/utl/Makefile.in (98%) diff --git a/qse/Makefile.am b/qse/Makefile.am index 0ce1073f..60bff7e7 100644 --- a/qse/Makefile.am +++ b/qse/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTION = foreign # EXTRA_DIST = SUBDIRS = lib cmd -DIST_SUBDIRS = $(SUBDIRS) include test doc +DIST_SUBDIRS = $(SUBDIRS) include regress samples doc install-data-hook: cd include && $(MAKE) install diff --git a/qse/Makefile.in b/qse/Makefile.in index 47aad38b..2ba76130 100644 --- a/qse/Makefile.in +++ b/qse/Makefile.in @@ -213,7 +213,7 @@ ACLOCAL_AMFLAGS = -I ac/m4 AUTOMAKE_OPTION = foreign # EXTRA_DIST = SUBDIRS = lib cmd -DIST_SUBDIRS = $(SUBDIRS) include test doc +DIST_SUBDIRS = $(SUBDIRS) include regress samples doc all: all-recursive .SUFFIXES: diff --git a/qse/cmd/awk/regress.sh b/qse/cmd/awk/regress.sh index accfc423..064ac86c 100755 --- a/qse/cmd/awk/regress.sh +++ b/qse/cmd/awk/regress.sh @@ -39,11 +39,6 @@ run_init() run_script_for_init_main "$script" done - for script in emp-???.awk - do - run_script_for_init "$script" "emp-en.data" - done - for script in cou-???.awk do run_script_for_init "$script" "cou-en.data" @@ -153,20 +148,6 @@ run_test() } done - for script in emp-???.awk - do - run_script_for_test "$script" "emp-en.data" - [ $? -ne 0 ] && { - echo "###################################" - echo "PROBLEM(S) DETECTED IN $script.". - echo "###################################" - - echo "Do you want to abort? [y/n]" - read ans - [ "$ans" = "y" -o "$ans" = "Y" ] && return 1 - } - done - for script in cou-???.awk do run_script_for_test "$script" "cou-en.data" diff --git a/qse/configure b/qse/configure index 43512788..4506b33a 100755 --- a/qse/configure +++ b/qse/configure @@ -25648,7 +25648,7 @@ QSE_SIZEOF_DOUBLE=$ac_cv_sizeof_double QSE_SIZEOF_LONG_DOUBLE=$ac_cv_sizeof_long_double -ac_config_files="$ac_config_files Makefile include/Makefile include/qse/Makefile include/qse/cmn/Makefile include/qse/utl/Makefile include/qse/sed/Makefile include/qse/awk/Makefile include/qse/lsp/Makefile lib/Makefile lib/cmn/Makefile lib/utl/Makefile lib/sed/Makefile lib/awk/Makefile lib/lsp/Makefile cmd/Makefile cmd/utl/Makefile cmd/awk/Makefile cmd/lsp/Makefile test/Makefile test/cmn/Makefile test/utl/Makefile test/sed/Makefile test/awk/Makefile doc/Makefile doc/page/Makefile doc/page.ko/Makefile doc/Doxyfile" +ac_config_files="$ac_config_files Makefile include/Makefile include/qse/Makefile include/qse/cmn/Makefile include/qse/utl/Makefile include/qse/sed/Makefile include/qse/awk/Makefile include/qse/lsp/Makefile lib/Makefile lib/cmn/Makefile lib/utl/Makefile lib/sed/Makefile lib/awk/Makefile lib/lsp/Makefile cmd/Makefile cmd/utl/Makefile cmd/awk/Makefile cmd/lsp/Makefile samples/Makefile samples/cmn/Makefile samples/utl/Makefile samples/sed/Makefile samples/awk/Makefile doc/Makefile doc/page/Makefile doc/page.ko/Makefile doc/Doxyfile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -26684,11 +26684,11 @@ do "cmd/utl/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/utl/Makefile" ;; "cmd/awk/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/awk/Makefile" ;; "cmd/lsp/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/lsp/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; - "test/cmn/Makefile") CONFIG_FILES="$CONFIG_FILES test/cmn/Makefile" ;; - "test/utl/Makefile") CONFIG_FILES="$CONFIG_FILES test/utl/Makefile" ;; - "test/sed/Makefile") CONFIG_FILES="$CONFIG_FILES test/sed/Makefile" ;; - "test/awk/Makefile") CONFIG_FILES="$CONFIG_FILES test/awk/Makefile" ;; + "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; + "samples/cmn/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cmn/Makefile" ;; + "samples/utl/Makefile") CONFIG_FILES="$CONFIG_FILES samples/utl/Makefile" ;; + "samples/sed/Makefile") CONFIG_FILES="$CONFIG_FILES samples/sed/Makefile" ;; + "samples/awk/Makefile") CONFIG_FILES="$CONFIG_FILES samples/awk/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/page/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page/Makefile" ;; "doc/page.ko/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page.ko/Makefile" ;; diff --git a/qse/configure.ac b/qse/configure.ac index d3ba1b62..81c29669 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -261,11 +261,11 @@ AC_CONFIG_FILES([ cmd/utl/Makefile cmd/awk/Makefile cmd/lsp/Makefile - test/Makefile - test/cmn/Makefile - test/utl/Makefile - test/sed/Makefile - test/awk/Makefile + samples/Makefile + samples/cmn/Makefile + samples/utl/Makefile + samples/sed/Makefile + samples/awk/Makefile doc/Makefile doc/page/Makefile doc/page.ko/Makefile diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index c683cc5a..c9e30bd1 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 207 2009-06-22 13:01:28Z hyunghwan.chung $ + * $Id: awk.h 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -418,8 +418,7 @@ enum qse_awk_option_t * implementations */ QSE_AWK_CLASSIC = QSE_AWK_IMPLICIT | QSE_AWK_RIO | - QSE_AWK_NEWLINE | QSE_AWK_PABLOCK | - QSE_AWK_STRIPSPACES + QSE_AWK_NEWLINE | QSE_AWK_PABLOCK }; /** @@ -1097,6 +1096,7 @@ qse_real_t qse_awk_strxtoreal ( ); qse_size_t qse_awk_longtostr ( + qse_awk_t* awk, qse_long_t value, int radix, const qse_char_t* prefix, @@ -1257,23 +1257,19 @@ qse_awk_val_t* qse_awk_rtx_getarg ( ); /******/ -/****f* AWK/qse_awk_rtx_getgbl - * NAME - * qse_awk_rtx_getgbl - gets the value of a global variable - * INPUTS - * * rtx - a runtime context - * * id - a global variable ID. It is one of the predefined global - * variable IDs or a value returned by qse_awk_addgbl(). - * RETURN - * The pointer to a value is returned. This function never fails - * so long as the ID is valid. Otherwise, you may fall into trouble. - * SYNOPSIS +/** + * The qse_awk_rtx_getgbl() gets the value of a global variable. + * The global variable ID @a id is one of the predefined global + * variable IDs or a value returned by qse_awk_addgbl(). + * This function never fails so long as the ID is valid. Otherwise, + * you may get into trouble. + * + * @return a value pointer */ qse_awk_val_t* qse_awk_rtx_getgbl ( - qse_awk_rtx_t* rtx, - int id + qse_awk_rtx_t* rtx, /**< a runtime context */ + int id /**< a global variable ID */ ); -/******/ /****f* AWK/qse_awk_rtx_setgbl * NAME diff --git a/qse/include/qse/awk/std.h b/qse/include/qse/awk/std.h index 624225a2..9c5ff5a3 100644 --- a/qse/include/qse/awk/std.h +++ b/qse/include/qse/awk/std.h @@ -1,5 +1,5 @@ /* - * $Id: std.h 207 2009-06-22 13:01:28Z hyunghwan.chung $ + * $Id: std.h 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -34,6 +34,7 @@ * - StdAwk ARGV and console name handling * - add RQ and LQ for more powerful record splitting * - improve performance in qse_awk_rtx_readio() if RS is logner than 2 chars. + * - change the message for EIONMNL */ /** diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index cb976614..b31f000b 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c 207 2009-06-22 13:01:28Z hyunghwan.chung $ + * $Id: err.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -146,7 +146,7 @@ const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum) QSE_T("no such io name found"), QSE_T("i/o handler returned an error"), QSE_T("i/o name empty"), - QSE_T("i/o name containing a null character"), + QSE_T("i/o name '${0}' containing a null character"), QSE_T("not sufficient arguments to formatting sequence"), QSE_T("recursion detected in format conversion"), QSE_T("invalid character in CONVFMT"), diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index 76c15615..d618046b 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -1,5 +1,5 @@ /* - * $Id: fnc.c 203 2009-06-17 12:43:50Z hyunghwan.chung $ + * $Id: fnc.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -787,7 +787,7 @@ static int fnc_split ( /* put it into the map */ key_len = qse_awk_longtostr ( - ++nflds, 10, QSE_NULL, key, QSE_COUNTOF(key)); + run->awk, ++nflds, 10, QSE_NULL, key, QSE_COUNTOF(key)); QSE_ASSERT (key_len != (qse_size_t)-1); /* don't forget to update the reference count when you diff --git a/qse/lib/awk/misc.c b/qse/lib/awk/misc.c index f2fad2de..b00e8ed4 100644 --- a/qse/lib/awk/misc.c +++ b/qse/lib/awk/misc.c @@ -1,5 +1,5 @@ /* - * $Id: misc.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: misc.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -533,8 +533,8 @@ done: } qse_size_t qse_awk_longtostr ( - qse_long_t value, int radix, const qse_char_t* prefix, - qse_char_t* buf, qse_size_t size) + qse_awk_t* awk, qse_long_t value, + int radix, const qse_char_t* prefix, qse_char_t* buf, qse_size_t size) { qse_long_t t, rem; qse_size_t len, ret, i; diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 3a8f6711..7ae7bbb4 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 207 2009-06-22 13:01:28Z hyunghwan.chung $ + * $Id: parse.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -5697,7 +5697,8 @@ static int deparse (qse_awk_t* awk) } else { - len = qse_awk_longtostr ((qse_long_t)i, + len = qse_awk_longtostr ( + awk, (qse_long_t)i, 10, QSE_T("__g"), tmp, QSE_COUNTOF(tmp)); QSE_ASSERT (len != (qse_size_t)-1); if (qse_awk_putsrcstrx (awk, tmp, len) == -1) @@ -5722,7 +5723,8 @@ static int deparse (qse_awk_t* awk) } else { - len = qse_awk_longtostr ((qse_long_t)i, + len = qse_awk_longtostr ( + awk, (qse_long_t)i, 10, QSE_T("__g"), tmp, QSE_COUNTOF(tmp)); QSE_ASSERT (len != (qse_size_t)-1); if (qse_awk_putsrcstrx (awk, tmp, len) == -1) @@ -5858,7 +5860,8 @@ exit_deparse: -static qse_map_walk_t deparse_func (qse_map_t* map, qse_map_pair_t* pair, void* arg) +static qse_map_walk_t deparse_func ( + qse_map_t* map, qse_map_pair_t* pair, void* arg) { struct deparse_func_t* df = (struct deparse_func_t*)arg; /* CHECK: */ @@ -5892,7 +5895,8 @@ static qse_map_walk_t deparse_func (qse_map_t* map, qse_map_pair_t* pair, void* for (i = 0; i < fun->nargs; ) { - n = qse_awk_longtostr (i++, 10, + n = qse_awk_longtostr ( + df->awk, i++, 10, QSE_T("__p"), df->tmp, df->tmp_len); QSE_ASSERT (n != (qse_size_t)-1); PUT_SX (df, df->tmp, n); diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index e31a7b39..d8cdef9c 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 207 2009-06-22 13:01:28Z hyunghwan.chung $ + * $Id: run.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -1004,7 +1004,8 @@ static int build_runarg ( } key_len = qse_awk_longtostr ( - argc, 10, QSE_NULL, key, QSE_COUNTOF(key)); + run->awk, argc, 10, + QSE_NULL, key, QSE_COUNTOF(key)); QSE_ASSERT (key_len != (qse_size_t)-1); /* increment reference count of v_tmp in advance as if @@ -2820,10 +2821,21 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) { if (out[--len] == QSE_T('\0')) { + qse_cstr_t errarg; + + errarg.ptr = out; + /* provide length up to one character before + * the first null not to contains a null + * in an error message */ + errarg.len = qse_strlen(out); + + qse_awk_rtx_seterror ( + run, QSE_AWK_EIONMNL, + nde->line, &errarg + ); + /* if so, it skips writing */ QSE_AWK_FREE (run->awk, out); - qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMNL, nde->line, QSE_NULL); return -1; } } @@ -2978,11 +2990,22 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) { if (out[--len] == QSE_T('\0')) { + qse_cstr_t errarg; + + errarg.ptr = out; + /* provide length up to one character before + * the first null not to contains a null + * in an error message */ + errarg.len = qse_strlen(out); + + qse_awk_rtx_seterror ( + run, QSE_AWK_EIONMNL, + nde->line, &errarg + ); + /* the output destination name contains a null * character. */ QSE_AWK_FREE (run->awk, out); - qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMNL, nde->line, QSE_NULL); return -1; } } @@ -6380,7 +6403,9 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (in[--len] == QSE_T('\0')) { /* the input source name contains a null - * character. make getline return -1 */ + * character. make getline return -1. + * unlike print & printf, it is not a hard + * error */ QSE_AWK_FREE (run->awk, in); n = -1; goto skip_read; diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 659b523e..00375bb0 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -1,5 +1,5 @@ /* - * $Id: std.c 209 2009-06-23 13:29:18Z hyunghwan.chung $ + * $Id: std.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -78,6 +78,7 @@ typedef struct rxtn_t struct { const qse_char_t*const* files; qse_size_t index; + qse_size_t count; } in; struct @@ -616,15 +617,92 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) * any fields of riod when the open operation fails */ qse_sio_t* sio; const qse_char_t* file; + qse_awk_val_t* argv; + qse_map_t* map; + qse_map_pair_t* pair; + qse_char_t ibuf[128]; + qse_size_t ibuflen; + qse_awk_val_t* v; + qse_awk_rtx_valtostr_out_t out; + nextfile: file = rxtn->c.in.files[rxtn->c.in.index]; if (file == QSE_NULL) { /* no more input file */ + + if (rxtn->c.in.count == 0) + { + /* all ARGVs are empty strings. + * so no console files were opened. + * open the standard input here. + * + * 'BEGIN { ARGV[1]=""; ARGV[2]=""; } + * { print $0; }' file1 file2 + */ + riod->handle = qse_sio_in; + rxtn->c.in.count++; + return 1; + } + return 0; } + /* handle special case when ARGV[x] has been altered. + * so from here down, the file name gotten from + * rxtn->c.in.files is not important and is overridden + * from ARGV. + * 'BEGIN { ARGV[1]="file3"; } + * { print $0; }' file1 file2 + */ + argv = qse_awk_rtx_getgbl (rtx, QSE_AWK_GBL_ARGV); + QSE_ASSERT (argv != QSE_NULL); + QSE_ASSERT (argv->type == QSE_AWK_VAL_MAP); + + map = ((qse_awk_val_map_t*)argv)->map; + QSE_ASSERT (map != QSE_NULL); + + ibuflen = qse_awk_longtostr ( + rtx->awk, rxtn->c.in.index + 1, 10, QSE_NULL, + ibuf, QSE_COUNTOF(ibuf)); + + pair = qse_map_search (map, ibuf, ibuflen); + QSE_ASSERT (pair != QSE_NULL); + + v = QSE_MAP_VPTR(pair); + QSE_ASSERT (v != QSE_NULL); + + out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; + if (qse_awk_rtx_valtostr (rtx, v, &out) == QSE_NULL) return -1; + + if (out.u.cpldup.len == 0) + { + /* the name is empty */ + qse_awk_rtx_free (rtx, out.u.cpldup.ptr); + rxtn->c.in.index++; + goto nextfile; + } + + if (qse_strlen(out.u.cpldup.ptr) < out.u.cpldup.len) + { + /* the name contains one or more '\0' */ + qse_cstr_t errarg; + + errarg.ptr = out.u.cpldup.ptr; + /* use this length not to contains '\0' + * in an error message */ + errarg.len = qse_strlen(out.u.cpldup.ptr); + + qse_awk_rtx_seterror ( + rtx, QSE_AWK_EIONMNL, 0, &errarg); + + qse_awk_rtx_free (rtx, out.u.cpldup.ptr); + return -1; + } + + file = out.u.cpldup.ptr; + if (file[0] == QSE_T('-') && file[1] == QSE_T('\0')) { /* special file name '-' */ @@ -643,6 +721,8 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) qse_awk_rtx_seterror ( rtx, QSE_AWK_EOPEN, 0, &errarg); + + qse_awk_rtx_free (rtx, out.u.cpldup.ptr); return -1; } } @@ -651,10 +731,15 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) rtx, file, qse_strlen(file)) == -1) { if (sio != qse_sio_in) qse_sio_close (sio); + qse_awk_rtx_free (rtx, out.u.cpldup.ptr); return -1; } + qse_awk_rtx_free (rtx, out.u.cpldup.ptr); riod->handle = sio; + + /* increment the counter of files successfully opened */ + rxtn->c.in.count++; } rxtn->c.in.index++; @@ -704,7 +789,6 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) } } - if (qse_awk_rtx_setofilename ( rtx, file, qse_strlen(file)) == -1) { @@ -932,6 +1016,7 @@ qse_awk_rtx_t* qse_awk_rtx_openstd ( rxtn->c.in.files = icf; rxtn->c.in.index = 0; + rxtn->c.in.count = 0; rxtn->c.out.files = ocf; rxtn->c.out.index = 0; diff --git a/qse/lib/awk/tree.c b/qse/lib/awk/tree.c index 674c17a8..d5e878fa 100644 --- a/qse/lib/awk/tree.c +++ b/qse/lib/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c 75 2009-02-22 14:10:34Z hyunghwan.chung $ + * $Id: tree.c 210 2009-06-24 08:29:33Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -320,7 +320,10 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) QSE_ASSERT (px->id.idxa != (qse_size_t)-1); n = qse_awk_longtostr ( - px->id.idxa, 10, QSE_NULL, tmp, QSE_COUNTOF(tmp)); + awk, + px->id.idxa, + 10, QSE_NULL, tmp, QSE_COUNTOF(tmp) + ); PUT_SRCSTR (awk, QSE_T("__p")); PUT_SRCSTRX (awk, tmp, n); @@ -338,8 +341,10 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) PUT_SRCSTR (awk, QSE_T("__p")); n = qse_awk_longtostr ( + awk, px->id.idxa, 10, QSE_NULL, - awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt)); + awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt) + ); PUT_SRCSTRX (awk, awk->tmp.fmt, n); PUT_SRCSTR (awk, QSE_T("[")); PRINT_EXPRESSION_LIST (awk, px->idx); @@ -396,8 +401,12 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) PUT_SRCSTR (awk, QSE_T("__g")); n = qse_awk_longtostr ( - px->id.idxa, 10, - QSE_NULL, tmp, QSE_COUNTOF(tmp)); + awk, + px->id.idxa, + 10, + QSE_NULL, + tmp, QSE_COUNTOF(tmp) + ); PUT_SRCSTRX (awk, tmp, n); } } @@ -434,8 +443,12 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) PUT_SRCSTR (awk, QSE_T("__g")); n = qse_awk_longtostr ( - px->id.idxa, 10, - QSE_NULL, tmp, QSE_COUNTOF(tmp)); + awk, + px->id.idxa, + 10, + QSE_NULL, + tmp, QSE_COUNTOF(tmp) + ); PUT_SRCSTRX (awk, tmp, n); } PUT_SRCSTR (awk, QSE_T("[")); @@ -460,8 +473,13 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) { PUT_SRCSTR (awk, QSE_T("__l")); n = qse_awk_longtostr ( - px->id.idxa, 10, QSE_NULL, - awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt)); + awk, + px->id.idxa, + 10, + QSE_NULL, + awk->tmp.fmt, + QSE_COUNTOF(awk->tmp.fmt) + ); PUT_SRCSTRX (awk, awk->tmp.fmt, n); } else @@ -481,8 +499,13 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde) { PUT_SRCSTR (awk, QSE_T("__l")); n = qse_awk_longtostr ( - px->id.idxa, 10, QSE_NULL, - awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt)); + awk, + px->id.idxa, + 10, + QSE_NULL, + awk->tmp.fmt, + QSE_COUNTOF(awk->tmp.fmt) + ); PUT_SRCSTRX (awk, awk->tmp.fmt, n); PUT_SRCSTR (awk, QSE_T("[")); } @@ -616,16 +639,26 @@ static int print_statement (qse_awk_t* awk, qse_awk_nde_t* p, int depth) { PUT_SRCSTR (awk, QSE_T("__l")); n = qse_awk_longtostr ( - i, 10, QSE_NULL, - awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt)); + awk, + i, + 10, + QSE_NULL, + awk->tmp.fmt, + QSE_COUNTOF(awk->tmp.fmt) + ); PUT_SRCSTRX (awk, awk->tmp.fmt, n); PUT_SRCSTR (awk, QSE_T(", ")); } PUT_SRCSTR (awk, QSE_T("__l")); n = qse_awk_longtostr ( - i, 10, QSE_NULL, - awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt)); + awk, + i, + 10, + QSE_NULL, + awk->tmp.fmt, + QSE_COUNTOF(awk->tmp.fmt) + ); PUT_SRCSTRX (awk, awk->tmp.fmt, n); PUT_SRCSTR (awk, QSE_T(";")); PUT_NEWLINE (awk); diff --git a/qse/regress/awk/adm.d1 b/qse/regress/awk/adm.d1 new file mode 100644 index 00000000..d1f4e3ab --- /dev/null +++ b/qse/regress/awk/adm.d1 @@ -0,0 +1,14 @@ + ld zero # initialize sum to zero + st sum +loop get # read a number + jz done # no more input if number is zero + add sum # add in accumulated sum + st sum # store new value back in sum + j loop # go back and read another number + +done ld sum # print sum + put + halt + +zero const 0 +sum const diff --git a/qse/regress/awk/asm.awk b/qse/regress/awk/asm.awk new file mode 100644 index 00000000..314fec24 --- /dev/null +++ b/qse/regress/awk/asm.awk @@ -0,0 +1,51 @@ +# +# $Id: asm.awk,v 1.4 2007/09/27 11:33:45 bacon Exp $ +# +# Taken from the book "The AWK Programming Language" +# + +BEGIN { + srcfile = ARGV[1]; + ARGV[1] = ""; + tempfile = "asm.temp"; + n = split("const get put ld st add sub jpos jz j halt", x); + for (i = 1; i <= n; i++) op[x[i]] = i - 1; + +# PASS 1 + FS = "[ \t]+"; + while (getline 0) { + sub (/#.*/, ""); + symtab[$1] = nextmem; + + if ($2 != "") { + print $2 "\t" $3 >tempfile; + nextmem++; + } + } + close (tempfile); + +# PASS 2 + nextmem = 0; + while (getline 0) { + if ($2 !~ /^[0-9]*$/) $2 = symtab[$2]; + mem[nextmem++] = 1000 * op[$1] + $2; + } + +# INTERPRETER + for (pc = 0; pc >= 0; ) { + addr = mem[pc] % 1000; + code = int(mem[pc++] / 1000); + if (code == op["get"]) { if (getline acc <= 0) acc = 0; } + else if (code == op["put"]) { print acc; } + else if (code == op["st"]) { mem[addr] = acc; } + else if (code == op["ld"]) { acc = mem[addr]; } + else if (code == op["add"]) { acc += mem[addr]; } + else if (code == op["sub"]) { acc -= mem[addr]; } + else if (code == op["jpos"]) { if (acc > 0) pc = addr; } + else if (code == op["jz"]) { if (acc == 0) pc = addr; } + else if (code == op["j"]) { pc = addr; } + else if (code == op["halt"]) { pc = -1; } + else { pc = -1; } + } +} + diff --git a/qse/regress/awk/asm.d1 b/qse/regress/awk/asm.d1 new file mode 100644 index 00000000..d1f4e3ab --- /dev/null +++ b/qse/regress/awk/asm.d1 @@ -0,0 +1,14 @@ + ld zero # initialize sum to zero + st sum +loop get # read a number + jz done # no more input if number is zero + add sum # add in accumulated sum + st sum # store new value back in sum + j loop # go back and read another number + +done ld sum # print sum + put + halt + +zero const 0 +sum const diff --git a/qse/regress/awk/asm.d2 b/qse/regress/awk/asm.d2 new file mode 100644 index 00000000..96f77961 --- /dev/null +++ b/qse/regress/awk/asm.d2 @@ -0,0 +1,11 @@ +10 +20 +30 +40 +50 +60 +70 +80 +90 +100 +-1 diff --git a/qse/cmd/awk/emp-001.awk b/qse/regress/awk/emp-001.awk similarity index 100% rename from qse/cmd/awk/emp-001.awk rename to qse/regress/awk/emp-001.awk diff --git a/qse/cmd/awk/emp-002.awk b/qse/regress/awk/emp-002.awk similarity index 100% rename from qse/cmd/awk/emp-002.awk rename to qse/regress/awk/emp-002.awk diff --git a/qse/cmd/awk/emp-003.awk b/qse/regress/awk/emp-003.awk similarity index 100% rename from qse/cmd/awk/emp-003.awk rename to qse/regress/awk/emp-003.awk diff --git a/qse/cmd/awk/emp-004.awk b/qse/regress/awk/emp-004.awk similarity index 100% rename from qse/cmd/awk/emp-004.awk rename to qse/regress/awk/emp-004.awk diff --git a/qse/cmd/awk/emp-005.awk b/qse/regress/awk/emp-005.awk similarity index 100% rename from qse/cmd/awk/emp-005.awk rename to qse/regress/awk/emp-005.awk diff --git a/qse/cmd/awk/emp-006.awk b/qse/regress/awk/emp-006.awk similarity index 100% rename from qse/cmd/awk/emp-006.awk rename to qse/regress/awk/emp-006.awk diff --git a/qse/cmd/awk/emp-007.awk b/qse/regress/awk/emp-007.awk similarity index 100% rename from qse/cmd/awk/emp-007.awk rename to qse/regress/awk/emp-007.awk diff --git a/qse/cmd/awk/emp-008.awk b/qse/regress/awk/emp-008.awk similarity index 100% rename from qse/cmd/awk/emp-008.awk rename to qse/regress/awk/emp-008.awk diff --git a/qse/cmd/awk/emp-009.awk b/qse/regress/awk/emp-009.awk similarity index 100% rename from qse/cmd/awk/emp-009.awk rename to qse/regress/awk/emp-009.awk diff --git a/qse/cmd/awk/emp-010.awk b/qse/regress/awk/emp-010.awk similarity index 100% rename from qse/cmd/awk/emp-010.awk rename to qse/regress/awk/emp-010.awk diff --git a/qse/cmd/awk/emp-011.awk b/qse/regress/awk/emp-011.awk similarity index 100% rename from qse/cmd/awk/emp-011.awk rename to qse/regress/awk/emp-011.awk diff --git a/qse/cmd/awk/emp-012.awk b/qse/regress/awk/emp-012.awk similarity index 100% rename from qse/cmd/awk/emp-012.awk rename to qse/regress/awk/emp-012.awk diff --git a/qse/cmd/awk/emp-013.awk b/qse/regress/awk/emp-013.awk similarity index 100% rename from qse/cmd/awk/emp-013.awk rename to qse/regress/awk/emp-013.awk diff --git a/qse/cmd/awk/emp-014.awk b/qse/regress/awk/emp-014.awk similarity index 100% rename from qse/cmd/awk/emp-014.awk rename to qse/regress/awk/emp-014.awk diff --git a/qse/cmd/awk/emp-015.awk b/qse/regress/awk/emp-015.awk similarity index 100% rename from qse/cmd/awk/emp-015.awk rename to qse/regress/awk/emp-015.awk diff --git a/qse/cmd/awk/emp-016.awk b/qse/regress/awk/emp-016.awk similarity index 100% rename from qse/cmd/awk/emp-016.awk rename to qse/regress/awk/emp-016.awk diff --git a/qse/cmd/awk/emp-017.awk b/qse/regress/awk/emp-017.awk similarity index 100% rename from qse/cmd/awk/emp-017.awk rename to qse/regress/awk/emp-017.awk diff --git a/qse/cmd/awk/emp-018.awk b/qse/regress/awk/emp-018.awk similarity index 100% rename from qse/cmd/awk/emp-018.awk rename to qse/regress/awk/emp-018.awk diff --git a/qse/cmd/awk/emp-019.awk b/qse/regress/awk/emp-019.awk similarity index 100% rename from qse/cmd/awk/emp-019.awk rename to qse/regress/awk/emp-019.awk diff --git a/qse/cmd/awk/emp-020.awk b/qse/regress/awk/emp-020.awk similarity index 100% rename from qse/cmd/awk/emp-020.awk rename to qse/regress/awk/emp-020.awk diff --git a/qse/cmd/awk/emp-021.awk b/qse/regress/awk/emp-021.awk similarity index 100% rename from qse/cmd/awk/emp-021.awk rename to qse/regress/awk/emp-021.awk diff --git a/qse/cmd/awk/emp-022.awk b/qse/regress/awk/emp-022.awk similarity index 100% rename from qse/cmd/awk/emp-022.awk rename to qse/regress/awk/emp-022.awk diff --git a/qse/cmd/awk/emp-023.awk b/qse/regress/awk/emp-023.awk similarity index 100% rename from qse/cmd/awk/emp-023.awk rename to qse/regress/awk/emp-023.awk diff --git a/qse/cmd/awk/emp-024.awk b/qse/regress/awk/emp-024.awk similarity index 100% rename from qse/cmd/awk/emp-024.awk rename to qse/regress/awk/emp-024.awk diff --git a/qse/cmd/awk/emp-025.awk b/qse/regress/awk/emp-025.awk similarity index 100% rename from qse/cmd/awk/emp-025.awk rename to qse/regress/awk/emp-025.awk diff --git a/qse/cmd/awk/emp-026.awk b/qse/regress/awk/emp-026.awk similarity index 100% rename from qse/cmd/awk/emp-026.awk rename to qse/regress/awk/emp-026.awk diff --git a/qse/cmd/awk/emp-027.awk b/qse/regress/awk/emp-027.awk similarity index 100% rename from qse/cmd/awk/emp-027.awk rename to qse/regress/awk/emp-027.awk diff --git a/qse/regress/awk/emp.d b/qse/regress/awk/emp.d new file mode 100644 index 00000000..029863ff --- /dev/null +++ b/qse/regress/awk/emp.d @@ -0,0 +1,6 @@ +Beth 4.00 0 +Dan 3.74 0 +Kathy 4.00 10 +Mark 5.00 20 +Mary 5.50 22 +Susie 4.25 18 diff --git a/qse/regress/awk/hanoi.awk b/qse/regress/awk/hanoi.awk new file mode 100644 index 00000000..ca71a6e1 --- /dev/null +++ b/qse/regress/awk/hanoi.awk @@ -0,0 +1,40 @@ +BEGIN { + n = arg("-n",5) + for (j=0; j= right) + return + swap(A, left, left+int((right-left+1)*rand())) + last = left + for (i = left+1; i <= right; i++) + { +# print A[i] "/" A[left] "....." (A[i] < A[left]) + if (A[i] < A[left]) + { + swap(A, ++last, i) + } + } + swap(A, left, last) + qsort(A, left, last-1) + qsort(A, last+1, right) +} +function swap(A, i, j, t) { + t = A[i]; A[i] = A[j]; A[j] = t +} +#./PRE +#.H2 See also +#.P +#.URL http://awk.info/?quicksort2 quicksort2.awk +#.H2 Authors +#.P Alfred Aho, Peter Weinberger, Brian Kernighan, 1988. diff --git a/qse/regress/awk/quicksort.d b/qse/regress/awk/quicksort.d new file mode 100644 index 00000000..85b3e055 --- /dev/null +++ b/qse/regress/awk/quicksort.d @@ -0,0 +1,16 @@ +34 +0.11111111111111111111111111111 +0.0000000000 +0b11111 +0xA +1 +35 +92 +19123 +29 +1.E12 +11.2839091 +12 +99X +301 +493 diff --git a/qse/regress/awk/quicksort2.awk b/qse/regress/awk/quicksort2.awk new file mode 100644 index 00000000..36ef73a8 --- /dev/null +++ b/qse/regress/awk/quicksort2.awk @@ -0,0 +1,17 @@ +BEGIN { + recurse1 = "../../cmd/awk/qseawk -f quicksort2.awk #" rand() + recurse2 = "../../cmd/awk/qseawk -f quicksort2.awk #" rand() + } +NR == 1 { + pivot=$0; + next +} +NR > 1 { if($0 < pivot) { print | recurse1 } + if($0 > pivot) { print | recurse2 } + } +END { + close(recurse1) + if(NR > 0) print pivot + close(recurse2) + } + diff --git a/qse/regress/awk/quicksort2.d b/qse/regress/awk/quicksort2.d new file mode 100644 index 00000000..85b3e055 --- /dev/null +++ b/qse/regress/awk/quicksort2.d @@ -0,0 +1,16 @@ +34 +0.11111111111111111111111111111 +0.0000000000 +0b11111 +0xA +1 +35 +92 +19123 +29 +1.E12 +11.2839091 +12 +99X +301 +493 diff --git a/qse/regress/awk/regress.sh b/qse/regress/awk/regress.sh new file mode 100755 index 00000000..9864bcc1 --- /dev/null +++ b/qse/regress/awk/regress.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +echo_so() +{ + tput smso + while [ $# -gt 0 ] + do + echo -n "$1 " + shift + done + echo + tput rmso +} + +print_usage() +{ + echo "Usage: $0 init" + echo " $0 test" +} + +################### +# MAIN # +################### + +QSEAWK="../../cmd/awk/qseawk" +PROGS=" + emp-001.awk/emp.d// + emp-002.awk/emp.d// + emp-003.awk/emp.d// + emp-004.awk/emp.d// + emp-005.awk/emp.d// + emp-006.awk/emp.d// + emp-007.awk/emp.d// + emp-008.awk/emp.d// + emp-009.awk/emp.d// + emp-010.awk/emp.d// + emp-011.awk/emp.d// + emp-012.awk/emp.d// + emp-013.awk/emp.d// + emp-014.awk/emp.d// + emp-015.awk/emp.d// + emp-016.awk/emp.d// + emp-017.awk/emp.d// + emp-018.awk/emp.d// + emp-019.awk/emp.d// + emp-020.awk/emp.d// + emp-021.awk/emp.d// + emp-022.awk/emp.d// + emp-023.awk/emp.d// + emp-024.awk/emp.d// + emp-025.awk/emp.d// + emp-026.awk/emp.d// + emp-027.awk/emp.d// + + quicksort.awk/quicksort.d// + quicksort2.awk/quicksort2.d// + asm.awk/asm.d1/asm.d2/ + stripcomment.awk/stripcomment.d// + wordfreq.awk/wordfreq.awk// + hanoi.awk// +" + +[ -x "${QSEAWK}" ] || { + echo "ERROR: ${QSEAWK} not found" + exit 1; +} + +for prog in ${PROGS} +do + script="`echo ${prog} | cut -d/ -f1`" + datafile="`echo ${prog} | cut -d/ -f2`" + redinfile="`echo ${prog} | cut -d/ -f3`" + awkopts="`echo ${prog} | cut -d/ -f4`" + + if [ -n "${redinfile}" ] + then + echo_so "${QSEAWK} ${awkopts} -f ${script} ${datafile} < ${redinfile}" + ${QSEAWK} ${awkopts} -f ${script} ${datafile} < ${redinfile} + else + echo_so "${QSEAWK} ${awkopts} -f ${script} ${datafile}" + ${QSEAWK} ${awkopts} -f ${script} ${datafile} + fi +done + +exit 0 diff --git a/qse/regress/awk/stripcomment.awk b/qse/regress/awk/stripcomment.awk new file mode 100644 index 00000000..a4b72f8a --- /dev/null +++ b/qse/regress/awk/stripcomment.awk @@ -0,0 +1,11 @@ +BEGIN { + RS = "/\\*([^*]|\\*+[^/*])*\\*+/" + # comment is record separator + ORS = " " + getline hold +} + +{ print hold ; hold = $0 } + +END { printf "%s" , hold } + diff --git a/qse/regress/awk/stripcomment.d b/qse/regress/awk/stripcomment.d new file mode 100644 index 00000000..12b65aa5 --- /dev/null +++ b/qse/regress/awk/stripcomment.d @@ -0,0 +1,10 @@ +/* sample C program */ + +#include +int main () +{ + /* print hello world + * with printf */ + printf ("hello, world\n"); + return 0; +} diff --git a/qse/regress/awk/wordfreq.awk b/qse/regress/awk/wordfreq.awk new file mode 100644 index 00000000..4e922ab3 --- /dev/null +++ b/qse/regress/awk/wordfreq.awk @@ -0,0 +1,20 @@ +# wordfreq.awk --- print list of word frequencies + +{ + $0 = tolower($0); # remove case distinctions + + # remove punctuation + a=0; + gsub(/[^[:alnum:]_[:blank:]]/, " ", $a); + #gsub(/[^[:alnum:]_[:blank:]]/, " "); + + for (i = 1; i <= NF; i++) freq[$i]++; +} +#/[^kkka-bcx-dd-y]|abc|def/ + +END { + for (word in freq) + print word, freq[word]; +} + + diff --git a/qse/test/Makefile.am b/qse/samples/Makefile.am similarity index 100% rename from qse/test/Makefile.am rename to qse/samples/Makefile.am diff --git a/qse/test/Makefile.in b/qse/samples/Makefile.in similarity index 99% rename from qse/test/Makefile.in rename to qse/samples/Makefile.in index 711e4f88..f619fe4e 100644 --- a/qse/test/Makefile.in +++ b/qse/samples/Makefile.in @@ -31,7 +31,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -subdir = test +subdir = samples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.m4 \ @@ -208,9 +208,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/Makefile + $(AUTOMAKE) --foreign samples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/qse/test/awk/Makefile.am b/qse/samples/awk/Makefile.am similarity index 100% rename from qse/test/awk/Makefile.am rename to qse/samples/awk/Makefile.am diff --git a/qse/test/awk/Makefile.in b/qse/samples/awk/Makefile.in similarity index 99% rename from qse/test/awk/Makefile.in rename to qse/samples/awk/Makefile.in index d6f317ad..4307cfc2 100644 --- a/qse/test/awk/Makefile.in +++ b/qse/samples/awk/Makefile.in @@ -35,7 +35,7 @@ host_triplet = @host@ bin_PROGRAMS = awk01$(EXEEXT) awk02$(EXEEXT) awk03$(EXEEXT) \ awk04$(EXEEXT) $(am__EXEEXT_1) @ENABLE_CXX_TRUE@am__append_1 = awk05 -subdir = test/awk +subdir = samples/awk DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.m4 \ @@ -259,9 +259,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/awk/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/awk/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/awk/Makefile + $(AUTOMAKE) --foreign samples/awk/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/qse/test/awk/awk01.c b/qse/samples/awk/awk01.c similarity index 100% rename from qse/test/awk/awk01.c rename to qse/samples/awk/awk01.c diff --git a/qse/test/awk/awk02.c b/qse/samples/awk/awk02.c similarity index 100% rename from qse/test/awk/awk02.c rename to qse/samples/awk/awk02.c diff --git a/qse/test/awk/awk03.c b/qse/samples/awk/awk03.c similarity index 100% rename from qse/test/awk/awk03.c rename to qse/samples/awk/awk03.c diff --git a/qse/test/awk/awk04.c b/qse/samples/awk/awk04.c similarity index 100% rename from qse/test/awk/awk04.c rename to qse/samples/awk/awk04.c diff --git a/qse/test/awk/awk05.cpp b/qse/samples/awk/awk05.cpp similarity index 100% rename from qse/test/awk/awk05.cpp rename to qse/samples/awk/awk05.cpp diff --git a/qse/test/cmn/Makefile.am b/qse/samples/cmn/Makefile.am similarity index 100% rename from qse/test/cmn/Makefile.am rename to qse/samples/cmn/Makefile.am diff --git a/qse/test/cmn/Makefile.in b/qse/samples/cmn/Makefile.in similarity index 99% rename from qse/test/cmn/Makefile.in rename to qse/samples/cmn/Makefile.in index 08ea7f89..5df5ddad 100644 --- a/qse/test/cmn/Makefile.in +++ b/qse/samples/cmn/Makefile.in @@ -35,7 +35,7 @@ host_triplet = @host@ bin_PROGRAMS = chr$(EXEEXT) str$(EXEEXT) sll$(EXEEXT) map$(EXEEXT) \ lda$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) sio$(EXEEXT) \ time$(EXEEXT) -subdir = test/cmn +subdir = samples/cmn DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.m4 \ @@ -268,9 +268,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/cmn/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/cmn/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/cmn/Makefile + $(AUTOMAKE) --foreign samples/cmn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/qse/test/cmn/chr.c b/qse/samples/cmn/chr.c similarity index 100% rename from qse/test/cmn/chr.c rename to qse/samples/cmn/chr.c diff --git a/qse/test/cmn/fio.c b/qse/samples/cmn/fio.c similarity index 100% rename from qse/test/cmn/fio.c rename to qse/samples/cmn/fio.c diff --git a/qse/test/cmn/lda.c b/qse/samples/cmn/lda.c similarity index 100% rename from qse/test/cmn/lda.c rename to qse/samples/cmn/lda.c diff --git a/qse/test/cmn/map.c b/qse/samples/cmn/map.c similarity index 100% rename from qse/test/cmn/map.c rename to qse/samples/cmn/map.c diff --git a/qse/test/cmn/pio.c b/qse/samples/cmn/pio.c similarity index 100% rename from qse/test/cmn/pio.c rename to qse/samples/cmn/pio.c diff --git a/qse/test/cmn/sio.c b/qse/samples/cmn/sio.c similarity index 100% rename from qse/test/cmn/sio.c rename to qse/samples/cmn/sio.c diff --git a/qse/test/cmn/sll.c b/qse/samples/cmn/sll.c similarity index 100% rename from qse/test/cmn/sll.c rename to qse/samples/cmn/sll.c diff --git a/qse/test/cmn/str.c b/qse/samples/cmn/str.c similarity index 100% rename from qse/test/cmn/str.c rename to qse/samples/cmn/str.c diff --git a/qse/test/cmn/time.c b/qse/samples/cmn/time.c similarity index 100% rename from qse/test/cmn/time.c rename to qse/samples/cmn/time.c diff --git a/qse/test/sed/Makefile.am b/qse/samples/sed/Makefile.am similarity index 100% rename from qse/test/sed/Makefile.am rename to qse/samples/sed/Makefile.am diff --git a/qse/test/sed/Makefile.in b/qse/samples/sed/Makefile.in similarity index 99% rename from qse/test/sed/Makefile.in rename to qse/samples/sed/Makefile.in index 50d5bca4..0c60c1ae 100644 --- a/qse/test/sed/Makefile.in +++ b/qse/samples/sed/Makefile.in @@ -34,7 +34,7 @@ build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = sed01$(EXEEXT) $(am__EXEEXT_1) @ENABLE_CXX_TRUE@am__append_1 = sed02 sed03 -subdir = test/sed +subdir = samples/sed DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.m4 \ @@ -248,9 +248,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/sed/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/sed/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/sed/Makefile + $(AUTOMAKE) --foreign samples/sed/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/qse/test/sed/sed01.c b/qse/samples/sed/sed01.c similarity index 100% rename from qse/test/sed/sed01.c rename to qse/samples/sed/sed01.c diff --git a/qse/test/sed/sed02.cpp b/qse/samples/sed/sed02.cpp similarity index 100% rename from qse/test/sed/sed02.cpp rename to qse/samples/sed/sed02.cpp diff --git a/qse/test/sed/sed03.cpp b/qse/samples/sed/sed03.cpp similarity index 100% rename from qse/test/sed/sed03.cpp rename to qse/samples/sed/sed03.cpp diff --git a/qse/test/utl/Makefile.am b/qse/samples/utl/Makefile.am similarity index 100% rename from qse/test/utl/Makefile.am rename to qse/samples/utl/Makefile.am diff --git a/qse/test/utl/Makefile.in b/qse/samples/utl/Makefile.in similarity index 98% rename from qse/test/utl/Makefile.in rename to qse/samples/utl/Makefile.in index 993bdfb0..62feca1b 100644 --- a/qse/test/utl/Makefile.in +++ b/qse/samples/utl/Makefile.in @@ -33,7 +33,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = -subdir = test/utl +subdir = samples/utl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.m4 \ @@ -202,9 +202,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/utl/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/utl/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign test/utl/Makefile + $(AUTOMAKE) --foreign samples/utl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \