interim commit

This commit is contained in:
hyung-hwan 2009-08-11 01:11:16 +00:00
parent 9eb2c2da4c
commit 876cd7bec9
6 changed files with 90 additions and 66 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp 250 2009-08-10 03:29:59Z hyunghwan.chung $ * $Id: Awk.hpp 251 2009-08-10 07:11:16Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -880,6 +880,16 @@ public:
*/ */
OPT_NCMPONSTR = QSE_AWK_NCMPONSTR, OPT_NCMPONSTR = QSE_AWK_NCMPONSTR,
/**
* Enables the strict naming rule.
* - a parameter name can not be the same as the owning
* function name.
* - a local variable name can not be the same as the
* owning function name.
*/
OPT_STRICTNAMING = QSE_AWK_STRICTNAMING,
/** Enables 'include' */ /** Enables 'include' */
OPT_INCLUDE = QSE_AWK_INCLUDE OPT_INCLUDE = QSE_AWK_INCLUDE
}; };

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h 250 2009-08-10 03:29:59Z hyunghwan.chung $ * $Id: awk.h 251 2009-08-10 07:11:16Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -600,8 +600,9 @@ enum qse_awk_option_t
/** /**
* enables the strict naming rule. * enables the strict naming rule.
* - a parameter can not be the same as the owning function name. * - a parameter name can not be the same as the owning function name.
* - a local variable can not be the same as the owning function name. * - a local variable name can not be the same as the owning
* function name.
*/ */
QSE_AWK_STRICTNAMING = (1 << 15), QSE_AWK_STRICTNAMING = (1 << 15),

View File

