improved the standard console handler to handle when ARGV has been overridden in a script
This commit is contained in:
parent
4b139e0472
commit
393dd9be8d
@ -4,7 +4,7 @@ AUTOMAKE_OPTION = foreign
|
|||||||
# EXTRA_DIST =
|
# EXTRA_DIST =
|
||||||
|
|
||||||
SUBDIRS = lib cmd
|
SUBDIRS = lib cmd
|
||||||
DIST_SUBDIRS = $(SUBDIRS) include test doc
|
DIST_SUBDIRS = $(SUBDIRS) include regress samples doc
|
||||||
|
|
||||||
install-data-hook:
|
install-data-hook:
|
||||||
cd include && $(MAKE) install
|
cd include && $(MAKE) install
|
||||||
|
@ -213,7 +213,7 @@ ACLOCAL_AMFLAGS = -I ac/m4
|
|||||||
AUTOMAKE_OPTION = foreign
|
AUTOMAKE_OPTION = foreign
|
||||||
# EXTRA_DIST =
|
# EXTRA_DIST =
|
||||||
SUBDIRS = lib cmd
|
SUBDIRS = lib cmd
|
||||||
DIST_SUBDIRS = $(SUBDIRS) include test doc
|
DIST_SUBDIRS = $(SUBDIRS) include regress samples doc
|
||||||
all: all-recursive
|
all: all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -39,11 +39,6 @@ run_init()
|
|||||||
run_script_for_init_main "$script"
|
run_script_for_init_main "$script"
|
||||||
done
|
done
|
||||||
|
|
||||||
for script in emp-???.awk
|
|
||||||
do
|
|
||||||
run_script_for_init "$script" "emp-en.data"
|
|
||||||
done
|
|
||||||
|
|
||||||
for script in cou-???.awk
|
for script in cou-???.awk
|
||||||
do
|
do
|
||||||
run_script_for_init "$script" "cou-en.data"
|
run_script_for_init "$script" "cou-en.data"
|
||||||
@ -153,20 +148,6 @@ run_test()
|
|||||||
}
|
}
|
||||||
done
|
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
|
for script in cou-???.awk
|
||||||
do
|
do
|
||||||
run_script_for_test "$script" "cou-en.data"
|
run_script_for_test "$script" "cou-en.data"
|
||||||
|
12
qse/configure
vendored
12
qse/configure
vendored
@ -25648,7 +25648,7 @@ QSE_SIZEOF_DOUBLE=$ac_cv_sizeof_double
|
|||||||
QSE_SIZEOF_LONG_DOUBLE=$ac_cv_sizeof_long_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
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# 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/utl/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/utl/Makefile" ;;
|
||||||
"cmd/awk/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/awk/Makefile" ;;
|
"cmd/awk/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/awk/Makefile" ;;
|
||||||
"cmd/lsp/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/lsp/Makefile" ;;
|
"cmd/lsp/Makefile") CONFIG_FILES="$CONFIG_FILES cmd/lsp/Makefile" ;;
|
||||||
"test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
|
"samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;;
|
||||||
"test/cmn/Makefile") CONFIG_FILES="$CONFIG_FILES test/cmn/Makefile" ;;
|
"samples/cmn/Makefile") CONFIG_FILES="$CONFIG_FILES samples/cmn/Makefile" ;;
|
||||||
"test/utl/Makefile") CONFIG_FILES="$CONFIG_FILES test/utl/Makefile" ;;
|
"samples/utl/Makefile") CONFIG_FILES="$CONFIG_FILES samples/utl/Makefile" ;;
|
||||||
"test/sed/Makefile") CONFIG_FILES="$CONFIG_FILES test/sed/Makefile" ;;
|
"samples/sed/Makefile") CONFIG_FILES="$CONFIG_FILES samples/sed/Makefile" ;;
|
||||||
"test/awk/Makefile") CONFIG_FILES="$CONFIG_FILES test/awk/Makefile" ;;
|
"samples/awk/Makefile") CONFIG_FILES="$CONFIG_FILES samples/awk/Makefile" ;;
|
||||||
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
|
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
|
||||||
"doc/page/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page/Makefile" ;;
|
"doc/page/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page/Makefile" ;;
|
||||||
"doc/page.ko/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page.ko/Makefile" ;;
|
"doc/page.ko/Makefile") CONFIG_FILES="$CONFIG_FILES doc/page.ko/Makefile" ;;
|
||||||
|
@ -261,11 +261,11 @@ AC_CONFIG_FILES([
|
|||||||
cmd/utl/Makefile
|
cmd/utl/Makefile
|
||||||
cmd/awk/Makefile
|
cmd/awk/Makefile
|
||||||
cmd/lsp/Makefile
|
cmd/lsp/Makefile
|
||||||
test/Makefile
|
samples/Makefile
|
||||||
test/cmn/Makefile
|
samples/cmn/Makefile
|
||||||
test/utl/Makefile
|
samples/utl/Makefile
|
||||||
test/sed/Makefile
|
samples/sed/Makefile
|
||||||
test/awk/Makefile
|
samples/awk/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/page/Makefile
|
doc/page/Makefile
|
||||||
doc/page.ko/Makefile
|
doc/page.ko/Makefile
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -418,8 +418,7 @@ enum qse_awk_option_t
|
|||||||
* implementations
|
* implementations
|
||||||
*/
|
*/
|
||||||
QSE_AWK_CLASSIC = QSE_AWK_IMPLICIT | QSE_AWK_RIO |
|
QSE_AWK_CLASSIC = QSE_AWK_IMPLICIT | QSE_AWK_RIO |
|
||||||
QSE_AWK_NEWLINE | QSE_AWK_PABLOCK |
|
QSE_AWK_NEWLINE | QSE_AWK_PABLOCK
|
||||||
QSE_AWK_STRIPSPACES
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1097,6 +1096,7 @@ qse_real_t qse_awk_strxtoreal (
|
|||||||
);
|
);
|
||||||
|
|
||||||
qse_size_t qse_awk_longtostr (
|
qse_size_t qse_awk_longtostr (
|
||||||
|
qse_awk_t* awk,
|
||||||
qse_long_t value,
|
qse_long_t value,
|
||||||
int radix,
|
int radix,
|
||||||
const qse_char_t* prefix,
|
const qse_char_t* prefix,
|
||||||
@ -1257,23 +1257,19 @@ qse_awk_val_t* qse_awk_rtx_getarg (
|
|||||||
);
|
);
|
||||||
/******/
|
/******/
|
||||||
|
|
||||||
/****f* AWK/qse_awk_rtx_getgbl
|
/**
|
||||||
* NAME
|
* The qse_awk_rtx_getgbl() gets the value of a global variable.
|
||||||
* qse_awk_rtx_getgbl - gets the value of a global variable
|
* The global variable ID @a id is one of the predefined global
|
||||||
* INPUTS
|
* variable IDs or a value returned by qse_awk_addgbl().
|
||||||
* * rtx - a runtime context
|
* This function never fails so long as the ID is valid. Otherwise,
|
||||||
* * id - a global variable ID. It is one of the predefined global
|
* you may get into trouble.
|
||||||
* variable IDs or a value returned by qse_awk_addgbl().
|
*
|
||||||
* RETURN
|
* @return a value pointer
|
||||||
* 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
|
|
||||||
*/
|
*/
|
||||||
qse_awk_val_t* qse_awk_rtx_getgbl (
|
qse_awk_val_t* qse_awk_rtx_getgbl (
|
||||||
qse_awk_rtx_t* rtx,
|
qse_awk_rtx_t* rtx, /**< a runtime context */
|
||||||
int id
|
int id /**< a global variable ID */
|
||||||
);
|
);
|
||||||
/******/
|
|
||||||
|
|
||||||
/****f* AWK/qse_awk_rtx_setgbl
|
/****f* AWK/qse_awk_rtx_setgbl
|
||||||
* NAME
|
* NAME
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -34,6 +34,7 @@
|
|||||||
* - StdAwk ARGV and console name handling
|
* - StdAwk ARGV and console name handling
|
||||||
* - add RQ and LQ for more powerful record splitting
|
* - add RQ and LQ for more powerful record splitting
|
||||||
* - improve performance in qse_awk_rtx_readio() if RS is logner than 2 chars.
|
* - improve performance in qse_awk_rtx_readio() if RS is logner than 2 chars.
|
||||||
|
* - change the message for EIONMNL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.
|
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("no such io name found"),
|
||||||
QSE_T("i/o handler returned an error"),
|
QSE_T("i/o handler returned an error"),
|
||||||
QSE_T("i/o name empty"),
|
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("not sufficient arguments to formatting sequence"),
|
||||||
QSE_T("recursion detected in format conversion"),
|
QSE_T("recursion detected in format conversion"),
|
||||||
QSE_T("invalid character in CONVFMT"),
|
QSE_T("invalid character in CONVFMT"),
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -787,7 +787,7 @@ static int fnc_split (
|
|||||||
|
|
||||||
/* put it into the map */
|
/* put it into the map */
|
||||||
key_len = qse_awk_longtostr (
|
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);
|
QSE_ASSERT (key_len != (qse_size_t)-1);
|
||||||
|
|
||||||
/* don't forget to update the reference count when you
|
/* don't forget to update the reference count when you
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -533,8 +533,8 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
qse_size_t qse_awk_longtostr (
|
qse_size_t qse_awk_longtostr (
|
||||||
qse_long_t value, int radix, const qse_char_t* prefix,
|
qse_awk_t* awk, qse_long_t value,
|
||||||
qse_char_t* buf, qse_size_t size)
|
int radix, const qse_char_t* prefix, qse_char_t* buf, qse_size_t size)
|
||||||
{
|
{
|
||||||
qse_long_t t, rem;
|
qse_long_t t, rem;
|
||||||
qse_size_t len, ret, i;
|
qse_size_t len, ret, i;
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -5697,7 +5697,8 @@ static int deparse (qse_awk_t* awk)
|
|||||||
}
|
}
|
||||||
else
|
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));
|
10, QSE_T("__g"), tmp, QSE_COUNTOF(tmp));
|
||||||
QSE_ASSERT (len != (qse_size_t)-1);
|
QSE_ASSERT (len != (qse_size_t)-1);
|
||||||
if (qse_awk_putsrcstrx (awk, tmp, len) == -1)
|
if (qse_awk_putsrcstrx (awk, tmp, len) == -1)
|
||||||
@ -5722,7 +5723,8 @@ static int deparse (qse_awk_t* awk)
|
|||||||
}
|
}
|
||||||
else
|
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));
|
10, QSE_T("__g"), tmp, QSE_COUNTOF(tmp));
|
||||||
QSE_ASSERT (len != (qse_size_t)-1);
|
QSE_ASSERT (len != (qse_size_t)-1);
|
||||||
if (qse_awk_putsrcstrx (awk, tmp, len) == -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;
|
struct deparse_func_t* df = (struct deparse_func_t*)arg;
|
||||||
/* CHECK: */
|
/* 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; )
|
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_T("__p"), df->tmp, df->tmp_len);
|
||||||
QSE_ASSERT (n != (qse_size_t)-1);
|
QSE_ASSERT (n != (qse_size_t)-1);
|
||||||
PUT_SX (df, df->tmp, n);
|
PUT_SX (df, df->tmp, n);
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -1004,7 +1004,8 @@ static int build_runarg (
|
|||||||
}
|
}
|
||||||
|
|
||||||
key_len = qse_awk_longtostr (
|
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);
|
QSE_ASSERT (key_len != (qse_size_t)-1);
|
||||||
|
|
||||||
/* increment reference count of v_tmp in advance as if
|
/* 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'))
|
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 */
|
/* if so, it skips writing */
|
||||||
QSE_AWK_FREE (run->awk, out);
|
QSE_AWK_FREE (run->awk, out);
|
||||||
qse_awk_rtx_seterror (
|
|
||||||
run, QSE_AWK_EIONMNL, nde->line, QSE_NULL);
|
|
||||||
return -1;
|
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'))
|
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
|
/* the output destination name contains a null
|
||||||
* character. */
|
* character. */
|
||||||
QSE_AWK_FREE (run->awk, out);
|
QSE_AWK_FREE (run->awk, out);
|
||||||
qse_awk_rtx_seterror (
|
|
||||||
run, QSE_AWK_EIONMNL, nde->line, QSE_NULL);
|
|
||||||
return -1;
|
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'))
|
if (in[--len] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
/* the input source name contains a null
|
/* 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);
|
QSE_AWK_FREE (run->awk, in);
|
||||||
n = -1;
|
n = -1;
|
||||||
goto skip_read;
|
goto skip_read;
|
||||||
|
@ -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.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -78,6 +78,7 @@ typedef struct rxtn_t
|
|||||||
struct {
|
struct {
|
||||||
const qse_char_t*const* files;
|
const qse_char_t*const* files;
|
||||||
qse_size_t index;
|
qse_size_t index;
|
||||||
|
qse_size_t count;
|
||||||
} in;
|
} in;
|
||||||
|
|
||||||
struct
|
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 */
|
* any fields of riod when the open operation fails */
|
||||||
qse_sio_t* sio;
|
qse_sio_t* sio;
|
||||||
const qse_char_t* file;
|
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];
|
file = rxtn->c.in.files[rxtn->c.in.index];
|
||||||
|
|
||||||
if (file == QSE_NULL)
|
if (file == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* no more input file */
|
/* 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;
|
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'))
|
if (file[0] == QSE_T('-') && file[1] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
/* special file name '-' */
|
/* 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 (
|
qse_awk_rtx_seterror (
|
||||||
rtx, QSE_AWK_EOPEN, 0, &errarg);
|
rtx, QSE_AWK_EOPEN, 0, &errarg);
|
||||||
|
|
||||||
|
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
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)
|
rtx, file, qse_strlen(file)) == -1)
|
||||||
{
|
{
|
||||||
if (sio != qse_sio_in) qse_sio_close (sio);
|
if (sio != qse_sio_in) qse_sio_close (sio);
|
||||||
|
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qse_awk_rtx_free (rtx, out.u.cpldup.ptr);
|
||||||
riod->handle = sio;
|
riod->handle = sio;
|
||||||
|
|
||||||
|
/* increment the counter of files successfully opened */
|
||||||
|
rxtn->c.in.count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
rxtn->c.in.index++;
|
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 (
|
if (qse_awk_rtx_setofilename (
|
||||||
rtx, file, qse_strlen(file)) == -1)
|
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.files = icf;
|
||||||
rxtn->c.in.index = 0;
|
rxtn->c.in.index = 0;
|
||||||
|
rxtn->c.in.count = 0;
|
||||||
rxtn->c.out.files = ocf;
|
rxtn->c.out.files = ocf;
|
||||||
rxtn->c.out.index = 0;
|
rxtn->c.out.index = 0;
|
||||||
|
|
||||||
|
@ -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.
|
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);
|
QSE_ASSERT (px->id.idxa != (qse_size_t)-1);
|
||||||
|
|
||||||
n = qse_awk_longtostr (
|
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_SRCSTR (awk, QSE_T("__p"));
|
||||||
PUT_SRCSTRX (awk, tmp, n);
|
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"));
|
PUT_SRCSTR (awk, QSE_T("__p"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
|
awk,
|
||||||
px->id.idxa, 10, QSE_NULL,
|
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_SRCSTRX (awk, awk->tmp.fmt, n);
|
||||||
PUT_SRCSTR (awk, QSE_T("["));
|
PUT_SRCSTR (awk, QSE_T("["));
|
||||||
PRINT_EXPRESSION_LIST (awk, px->idx);
|
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"));
|
PUT_SRCSTR (awk, QSE_T("__g"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
px->id.idxa, 10,
|
awk,
|
||||||
QSE_NULL, tmp, QSE_COUNTOF(tmp));
|
px->id.idxa,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
tmp, QSE_COUNTOF(tmp)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, tmp, n);
|
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"));
|
PUT_SRCSTR (awk, QSE_T("__g"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
px->id.idxa, 10,
|
awk,
|
||||||
QSE_NULL, tmp, QSE_COUNTOF(tmp));
|
px->id.idxa,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
tmp, QSE_COUNTOF(tmp)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, tmp, n);
|
PUT_SRCSTRX (awk, tmp, n);
|
||||||
}
|
}
|
||||||
PUT_SRCSTR (awk, QSE_T("["));
|
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"));
|
PUT_SRCSTR (awk, QSE_T("__l"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
px->id.idxa, 10, QSE_NULL,
|
awk,
|
||||||
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt));
|
px->id.idxa,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
awk->tmp.fmt,
|
||||||
|
QSE_COUNTOF(awk->tmp.fmt)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -481,8 +499,13 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde)
|
|||||||
{
|
{
|
||||||
PUT_SRCSTR (awk, QSE_T("__l"));
|
PUT_SRCSTR (awk, QSE_T("__l"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
px->id.idxa, 10, QSE_NULL,
|
awk,
|
||||||
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt));
|
px->id.idxa,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
awk->tmp.fmt,
|
||||||
|
QSE_COUNTOF(awk->tmp.fmt)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
||||||
PUT_SRCSTR (awk, QSE_T("["));
|
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"));
|
PUT_SRCSTR (awk, QSE_T("__l"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
i, 10, QSE_NULL,
|
awk,
|
||||||
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt));
|
i,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
awk->tmp.fmt,
|
||||||
|
QSE_COUNTOF(awk->tmp.fmt)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
||||||
PUT_SRCSTR (awk, QSE_T(", "));
|
PUT_SRCSTR (awk, QSE_T(", "));
|
||||||
}
|
}
|
||||||
|
|
||||||
PUT_SRCSTR (awk, QSE_T("__l"));
|
PUT_SRCSTR (awk, QSE_T("__l"));
|
||||||
n = qse_awk_longtostr (
|
n = qse_awk_longtostr (
|
||||||
i, 10, QSE_NULL,
|
awk,
|
||||||
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt));
|
i,
|
||||||
|
10,
|
||||||
|
QSE_NULL,
|
||||||
|
awk->tmp.fmt,
|
||||||
|
QSE_COUNTOF(awk->tmp.fmt)
|
||||||
|
);
|
||||||
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
|
||||||
PUT_SRCSTR (awk, QSE_T(";"));
|
PUT_SRCSTR (awk, QSE_T(";"));
|
||||||
PUT_NEWLINE (awk);
|
PUT_NEWLINE (awk);
|
||||||
|
14
qse/regress/awk/adm.d1
Normal file
14
qse/regress/awk/adm.d1
Normal file
@ -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
|
51
qse/regress/awk/asm.awk
Normal file
51
qse/regress/awk/asm.awk
Normal file
@ -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 <srcfile > 0) {
|
||||||
|
sub (/#.*/, "");
|
||||||
|
symtab[$1] = nextmem;
|
||||||
|
|
||||||
|
if ($2 != "") {
|
||||||
|
print $2 "\t" $3 >tempfile;
|
||||||
|
nextmem++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (tempfile);
|
||||||
|
|
||||||
|
# PASS 2
|
||||||
|
nextmem = 0;
|
||||||
|
while (getline <tempfile > 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
14
qse/regress/awk/asm.d1
Normal file
14
qse/regress/awk/asm.d1
Normal file
@ -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
|
11
qse/regress/awk/asm.d2
Normal file
11
qse/regress/awk/asm.d2
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
10
|
||||||
|
20
|
||||||
|
30
|
||||||
|
40
|
||||||
|
50
|
||||||
|
60
|
||||||
|
70
|
||||||
|
80
|
||||||
|
90
|
||||||
|
100
|
||||||
|
-1
|
6
qse/regress/awk/emp.d
Normal file
6
qse/regress/awk/emp.d
Normal file
@ -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
|
40
qse/regress/awk/hanoi.awk
Normal file
40
qse/regress/awk/hanoi.awk
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
BEGIN {
|
||||||
|
n = arg("-n",5)
|
||||||
|
for (j=0; j<n; j++) push(0,n-j)
|
||||||
|
showstacks()
|
||||||
|
hanoi(n,0,1,2)
|
||||||
|
}
|
||||||
|
|
||||||
|
function hanoi(n,a,b,c) {
|
||||||
|
if (n==1) {
|
||||||
|
move(a,b)
|
||||||
|
} else {
|
||||||
|
hanoi(n-1,a,c,b)
|
||||||
|
move(a,b)
|
||||||
|
hanoi(n-1,c,b,a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function move(i,j) {
|
||||||
|
push(j,pop(i))
|
||||||
|
showstacks()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function showstacks( i,j) {
|
||||||
|
for (i=0; i<=2; i++) {
|
||||||
|
printf "%s ", i
|
||||||
|
for (j=0; j<sp[i]; j++) printf "%s", stack[i,j]
|
||||||
|
print "" }
|
||||||
|
print ""
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function arg(tag,default) {
|
||||||
|
for(i in ARGV)
|
||||||
|
if (ARGV[i] ~ tag)
|
||||||
|
return ARGV[i+1]
|
||||||
|
return default
|
||||||
|
}
|
||||||
|
function push(i,v) { stack[i,sp[i]++]=v }
|
||||||
|
function pop(i) { return stack[i,--sp[i]] }
|
||||||
|
|
56
qse/regress/awk/quicksort.awk
Normal file
56
qse/regress/awk/quicksort.awk
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#.H1 Quicksort.awk
|
||||||
|
#.H2 Synopsis
|
||||||
|
#.P cat numbers | gawk -f quicksort.awk
|
||||||
|
#.H2 Download
|
||||||
|
#.P
|
||||||
|
#Download from
|
||||||
|
#.URL http://lawker.googlecode.com/svn/fridge/lib/awk/quicksort1.awk LAWKER.
|
||||||
|
#.H2 Description
|
||||||
|
#.P
|
||||||
|
#Some Awk implementations come with built in sort routines (e.g. Gawk's asort and asorti functions). But it
|
||||||
|
#can be useful to code these yourself, especially in you are doing data structure tricks.
|
||||||
|
#.P
|
||||||
|
#Quicksort selects a pivot and divides the data into values above and below the pivot. Sorting then
|
||||||
|
#recurses on these sub-lists.
|
||||||
|
#.H2 Code
|
||||||
|
#.H3 Loading the data
|
||||||
|
#.PRE
|
||||||
|
#BEGIN { RS = ""; FS = "\n" }
|
||||||
|
{ A[NR] = $1 }
|
||||||
|
END {
|
||||||
|
qsort(A, 1, NR)
|
||||||
|
for (i = 1; i <= NR; i++) {
|
||||||
|
print A[i] #+ 0;
|
||||||
|
#if (i == NR) break
|
||||||
|
#print ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#./PRE
|
||||||
|
#.H3 Sorting the data
|
||||||
|
#.PRE
|
||||||
|
function qsort(A, left, right, i, last) {
|
||||||
|
if (left >= 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.
|
16
qse/regress/awk/quicksort.d
Normal file
16
qse/regress/awk/quicksort.d
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
34
|
||||||
|
0.11111111111111111111111111111
|
||||||
|
0.0000000000
|
||||||
|
0b11111
|
||||||
|
0xA
|
||||||
|
1
|
||||||
|
35
|
||||||
|
92
|
||||||
|
19123
|
||||||
|
29
|
||||||
|
1.E12
|
||||||
|
11.2839091
|
||||||
|
12
|
||||||
|
99X
|
||||||
|
301
|
||||||
|
493
|
17
qse/regress/awk/quicksort2.awk
Normal file
17
qse/regress/awk/quicksort2.awk
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
|
16
qse/regress/awk/quicksort2.d
Normal file
16
qse/regress/awk/quicksort2.d
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
34
|
||||||
|
0.11111111111111111111111111111
|
||||||
|
0.0000000000
|
||||||
|
0b11111
|
||||||
|
0xA
|
||||||
|
1
|
||||||
|
35
|
||||||
|
92
|
||||||
|
19123
|
||||||
|
29
|
||||||
|
1.E12
|
||||||
|
11.2839091
|
||||||
|
12
|
||||||
|
99X
|
||||||
|
301
|
||||||
|
493
|
85
qse/regress/awk/regress.sh
Executable file
85
qse/regress/awk/regress.sh
Executable file
@ -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
|
11
qse/regress/awk/stripcomment.awk
Normal file
11
qse/regress/awk/stripcomment.awk
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
BEGIN {
|
||||||
|
RS = "/\\*([^*]|\\*+[^/*])*\\*+/"
|
||||||
|
# comment is record separator
|
||||||
|
ORS = " "
|
||||||
|
getline hold
|
||||||
|
}
|
||||||
|
|
||||||
|
{ print hold ; hold = $0 }
|
||||||
|
|
||||||
|
END { printf "%s" , hold }
|
||||||
|
|
10
qse/regress/awk/stripcomment.d
Normal file
10
qse/regress/awk/stripcomment.d
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/* sample C program */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
/* print hello world
|
||||||
|
* with printf */
|
||||||
|
printf ("hello, world\n");
|
||||||
|
return 0;
|
||||||
|
}
|
20
qse/regress/awk/wordfreq.awk
Normal file
20
qse/regress/awk/wordfreq.awk
Normal file
@ -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];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -31,7 +31,7 @@ PRE_UNINSTALL = :
|
|||||||
POST_UNINSTALL = :
|
POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
subdir = test
|
subdir = samples
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.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;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \
|
||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --foreign test/Makefile
|
$(AUTOMAKE) --foreign samples/Makefile
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
@ -35,7 +35,7 @@ host_triplet = @host@
|
|||||||
bin_PROGRAMS = awk01$(EXEEXT) awk02$(EXEEXT) awk03$(EXEEXT) \
|
bin_PROGRAMS = awk01$(EXEEXT) awk02$(EXEEXT) awk03$(EXEEXT) \
|
||||||
awk04$(EXEEXT) $(am__EXEEXT_1)
|
awk04$(EXEEXT) $(am__EXEEXT_1)
|
||||||
@ENABLE_CXX_TRUE@am__append_1 = awk05
|
@ENABLE_CXX_TRUE@am__append_1 = awk05
|
||||||
subdir = test/awk
|
subdir = samples/awk
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.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;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/awk/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/awk/Makefile'; \
|
||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --foreign test/awk/Makefile
|
$(AUTOMAKE) --foreign samples/awk/Makefile
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
@ -35,7 +35,7 @@ host_triplet = @host@
|
|||||||
bin_PROGRAMS = chr$(EXEEXT) str$(EXEEXT) sll$(EXEEXT) map$(EXEEXT) \
|
bin_PROGRAMS = chr$(EXEEXT) str$(EXEEXT) sll$(EXEEXT) map$(EXEEXT) \
|
||||||
lda$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) sio$(EXEEXT) \
|
lda$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) sio$(EXEEXT) \
|
||||||
time$(EXEEXT)
|
time$(EXEEXT)
|
||||||
subdir = test/cmn
|
subdir = samples/cmn
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.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;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/cmn/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/cmn/Makefile'; \
|
||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --foreign test/cmn/Makefile
|
$(AUTOMAKE) --foreign samples/cmn/Makefile
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
@ -34,7 +34,7 @@ build_triplet = @build@
|
|||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
bin_PROGRAMS = sed01$(EXEEXT) $(am__EXEEXT_1)
|
bin_PROGRAMS = sed01$(EXEEXT) $(am__EXEEXT_1)
|
||||||
@ENABLE_CXX_TRUE@am__append_1 = sed02 sed03
|
@ENABLE_CXX_TRUE@am__append_1 = sed02 sed03
|
||||||
subdir = test/sed
|
subdir = samples/sed
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.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;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/sed/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/sed/Makefile'; \
|
||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --foreign test/sed/Makefile
|
$(AUTOMAKE) --foreign samples/sed/Makefile
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
@ -33,7 +33,7 @@ POST_UNINSTALL = :
|
|||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
bin_PROGRAMS =
|
bin_PROGRAMS =
|
||||||
subdir = test/utl
|
subdir = samples/utl
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/ac/m4/libtool.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;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/utl/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/utl/Makefile'; \
|
||||||
cd $(top_srcdir) && \
|
cd $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --foreign test/utl/Makefile
|
$(AUTOMAKE) --foreign samples/utl/Makefile
|
||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
Loading…
x
Reference in New Issue
Block a user