@ -1,5 +1,5 @@
/* /*
* $Id: StdAwk.cpp 250 2009-08-10 03:29:59Z hyunghwan.chung $ * $Id: StdAwk.cpp 251 2009-08-10 07:11:16Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
@ -778,7 +778,7 @@ int StdAwk::vsprintf (
int StdAwk::SourceFile::open (Data& io) int StdAwk::SourceFile::open (Data& io)
{ {
qse_sio_t* sio; qse_sio_t* sio;
const qse_char_t* ioname = io.getName(); const char_t* ioname = io.getName();
if (ioname == QSE_NULL) if (ioname == QSE_NULL)
{ {

View File

@ -11,15 +11,15 @@ awk03_SOURCES = awk03.c
awk04_SOURCES = awk04.c awk04_SOURCES = awk04.c
if ENABLE_CXX if ENABLE_CXX
bin_PROGRAMS += awk05 awk06 awk07 #awk08 bin_PROGRAMS += awk05 awk06 awk07 awk08
awk05_SOURCES = awk05.cpp awk05_SOURCES = awk05.cpp
awk06_SOURCES = awk06.cpp awk06_SOURCES = awk06.cpp
awk07_SOURCES = awk07.cpp awk07_SOURCES = awk07.cpp
#awk08_SOURCES = awk08.cpp awk08_SOURCES = awk08.cpp
awk05_LDADD = -lqseawk++ $(LDADD) awk05_LDADD = -lqseawk++ $(LDADD)
awk06_LDADD = -lqseawk++ $(LDADD) awk06_LDADD = -lqseawk++ $(LDADD)
awk07_LDADD = -lqseawk++ $(LDADD) awk07_LDADD = -lqseawk++ $(LDADD)
#awk08_LDADD = -lqseawk++ $(LDADD) awk08_LDADD = -lqseawk++ $(LDADD)
endif endif

View File

@ -34,7 +34,7 @@ build_triplet = @build@
host_triplet = @host@ 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 awk06 awk07 #awk08 @ENABLE_CXX_TRUE@am__append_1 = awk05 awk06 awk07 awk08
subdir = samples/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
@ -49,7 +49,7 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/include/qse/config.h CONFIG_HEADER = $(top_builddir)/include/qse/config.h
CONFIG_CLEAN_FILES = CONFIG_CLEAN_FILES =
@ENABLE_CXX_TRUE@am__EXEEXT_1 = awk05$(EXEEXT) awk06$(EXEEXT) \ @ENABLE_CXX_TRUE@am__EXEEXT_1 = awk05$(EXEEXT) awk06$(EXEEXT) \
@ENABLE_CXX_TRUE@ awk07$(EXEEXT) @ENABLE_CXX_TRUE@ awk07$(EXEEXT) awk08$(EXEEXT)
am__installdirs = "$(DESTDIR)$(bindir)" am__installdirs = "$(DESTDIR)$(bindir)"
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS) PROGRAMS = $(bin_PROGRAMS)
@ -83,6 +83,10 @@ am__awk07_SOURCES_DIST = awk07.cpp
@ENABLE_CXX_TRUE@am_awk07_OBJECTS = awk07.$(OBJEXT) @ENABLE_CXX_TRUE@am_awk07_OBJECTS = awk07.$(OBJEXT)
awk07_OBJECTS = $(am_awk07_OBJECTS) awk07_OBJECTS = $(am_awk07_OBJECTS)
@ENABLE_CXX_TRUE@awk07_DEPENDENCIES = $(am__DEPENDENCIES_2) @ENABLE_CXX_TRUE@awk07_DEPENDENCIES = $(am__DEPENDENCIES_2)
am__awk08_SOURCES_DIST = awk08.cpp
@ENABLE_CXX_TRUE@am_awk08_OBJECTS = awk08.$(OBJEXT)
awk08_OBJECTS = $(am_awk08_OBJECTS)
@ENABLE_CXX_TRUE@awk08_DEPENDENCIES = $(am__DEPENDENCIES_2)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include/qse DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include/qse
depcomp = $(SHELL) $(top_srcdir)/ac/au/depcomp depcomp = $(SHELL) $(top_srcdir)/ac/au/depcomp
am__depfiles_maybe = depfiles am__depfiles_maybe = depfiles
@ -106,10 +110,11 @@ CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
$(LDFLAGS) -o $@ $(LDFLAGS) -o $@
SOURCES = $(awk01_SOURCES) $(awk02_SOURCES) $(awk03_SOURCES) \ SOURCES = $(awk01_SOURCES) $(awk02_SOURCES) $(awk03_SOURCES) \
$(awk04_SOURCES) $(awk05_SOURCES) $(awk06_SOURCES) \ $(awk04_SOURCES) $(awk05_SOURCES) $(awk06_SOURCES) \
$(awk07_SOURCES) $(awk07_SOURCES) $(awk08_SOURCES)
DIST_SOURCES = $(awk01_SOURCES) $(awk02_SOURCES) $(awk03_SOURCES) \ DIST_SOURCES = $(awk01_SOURCES) $(awk02_SOURCES) $(awk03_SOURCES) \
$(awk04_SOURCES) $(am__awk05_SOURCES_DIST) \ $(awk04_SOURCES) $(am__awk05_SOURCES_DIST) \
$(am__awk06_SOURCES_DIST) $(am__awk07_SOURCES_DIST) $(am__awk06_SOURCES_DIST) $(am__awk07_SOURCES_DIST) \
$(am__awk08_SOURCES_DIST)
ETAGS = etags ETAGS = etags
CTAGS = ctags CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@ -258,10 +263,11 @@ awk04_SOURCES = awk04.c
@ENABLE_CXX_TRUE@awk05_SOURCES = awk05.cpp @ENABLE_CXX_TRUE@awk05_SOURCES = awk05.cpp
@ENABLE_CXX_TRUE@awk06_SOURCES = awk06.cpp @ENABLE_CXX_TRUE@awk06_SOURCES = awk06.cpp
@ENABLE_CXX_TRUE@awk07_SOURCES = awk07.cpp @ENABLE_CXX_TRUE@awk07_SOURCES = awk07.cpp
#awk08_SOURCES = awk08.cpp @ENABLE_CXX_TRUE@awk08_SOURCES = awk08.cpp
@ENABLE_CXX_TRUE@awk05_LDADD = -lqseawk++ $(LDADD) @ENABLE_CXX_TRUE@awk05_LDADD = -lqseawk++ $(LDADD)
@ENABLE_CXX_TRUE@awk06_LDADD = -lqseawk++ $(LDADD) @ENABLE_CXX_TRUE@awk06_LDADD = -lqseawk++ $(LDADD)
@ENABLE_CXX_TRUE@awk07_LDADD = -lqseawk++ $(LDADD) @ENABLE_CXX_TRUE@awk07_LDADD = -lqseawk++ $(LDADD)
@ENABLE_CXX_TRUE@awk08_LDADD = -lqseawk++ $(LDADD)
all: all-am all: all-am
.SUFFIXES: .SUFFIXES:
@ -344,6 +350,9 @@ awk06$(EXEEXT): $(awk06_OBJECTS) $(awk06_DEPENDENCIES)
awk07$(EXEEXT): $(awk07_OBJECTS) $(awk07_DEPENDENCIES) awk07$(EXEEXT): $(awk07_OBJECTS) $(awk07_DEPENDENCIES)
@rm -f awk07$(EXEEXT) @rm -f awk07$(EXEEXT)
$(CXXLINK) $(awk07_OBJECTS) $(awk07_LDADD) $(LIBS) $(CXXLINK) $(awk07_OBJECTS) $(awk07_LDADD) $(LIBS)
awk08$(EXEEXT): $(awk08_OBJECTS) $(awk08_DEPENDENCIES)
@rm -f awk08$(EXEEXT)
$(CXXLINK) $(awk08_OBJECTS) $(awk08_LDADD) $(LIBS)
mostlyclean-compile: mostlyclean-compile:
-rm -f *.$(OBJEXT) -rm -f *.$(OBJEXT)
@ -358,6 +367,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk05.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk05.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk06.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk06.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk07.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk07.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awk08.Po@am__quote@
.c.o: .c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@ -585,7 +595,6 @@ uninstall-am: uninstall-binPROGRAMS
pdf pdf-am ps ps-am tags uninstall uninstall-am \ pdf pdf-am ps ps-am tags uninstall uninstall-am \
uninstall-binPROGRAMS uninstall-binPROGRAMS
#awk08_LDADD = -lqseawk++ $(LDADD)
# Tell versions [3.59,3.63) of GNU make to not export all variables. # Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded. # Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT: .NOEXPORT:

View File

@ -115,7 +115,7 @@ public:
#endif #endif
} }
int sleep (Run& run, Return& ret, const Argument* args, size_t nargs, int sleep (Run& run, Value& ret, const Value* args, size_t nargs,
const char_t* name, size_t len) const char_t* name, size_t len)
{ {
if (args[0].isIndexed()) if (args[0].isIndexed())
@ -126,7 +126,7 @@ public:
long_t x = args[0].toInt(); long_t x = args[0].toInt();
/*Argument arg; /*Value arg;
if (run.getGlobal(idLastSleep, arg) == 0) if (run.getGlobal(idLastSleep, arg) == 0)
qse_printf (QSE_T("GOOD: [%d]\n"), (int)arg.toInt()); qse_printf (QSE_T("GOOD: [%d]\n"), (int)arg.toInt());
else { qse_printf (QSE_T("BAD:\n")); } else { qse_printf (QSE_T("BAD:\n")); }
@ -136,56 +136,54 @@ public:
#ifdef _WIN32 #ifdef _WIN32
::Sleep ((DWORD)(x * 1000)); ::Sleep ((DWORD)(x * 1000));
return ret.set ((long_t)0); return ret.setInt (0);
#else #else
return ret.set ((long_t)::sleep (x)); return ret.setInt (::sleep (x));
#endif #endif
} }
int sumintarray (Run& run, Return& ret, const Argument* args, size_t nargs, int sumintarray (Run& run, Value& ret, const Value* args, size_t nargs,
const char_t* name, size_t len) const char_t* name, size_t len)
{ {
long_t x = 0; long_t x = 0;
if (args[0].isIndexed()) if (args[0].isIndexed())
{ {
Argument idx(run), val(run); Value val(run);
Value::Index idx;
Value::IndexIterator ii;
int n = args[0].getFirstIndex (idx); ii = args[0].getFirstIndex (&idx);
while (n > 0) while (ii != ii.END)
{ {
size_t len; if (args[0].getIndexed(idx, &val) <= -1) return -1;
const char_t* ptr = idx.toStr(&len);
if (args[0].getIndexed(ptr, len, val) <= -1) return -1;
x += val.toInt (); x += val.toInt ();
n = args[0].getNextIndex (idx); ii = args[0].getNextIndex (&idx, ii);
} }
if (n != 0) return -1;
} }
else x += args[0].toInt(); else x += args[0].toInt();
return ret.set (x); return ret.setInt (x);
} }
int arrayindices (Run& run, Return& ret, const Argument* args, size_t nargs, int arrayindices (Run& run, Value& ret, const Value* args, size_t nargs,
const char_t* name, size_t len) const char_t* name, size_t len)
{ {
if (!args[0].isIndexed()) return 0; if (!args[0].isIndexed()) return 0;
Argument idx (run); Value::Index idx;
Value::IndexIterator ii;
long_t i; long_t i;
int n = args[0].getFirstIndex (idx); ii = args[0].getFirstIndex (&idx);
for (i = 0; n > 0; i++) for (i = 0; ii != ii.END ; i++)
{ {
size_t len; Value::IntIndex iidx (i);
const char_t* ptr = idx.toStr(&len); if (ret.setIndexedStr (
n = args[0].getNextIndex (idx); iidx, idx.ptr, idx.len) <= -1) return -1;
if (ret.setIndexed (i, ptr, len) <= -1) return -1; ii = args[0].getNextIndex (&idx, ii);
} }
if (n != 0) return -1;
return 0; return 0;
} }
@ -205,7 +203,7 @@ protected:
return true; return true;
} }
void onLoopExit (Run& run, const Argument& ret) void onLoopExit (Run& run, const Value& ret)
{ {
unset_intr_run (); unset_intr_run ();
@ -417,26 +415,32 @@ static void print_error (const qse_char_t* msg)
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), msg); qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), msg);
} }
static struct
struct opttab_t
{ {
const qse_char_t* name; const qse_char_t* name;
MyAwk::Option opt; int opt;
} otab[] = const qse_char_t* desc;
} opttab[] =
{ {
{ QSE_T("implicit"), MyAwk::OPT_IMPLICIT }, { QSE_T("implicit"), MyAwk::OPT_IMPLICIT, QSE_T("allow undeclared variables") },
{ QSE_T("explicit"), MyAwk::OPT_EXPLICIT }, { QSE_T("explicit"), MyAwk::OPT_EXPLICIT, QSE_T("allow declared variables(local,global)") },
{ QSE_T("bxor"), MyAwk::OPT_BXOR }, { QSE_T("extraops"), MyAwk::OPT_EXTRAOPS, QSE_T("enable extra operators(<<,>>,^^,//)") },
{ QSE_T("shift"), MyAwk::OPT_SHIFT }, { QSE_T("rio"), MyAwk::OPT_RIO, QSE_T("enable builtin I/O including getline & print") },
{ QSE_T("idiv"), MyAwk::OPT_IDIV }, { QSE_T("rwpipe"), MyAwk::OPT_RWPIPE, QSE_T("allow a dual-directional pipe") },
{ QSE_T("rio"), MyAwk::OPT_RIO }, { QSE_T("newline"), MyAwk::OPT_NEWLINE, QSE_T("enable a newline to terminate a statement") },
{ QSE_T("rwpipe"), MyAwk::OPT_RWPIPE }, { QSE_T("striprecspc"), MyAwk::OPT_STRIPRECSPC, QSE_T("strip spaces in splitting a record") },
{ QSE_T("newline"), MyAwk::OPT_NEWLINE }, { QSE_T("stripstrspc"), MyAwk::OPT_STRIPSTRSPC, QSE_T("strip spaces in converting a string to a number") },
{ QSE_T("stripspaces"), MyAwk::OPT_STRIPSPACES }, { QSE_T("nextofile"), MyAwk::OPT_NEXTOFILE, QSE_T("enable 'nextofile'") },
{ QSE_T("nextofile"), MyAwk::OPT_NEXTOFILE }, { QSE_T("reset"), MyAwk::OPT_RESET, QSE_T("enable 'reset'") },
{ QSE_T("crlf"), MyAwk::OPT_CRLF }, { QSE_T("crlf"), MyAwk::OPT_CRLF, QSE_T("use CRLF for a newline") },
{ QSE_T("reset"), MyAwk::OPT_RESET }, { QSE_T("maptovar"), MyAwk::OPT_MAPTOVAR, QSE_T("allow a map to be assigned or returned") },
{ QSE_T("maptovar"), MyAwk::OPT_MAPTOVAR }, { QSE_T("pablock"), MyAwk::OPT_PABLOCK, QSE_T("enable pattern-action loop") },
{ QSE_T("pablock"), MyAwk::OPT_PABLOCK } { QSE_T("rexbound"), MyAwk::OPT_REXBOUND, QSE_T("enable {n,m} in a regular expression") },
{ QSE_T("ncmponstr"), MyAwk::OPT_NCMPONSTR, QSE_T("perform numeric comparsion on numeric strings") },
{ QSE_T("strictnaming"), MyAwk::OPT_STRICTNAMING, QSE_T("enable the strict naming rule") },
{ QSE_T("include"), MyAwk::OPT_INCLUDE, QSE_T("enable 'include'") },
{ QSE_NULL, 0 }
}; };
static void print_usage (const qse_char_t* argv0) static void print_usage (const qse_char_t* argv0)
@ -462,9 +466,9 @@ static void print_usage (const qse_char_t* argv0)
qse_printf (QSE_T("\nYou may specify the following options to change the behavior of the interpreter.\n")); qse_printf (QSE_T("\nYou may specify the following options to change the behavior of the interpreter.\n"));
for (j = 0; j < (int)QSE_COUNTOF(otab); j++) for (j = 0; j < (int)QSE_COUNTOF(opttab); j++)
{ {
qse_printf (QSE_T(" -%-20s -no%-20s\n"), otab[j].name, otab[j].name); qse_printf (QSE_T(" -%-20s -no%-20s\n"), opttab[j].name, opttab[j].name);
} }
} }
@ -514,22 +518,22 @@ static int awk_main (int argc, qse_char_t* argv[])
if (argv[i][1] == QSE_T('n') && argv[i][2] == QSE_T('o')) if (argv[i][1] == QSE_T('n') && argv[i][2] == QSE_T('o'))
{ {
for (j = 0; j < (int)QSE_COUNTOF(otab); j++) for (j = 0; j < (int)QSE_COUNTOF(opttab); j++)
{ {
if (qse_strcmp(&argv[i][3], otab[j].name) == 0) if (qse_strcmp(&argv[i][3], opttab[j].name) == 0)
{ {
awk.setOption (awk.getOption() & ~otab[j].opt); awk.setOption (awk.getOption() & ~opttab[j].opt);
goto ok_valid; goto ok_valid;
} }
} }
} }
else else
{ {
for (j = 0; j < (int)QSE_COUNTOF(otab); j++) for (j = 0; j < (int)QSE_COUNTOF(opttab); j++)
{ {
if (qse_strcmp(&argv[i][1], otab[j].name) == 0) if (qse_strcmp(&argv[i][1], opttab[j].name) == 0)
{ {
awk.setOption (awk.getOption() | otab[j].opt); awk.setOption (awk.getOption() | opttab[j].opt);
goto ok_valid; goto ok_valid;
} }
} }
@ -646,7 +650,7 @@ static int awk_main (int argc, qse_char_t* argv[])
} }
#if 0 #if 0
MyAwk::Return args[2]; MyAwk::Value args[2];
args[0].setRun (run); args[0].setRun (run);
args[1].setRun (run); args[1].setRun (run);