From c17dc12bbd96a1027ced115b90bab15b5b3a9b50 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 9 Feb 2008 03:04:38 +0000 Subject: [PATCH] --- ase/awk/Awk.cpp | 24 ++++----- ase/awk/Awk.hpp | 9 ++-- ase/awk/awk.h | 18 ++++--- ase/awk/awk_i.h | 4 +- ase/awk/err.c | 14 ++--- ase/awk/jni.c | 2 +- ase/awk/msw-bcc.mak | 29 +++++++++-- ase/awk/parse.c | 83 ++++++++++++++++++++++++------ ase/awk/run.c | 27 ++++++---- ase/awk/run.h | 26 ++++++---- ase/awk/tree.c | 7 ++- ase/change.log | 5 +- ase/cmn/msw-bcc.mak | 10 +++- ase/test/awk/Awk.cpp | 4 +- ase/test/awk/awk.c | 11 ++-- ase/test/awk/msw-bcc.mak | 107 +++++++++++++++++++++++++++++++++------ ase/test/awk/msw-cl.mak | 2 +- ase/utl/main.c | 2 - ase/utl/msw-bcc.mak | 10 +++- ase/utl/stdio.h | 4 ++ 20 files changed, 291 insertions(+), 107 deletions(-) diff --git a/ase/awk/Awk.cpp b/ase/awk/Awk.cpp index 3de1d1ff..bebef15e 100644 --- a/ase/awk/Awk.cpp +++ b/ase/awk/Awk.cpp @@ -924,20 +924,20 @@ const Awk::char_t* Awk::Run::getErrorMessage () const void Awk::Run::setError (ErrorCode code) { ASE_ASSERT (this->run != ASE_NULL); - ase_awk_setrunerror (this->run, code, 0, ASE_NULL, 0); + ase_awk_setrunerror (this->run, (errnum_t)code, 0, ASE_NULL, 0); } void Awk::Run::setError (ErrorCode code, size_t line) { ASE_ASSERT (this->run != ASE_NULL); - ase_awk_setrunerror (this->run, code, line, ASE_NULL, 0); + ase_awk_setrunerror (this->run, (errnum_t)code, line, ASE_NULL, 0); } void Awk::Run::setError (ErrorCode code, size_t line, const char_t* arg) { ASE_ASSERT (this->run != ASE_NULL); ase_cstr_t x = { arg, ase_strlen(arg) }; - ase_awk_setrunerror (this->run, code, line, &x, 1); + ase_awk_setrunerror (this->run, (errnum_t)code, line, &x, 1); } void Awk::Run::setError ( @@ -945,14 +945,14 @@ void Awk::Run::setError ( { ASE_ASSERT (this->run != ASE_NULL); ase_cstr_t x = { arg, len }; - ase_awk_setrunerror (this->run, code, line, &x, 1); + ase_awk_setrunerror (this->run, (errnum_t)code, line, &x, 1); } void Awk::Run::setErrorWithMessage ( ErrorCode code, size_t line, const char_t* msg) { ASE_ASSERT (this->run != ASE_NULL); - ase_awk_setrunerrmsg (this->run, code, line, msg); + ase_awk_setrunerrmsg (this->run, (errnum_t)code, line, msg); } int Awk::Run::setGlobal (int id, long_t v) @@ -1023,9 +1023,9 @@ void* Awk::Run::getCustom () const // Awk ////////////////////////////////////////////////////////////////// -Awk::Awk (): awk (ASE_NULL), functionMap (ASE_NULL), - sourceIn (Source::READ), sourceOut (Source::WRITE), - errnum (ERR_NOERR), errlin (0), runCallback (false) +Awk::Awk (): /*awk (ASE_NULL), functionMap (ASE_NULL), */ + sourceIn (Source::READ), sourceOut (Source::WRITE)/*, + errnum (ERR_NOERR), errlin (0), runCallback (false)*/ { this->errmsg[0] = ASE_T('\0'); @@ -1075,7 +1075,7 @@ void Awk::setError (ErrorCode code, size_t line, const char_t* arg, size_t len) if (awk != ASE_NULL) { ase_cstr_t x = { arg, len }; - ase_awk_seterror (awk, code, line, &x, 1); + ase_awk_seterror (awk, (errnum_t)code, line, &x, 1); retrieveError (); } else @@ -1092,7 +1092,7 @@ void Awk::setErrorWithMessage (ErrorCode code, size_t line, const char_t* msg) { if (awk != ASE_NULL) { - ase_awk_seterrmsg (awk, code, line, msg); + ase_awk_seterrmsg (awk, (errnum_t)code, line, msg); retrieveError (); } else @@ -1692,13 +1692,13 @@ void Awk::onRunStart (run_t* run, void* custom) r->awk->triggerOnRunStart (*r); } -void Awk::onRunEnd (run_t* run, int errnum, void* custom) +void Awk::onRunEnd (run_t* run, errnum_t errnum, void* custom) { Run* r = (Run*)custom; if (errnum == ERR_NOERR && r->callbackFailed) { - ase_awk_setrunerrnum (r->run, ERR_NOMEM); + ase_awk_setrunerrnum (r->run, (errnum_t)ERR_NOMEM); } r->awk->onRunEnd (*r); diff --git a/ase/awk/Awk.hpp b/ase/awk/Awk.hpp index 67c99150..86df7faf 100644 --- a/ase/awk/Awk.hpp +++ b/ase/awk/Awk.hpp @@ -41,8 +41,6 @@ public: typedef ase_awk_map_t map_t; /** Represents a key/value pair */ typedef ase_awk_pair_t pair_t; - /** Represents the IO command */ - typedef ase_awk_iocmd_t iocmd_t; /** Represents the external I/O context */ typedef ase_awk_extio_t extio_t; /** Represents the run-time context */ @@ -50,6 +48,11 @@ public: /** Represents the underlying interpreter */ typedef ase_awk_t awk_t; + /** Represents IO command */ + typedef ase_awk_iocmd_t iocmd_t; + /** Represents the error number */ + typedef ase_awk_errnum_t errnum_t; + /** * Represents the source code I/O context for Awk::parse. * An instance of Awk::Source is passed to Awk::openSource, @@ -1056,7 +1059,7 @@ protected: static void freeFunctionMapValue (void* owner, void* value); static void onRunStart (run_t* run, void* custom); - static void onRunEnd (run_t* run, int errnum, void* custom); + static void onRunEnd (run_t* run, errnum_t errnum, void* custom); static void onRunReturn (run_t* run, val_t* ret, void* custom); static void onRunStatement (run_t* run, size_t line, void* custom); diff --git a/ase/awk/awk.h b/ase/awk/awk.h index c4f516cb..81a834bc 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -31,13 +31,15 @@ typedef struct ase_awk_runcbs_t ase_awk_runcbs_t; typedef struct ase_awk_runarg_t ase_awk_runarg_t; typedef struct ase_awk_rexfns_t ase_awk_rexfns_t; +typedef enum ase_awk_iocmd_t ase_awk_iocmd_t; +typedef enum ase_awk_errnum_t ase_awk_errnum_t; + typedef ase_real_t (*ase_awk_pow_t) (void* custom, ase_real_t x, ase_real_t y); typedef int (*ase_awk_sprintf_t) ( void* custom, ase_char_t* buf, ase_size_t size, const ase_char_t* fmt, ...); typedef void (*ase_awk_dprintf_t) (void* custom, const ase_char_t* fmt, ...); -typedef enum ase_awk_iocmd_t ase_awk_iocmd_t; typedef ase_ssize_t (*ase_awk_io_t) ( ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t count); @@ -115,7 +117,7 @@ struct ase_awk_runcbs_t ase_awk_run_t* run, ase_awk_val_t* ret, void* custom_data); void (*on_end) ( - ase_awk_run_t* run, int errnum, void* custom_data); + ase_awk_run_t* run, ase_awk_errnum_t errnum, void* custom_data); void* custom_data; }; @@ -472,16 +474,16 @@ int ase_awk_geterrnum (ase_awk_t* awk); ase_size_t ase_awk_geterrlin (ase_awk_t* awk); const ase_char_t* ase_awk_geterrmsg (ase_awk_t* awk); -void ase_awk_seterrnum (ase_awk_t* awk, int errnum); +void ase_awk_seterrnum (ase_awk_t* awk, ase_awk_errnum_t errnum); void ase_awk_seterrmsg (ase_awk_t* awk, - int errnum, ase_size_t errlin, const ase_char_t* errmsg); + ase_awk_errnum_t errnum, ase_size_t errlin, const ase_char_t* errmsg); void ase_awk_geterror ( ase_awk_t* awk, int* errnum, ase_size_t* errlin, const ase_char_t** errmsg); void ase_awk_seterror ( - ase_awk_t* awk, int errnum, ase_size_t errlin, + ase_awk_t* awk, ase_awk_errnum_t errnum, ase_size_t errlin, const ase_cstr_t* errarg, ase_size_t argcnt); int ase_awk_getoption (ase_awk_t* awk); @@ -621,16 +623,16 @@ ase_awk_map_t* ase_awk_getrunnamedvarmap (ase_awk_run_t* awk); int ase_awk_getrunerrnum (ase_awk_run_t* run); ase_size_t ase_awk_getrunerrlin (ase_awk_run_t* run); const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run); -void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum); +void ase_awk_setrunerrnum (ase_awk_run_t* run, ase_awk_errnum_t errnum); void ase_awk_setrunerrmsg (ase_awk_run_t* run, - int errnum, ase_size_t errlin, const ase_char_t* errmsg); + ase_awk_errnum_t errnum, ase_size_t errlin, const ase_char_t* errmsg); void ase_awk_getrunerror ( ase_awk_run_t* run, int* errnum, ase_size_t* errlin, const ase_char_t** errmsg); void ase_awk_setrunerror ( - ase_awk_run_t* run, int errnum, ase_size_t errlin, + ase_awk_run_t* run, ase_awk_errnum_t errnum, ase_size_t errlin, const ase_cstr_t* errarg, ase_size_t argcnt); /* functions to manipulate intrinsic functions */ diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 73d5b928..d6151211 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -218,7 +218,7 @@ struct ase_awk_t } tmp; /* housekeeping */ - int errnum; + ase_awk_errnum_t errnum; ase_size_t errlin; ase_char_t errmsg[256]; ase_char_t* errstr[ASE_AWK_NUMERRNUM]; @@ -355,7 +355,7 @@ struct ase_awk_run_t } max; } depth; - int errnum; + ase_awk_errnum_t errnum; ase_size_t errlin; ase_char_t errmsg[256]; diff --git a/ase/awk/err.c b/ase/awk/err.c index deecba57..1ea2f60d 100644 --- a/ase/awk/err.c +++ b/ase/awk/err.c @@ -6,7 +6,7 @@ #include -static const ase_char_t* __geterrstr (int errnum) +static const ase_char_t* __geterrstr (ase_awk_errnum_t errnum) { static const ase_char_t* errstr[] = { @@ -217,7 +217,7 @@ void ase_awk_geterror ( } } -void ase_awk_seterrnum (ase_awk_t* awk, int errnum) +void ase_awk_seterrnum (ase_awk_t* awk, ase_awk_errnum_t errnum) { awk->errnum = errnum; awk->errlin = 0; @@ -225,7 +225,7 @@ void ase_awk_seterrnum (ase_awk_t* awk, int errnum) } void ase_awk_seterrmsg (ase_awk_t* awk, - int errnum, ase_size_t errlin, const ase_char_t* errmsg) + ase_awk_errnum_t errnum, ase_size_t errlin, const ase_char_t* errmsg) { awk->errnum = errnum; awk->errlin = errlin; @@ -233,7 +233,7 @@ void ase_awk_seterrmsg (ase_awk_t* awk, } void ase_awk_seterror ( - ase_awk_t* awk, int errnum, ase_size_t errlin, + ase_awk_t* awk, ase_awk_errnum_t errnum, ase_size_t errlin, const ase_cstr_t* errarg, ase_size_t argcnt) { const ase_char_t* errfmt; @@ -352,7 +352,7 @@ const ase_char_t* ase_awk_getrunerrmsg (ase_awk_run_t* run) return run->errmsg; } -void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum) +void ase_awk_setrunerrnum (ase_awk_run_t* run, ase_awk_errnum_t errnum) { run->errnum = errnum; run->errlin = 0; @@ -360,7 +360,7 @@ void ase_awk_setrunerrnum (ase_awk_run_t* run, int errnum) } void ase_awk_setrunerrmsg (ase_awk_run_t* run, - int errnum, ase_size_t errlin, const ase_char_t* errmsg) + ase_awk_errnum_t errnum, ase_size_t errlin, const ase_char_t* errmsg) { run->errnum = errnum; run->errlin = errlin; @@ -383,7 +383,7 @@ void ase_awk_getrunerror ( } void ase_awk_setrunerror ( - ase_awk_run_t* run, int errnum, ase_size_t errlin, + ase_awk_run_t* run, ase_awk_errnum_t errnum, ase_size_t errlin, const ase_cstr_t* errarg, ase_size_t argcnt) { const ase_char_t* errfmt; diff --git a/ase/awk/jni.c b/ase/awk/jni.c index 9df9cabf..99885d51 100644 --- a/ase/awk/jni.c +++ b/ase/awk/jni.c @@ -110,7 +110,7 @@ struct run_data_t jobject obj; ase_size_t errlin; - int errnum; + ase_awk_errnum_t errnum; ase_char_t errmsg[256]; jclass exception_class; diff --git a/ase/awk/msw-bcc.mak b/ase/awk/msw-bcc.mak index 98daf673..bf6aba7d 100644 --- a/ase/awk/msw-bcc.mak +++ b/ase/awk/msw-bcc.mak @@ -15,8 +15,21 @@ AR = tlib JAVAC = javac JAR = jar -CFLAGS = -O2 -WM -WU -RT- -w -q -I..\.. -CXXFLAGS = -O2 -WM -WU -RT- -w -q -I..\.. + +CFLAGS = -WM -WU -RT- -w -q -I..\.. +CXXFLAGS = -WM -WU -RT- -w -q -I..\.. + +!IF "$(MODE)" == "debug" +CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG +CXXFLAGS = $(CXXFLAGS) -D_DEBUG -DDEBUG +!ELSEIF "$(MODE)" == "release" +CFLAGS = $(CFLAGS) -DNDEBUG -O2 +CXXFLAGS = $(CXXFLAGS) -DNDEBUG -O2 +!ELSE +CFLAGS = $(CFLAGS) +CXXFLAGS = $(CXXFLAGS) +!ENDIF + JAVACFLAGS = -classpath ..\.. -Xlint:unchecked LDFLAGS = -Tpd -ap -Gn -c -q -L..\$(MODE)\lib @@ -26,7 +39,7 @@ LIBS = import32.lib cw32mt.lib asecmn.lib aseutl.lib $(NAME).lib OUT_DIR = ..\$(MODE)\lib OUT_FILE_LIB = $(OUT_DIR)\$(NAME).lib OUT_FILE_JNI = $(OUT_DIR)\$(NAME)_jni.dll -OUT_FILE_LIB_CXX = $(OUT_DIR)\$(NAME)++.lib +OUT_FILE_LIB_CXX = "$(OUT_DIR)\$(NAME)++.lib" OUT_FILE_JAR = $(OUT_DIR)\$(NAME).jar TMP_DIR = $(MODE) @@ -67,7 +80,13 @@ OBJ_FILES_JAR = \ $(TMP_DIR)\ase\awk\Pipe.class \ $(TMP_DIR)\ase\awk\Exception.class -all: lib +TARGETS = lib +!if "$(JAVA_HOME)" != "" +TARGETS = $(TARGETS) jnidll jar +JNI_INC = -I"$(JAVA_HOME)\include" -I"$(JAVA_HOME)\include\win32" +!endif + +all: $(TARGETS) lib: $(TMP_DIR) $(OUT_DIR) $(OUT_DIR_CXX) $(OUT_FILE_LIB) $(OUT_FILE_LIB_CXX) @@ -82,7 +101,7 @@ $(OUT_FILE_LIB): $(OBJ_FILES_LIB) ! $(OUT_FILE_LIB_CXX): $(OBJ_FILES_LIB_CXX) - $(AR) "$(OUT_FILE_LIB_CXX)" @&&! + $(AR) $(OUT_FILE_LIB_CXX) @&&! +-$(**: = &^ +-) ! diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 28fc3792..096be0d8 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -21,6 +21,11 @@ enum TOKEN_IDIV_ASSIGN, TOKEN_MOD_ASSIGN, TOKEN_EXP_ASSIGN, + TOKEN_RSHIFT_ASSIGN, + TOKEN_LSHIFT_ASSIGN, + TOKEN_BAND_ASSIGN, + TOKEN_BXOR_ASSIGN, + TOKEN_BOR_ASSIGN, TOKEN_EQ, TOKEN_NE, @@ -29,7 +34,7 @@ enum TOKEN_GE, TOKEN_GT, TOKEN_NM, /* not match */ - TOKEN_NOT, + TOKEN_LNOT, /* logical negation ! */ TOKEN_PLUS, TOKEN_PLUSPLUS, TOKEN_MINUS, @@ -2526,7 +2531,7 @@ static ase_awk_nde_t* parse_unary (ase_awk_t* awk, ase_size_t line) opcode = (MATCH(awk,TOKEN_PLUS))? ASE_AWK_UNROP_PLUS: (MATCH(awk,TOKEN_MINUS))? ASE_AWK_UNROP_MINUS: - (MATCH(awk,TOKEN_NOT))? ASE_AWK_UNROP_NOT: + (MATCH(awk,TOKEN_LNOT))? ASE_AWK_UNROP_LNOT: (MATCH(awk,TOKEN_TILDE))? ASE_AWK_UNROP_BNOT: -1; /*if (opcode == -1) return parse_increment (awk);*/ @@ -2584,7 +2589,7 @@ static ase_awk_nde_t* parse_unary_exp (ase_awk_t* awk, ase_size_t line) opcode = (MATCH(awk,TOKEN_PLUS))? ASE_AWK_UNROP_PLUS: (MATCH(awk,TOKEN_MINUS))? ASE_AWK_UNROP_MINUS: - (MATCH(awk,TOKEN_NOT))? ASE_AWK_UNROP_NOT: + (MATCH(awk,TOKEN_LNOT))? ASE_AWK_UNROP_LNOT: (MATCH(awk,TOKEN_TILDE))? ASE_AWK_UNROP_BNOT: -1; if (opcode == -1) return parse_increment (awk, line); @@ -4605,7 +4610,7 @@ static int get_token (ase_awk_t* awk) } else { - SET_TOKEN_TYPE (awk, TOKEN_NOT); + SET_TOKEN_TYPE (awk, TOKEN_LNOT); } } else if (c == ASE_T('>')) @@ -4614,9 +4619,18 @@ static int get_token (ase_awk_t* awk) GET_CHAR_TO (awk, c); if (c == ASE_T('>')) { - SET_TOKEN_TYPE (awk, TOKEN_RSHIFT); ADD_TOKEN_CHAR (awk, c); - GET_CHAR (awk); + GET_CHAR_TO (awk, c); + if ((awk->option & ASE_AWK_SHIFT) && c == ASE_T('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_RSHIFT_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR (awk); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_RSHIFT); + } } else if (c == ASE_T('=')) { @@ -4636,9 +4650,18 @@ static int get_token (ase_awk_t* awk) if ((awk->option & ASE_AWK_SHIFT) && c == ASE_T('<')) { - SET_TOKEN_TYPE (awk, TOKEN_LSHIFT); ADD_TOKEN_CHAR (awk, c); - GET_CHAR (awk); + GET_CHAR_TO (awk, c); + if (c == ASE_T('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_LSHIFT_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR (awk); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_LSHIFT); + } } else if (c == ASE_T('=')) { @@ -4667,6 +4690,12 @@ static int get_token (ase_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR (awk); } + else if (c == ASE_T('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_BOR_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR (awk); + } else { SET_TOKEN_TYPE (awk, TOKEN_BOR); @@ -4682,23 +4711,39 @@ static int get_token (ase_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR (awk); } + else if (c == ASE_T('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_BAND_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR (awk); + } else { SET_TOKEN_TYPE (awk, TOKEN_BAND); } } + else if (c == ASE_T('^')) + { + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + + if (c == ASE_T('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_BXOR_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR (awk); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_BXOR); + } + } else if (c == ASE_T('~')) { SET_TOKEN_TYPE (awk, TOKEN_TILDE); ADD_TOKEN_CHAR (awk, c); GET_CHAR (awk); } - else if (c == ASE_T('^')) - { - SET_TOKEN_TYPE (awk, TOKEN_BXOR); - ADD_TOKEN_CHAR (awk, c); - GET_CHAR (awk); - } else if (c == ASE_T('+')) { ADD_TOKEN_CHAR (awk, c); @@ -5370,6 +5415,7 @@ static int classify_ident ( static int assign_to_opcode (ase_awk_t* awk) { + /* synchronize it with ase_awk_assop_type_t in run.h */ static int assop[] = { ASE_AWK_ASSOP_NONE, @@ -5379,11 +5425,16 @@ static int assign_to_opcode (ase_awk_t* awk) ASE_AWK_ASSOP_DIV, ASE_AWK_ASSOP_IDIV, ASE_AWK_ASSOP_MOD, - ASE_AWK_ASSOP_EXP + ASE_AWK_ASSOP_EXP, + ASE_AWK_ASSOP_RSHIFT, + ASE_AWK_ASSOP_LSHIFT, + ASE_AWK_ASSOP_BAND, + ASE_AWK_ASSOP_BXOR, + ASE_AWK_ASSOP_BOR }; if (awk->token.type >= TOKEN_ASSIGN && - awk->token.type <= TOKEN_EXP_ASSIGN) + awk->token.type <= TOKEN_BOR_ASSIGN) { return assop[awk->token.type - TOKEN_ASSIGN]; } diff --git a/ase/awk/run.c b/ase/awk/run.c index ff3e7a25..ab811785 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -3204,7 +3204,7 @@ static ase_awk_val_t* eval_assignment (ase_awk_run_t* run, ase_awk_nde_t* nde) if (ass->opcode != ASE_AWK_ASSOP_NONE) { ase_awk_val_t* val2, * tmp; - static binop_func_t __binop_func[] = + static binop_func_t binop_func[] = { ASE_NULL, /* ASE_AWK_ASSOP_NONE */ eval_binop_plus, @@ -3213,7 +3213,12 @@ static ase_awk_val_t* eval_assignment (ase_awk_run_t* run, ase_awk_nde_t* nde) eval_binop_div, eval_binop_idiv, eval_binop_mod, - eval_binop_exp + eval_binop_exp, + eval_binop_rshift, + eval_binop_lshift, + eval_binop_band, + eval_binop_bxor, + eval_binop_bor }; ASE_ASSERT (ass->left->next == ASE_NULL); @@ -3227,10 +3232,10 @@ static ase_awk_val_t* eval_assignment (ase_awk_run_t* run, ase_awk_nde_t* nde) ase_awk_refupval (run, val2); ASE_ASSERT (ass->opcode >= 0); - ASE_ASSERT (ass->opcode < ASE_COUNTOF(__binop_func)); - ASE_ASSERT (__binop_func[ass->opcode] != ASE_NULL); + ASE_ASSERT (ass->opcode < ASE_COUNTOF(binop_func)); + ASE_ASSERT (binop_func[ass->opcode] != ASE_NULL); - tmp = __binop_func[ass->opcode] (run, val2, val); + tmp = binop_func[ass->opcode] (run, val2, val); if (tmp == ASE_NULL) { ase_awk_refdownval (run, val2); @@ -3597,7 +3602,7 @@ static ase_awk_val_t* do_assignment_pos ( static ase_awk_val_t* eval_binary (ase_awk_run_t* run, ase_awk_nde_t* nde) { - static binop_func_t __binop_func[] = + static binop_func_t binop_func[] = { /* the order of the functions should be inline with * the operator declaration in run.h */ @@ -3678,10 +3683,10 @@ static ase_awk_val_t* eval_binary (ase_awk_run_t* run, ase_awk_nde_t* nde) ase_awk_refupval (run, right); ASE_ASSERT (exp->opcode >= 0 && - exp->opcode < ASE_COUNTOF(__binop_func)); - ASE_ASSERT (__binop_func[exp->opcode] != ASE_NULL); + exp->opcode < ASE_COUNTOF(binop_func)); + ASE_ASSERT (binop_func[exp->opcode] != ASE_NULL); - res = __binop_func[exp->opcode] (run, left, right); + res = binop_func[exp->opcode] (run, left, right); if (res == ASE_NULL) { /* change the error line */ @@ -4832,7 +4837,7 @@ static ase_awk_val_t* eval_unary (ase_awk_run_t* run, ase_awk_nde_t* nde) ASE_ASSERT ( exp->opcode == ASE_AWK_UNROP_PLUS || exp->opcode == ASE_AWK_UNROP_MINUS || - exp->opcode == ASE_AWK_UNROP_NOT || + exp->opcode == ASE_AWK_UNROP_LNOT || exp->opcode == ASE_AWK_UNROP_BNOT); ASE_ASSERT (exp->left->next == ASE_NULL); @@ -4849,7 +4854,7 @@ static ase_awk_val_t* eval_unary (ase_awk_run_t* run, ase_awk_nde_t* nde) res = (n == 0)? ase_awk_makeintval (run, -l): ase_awk_makerealval (run, -r); } - else if (exp->opcode == ASE_AWK_UNROP_NOT) + else if (exp->opcode == ASE_AWK_UNROP_LNOT) { if (left->type == ASE_AWK_VAL_STR) { diff --git a/ase/awk/run.h b/ase/awk/run.h index 430ca51f..740deedc 100644 --- a/ase/awk/run.h +++ b/ase/awk/run.h @@ -13,21 +13,27 @@ enum ase_awk_assop_type_t { - /* if you change this, you have to change __assop_str in tree.c */ + /* if you change this, you have to change assop_str in tree.c. + * synchronize it with binop_func of eval_assignment in run.c */ ASE_AWK_ASSOP_NONE, - ASE_AWK_ASSOP_PLUS, /* += */ - ASE_AWK_ASSOP_MINUS, /* -= */ - ASE_AWK_ASSOP_MUL, /* *= */ - ASE_AWK_ASSOP_DIV, /* /= */ - ASE_AWK_ASSOP_IDIV, /* //= */ - ASE_AWK_ASSOP_MOD, /* %= */ - ASE_AWK_ASSOP_EXP /* **= */ + ASE_AWK_ASSOP_PLUS, /* += */ + ASE_AWK_ASSOP_MINUS, /* -= */ + ASE_AWK_ASSOP_MUL, /* *= */ + ASE_AWK_ASSOP_DIV, /* /= */ + ASE_AWK_ASSOP_IDIV, /* //= */ + ASE_AWK_ASSOP_MOD, /* %= */ + ASE_AWK_ASSOP_EXP, /* **= */ + ASE_AWK_ASSOP_RSHIFT, /* >>= */ + ASE_AWK_ASSOP_LSHIFT, /* <<= */ + ASE_AWK_ASSOP_BAND, /* &= */ + ASE_AWK_ASSOP_BXOR, /* ^= */ + ASE_AWK_ASSOP_BOR /* |= */ }; enum ase_awk_binop_type_t { /* if you change this, you have to change - * __binop_str in tree.c and __binop_func in run.c accordingly. */ + * binop_str in tree.c and binop_func in run.c accordingly. */ ASE_AWK_BINOP_LOR, ASE_AWK_BINOP_LAND, ASE_AWK_BINOP_IN, @@ -65,7 +71,7 @@ enum ase_awk_unrop_type_t * __unrop_str in tree.c accordingly. */ ASE_AWK_UNROP_PLUS, ASE_AWK_UNROP_MINUS, - ASE_AWK_UNROP_NOT, + ASE_AWK_UNROP_LNOT, ASE_AWK_UNROP_BNOT }; diff --git a/ase/awk/tree.c b/ase/awk/tree.c index c20cccd5..e85d9629 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -15,7 +15,12 @@ static const ase_char_t* assop_str[] = ASE_T("/="), ASE_T("//="), ASE_T("%="), - ASE_T("**=") + ASE_T("**="), + ASE_T(">>="), + ASE_T("<<="), + ASE_T("&="), + ASE_T("^="), + ASE_T("|=") }; static const ase_char_t* binop_str[][2] = diff --git a/ase/change.log b/ase/change.log index ab7598f4..42845d7e 100644 --- a/ase/change.log +++ b/ase/change.log @@ -34,10 +34,11 @@ } * redefined the variable scope -* removed ASE_AWK_UNIQUEFN and ASE_AWK_SHADING -* fixed a bug in handle >> when ASE_AWK_SHIFT is off +* removed ASE_AWK_UNIQUEFN and ASE_AWK_SHADING by refining the scoping rule +* fixed a bug in handling >> when ASE_AWK_SHIFT is off * added ASE_AWK_EVARRED +* added five operators - <<=, >>=, &=, ^=, |= [0.3.2] diff --git a/ase/cmn/msw-bcc.mak b/ase/cmn/msw-bcc.mak index dd0ee036..20f4fb10 100644 --- a/ase/cmn/msw-bcc.mak +++ b/ase/cmn/msw-bcc.mak @@ -8,7 +8,15 @@ CC = bcc32 LD = ilink32 AR = tlib -CFLAGS = -O2 -WM -WU -RT- -w -q -I..\.. +CFLAGS = -WM -WU -RT- -w -q -I..\.. + +!IF "$(MODE)" == "debug" +CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG +!ELSEIF "$(MODE)" == "release" +CFLAGS = $(CFLAGS) -DNDEBUG -O2 +!ELSE +CFLAGS = $(CFLAGS) +!ENDIF OUT_DIR = ..\$(MODE)\lib OUT_FILE_LIB = $(OUT_DIR)\$(NAME).lib diff --git a/ase/test/awk/Awk.cpp b/ase/test/awk/Awk.cpp index 316d832a..89ea5226 100644 --- a/ase/test/awk/Awk.cpp +++ b/ase/test/awk/Awk.cpp @@ -688,9 +688,10 @@ static void print_usage (const ase_char_t* argv0) } } -int awk_main (int argc, ase_char_t* argv[]) +static int awk_main (int argc, ase_char_t* argv[]) { TestAwk awk; + int mode = 0; const ase_char_t* mainfn = NULL; const ase_char_t* srcin = ASE_T(""); @@ -887,7 +888,6 @@ int awk_main (int argc, ase_char_t* argv[]) extern "C" int ase_main (int argc, ase_achar_t* argv[]) { - int n; #if defined(__linux) && defined(_DEBUG) diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index e3f3936b..d23f5689 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -196,7 +196,6 @@ static ase_cint_t custom_awk_tolower (void* custom, ase_cint_t c) /* custom miscellaneous functions */ - static ase_real_t custom_awk_pow (void* custom, ase_real_t x, ase_real_t y) { return pow (x, y); @@ -219,7 +218,7 @@ static int custom_awk_sprintf ( static ase_ssize_t awk_srcio_in ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) + ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t size) { struct awk_src_io* src_io = (struct awk_src_io*)arg; ase_cint_t c; @@ -258,7 +257,7 @@ static ase_ssize_t awk_srcio_in ( } static ase_ssize_t awk_srcio_out ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) + ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t size) { /*struct awk_src_io* src_io = (struct awk_src_io*)arg;*/ @@ -295,7 +294,7 @@ static ase_ssize_t awk_srcio_out ( } static ase_ssize_t awk_extio_pipe ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) + ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t size) { ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; @@ -419,7 +418,7 @@ static ase_ssize_t awk_extio_pipe ( } static ase_ssize_t awk_extio_file ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) + ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t size) { ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; @@ -559,7 +558,7 @@ static ase_ssize_t getdata (ase_char_t* data, ase_size_t size, FILE* fp) } static ase_ssize_t awk_extio_console ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) + ase_awk_iocmd_t cmd, void* arg, ase_char_t* data, ase_size_t size) { ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; diff --git a/ase/test/awk/msw-bcc.mak b/ase/test/awk/msw-bcc.mak index 92d19d9a..b0c754aa 100644 --- a/ase/test/awk/msw-bcc.mak +++ b/ase/test/awk/msw-bcc.mak @@ -6,6 +6,7 @@ # # -Tpe # -Tpd /dll +NAME = aseawk !ifndef MODE MODE = release @@ -14,27 +15,101 @@ MODE = release CC = bcc32 CXX = bcc32 LD = ilink32 -CFLAGS = -O2 -WM -WU -RT- -w -q -I..\..\.. -CXXFLAGS = -O2 -WM -WU -RT- -w -q -I..\..\.. -LDFLAGS = -ap -Tpe -Gn -c -q -L..\..\awk -L..\..\cmn -L..\..\utl -LIBS = import32.lib cw32mt.lib aseawk.lib asecmn.lib aseutl.lib +JAVAC = javac +JAR = jar + +CFLAGS = -WM -WU -RT- -w -q -I..\..\.. +CXXFLAGS = -WM -WU -RT- -w -q -I..\..\.. +LDFLAGS = -ap -Tpe -Gn -c -q -L..\..\$(MODE)\lib -L\progra~1\borland\bds\4.0\lib +LIBS = asecmn.lib aseawk.lib aseutl.lib import32.lib cw32mt.lib +LIBS_CXX = $(LIBS) "aseawk++.lib" STARTUP = c0x32w.obj -all: aseawk +JAVACFLAGS = -classpath ..\..\$(MODE)\lib\aseawk.jar;. -Xlint:unchecked -aseawk: awk.obj - $(LD) $(LDFLAGS) $(STARTUP) awk.obj,$@.exe,,$(LIBS),, +OUT_DIR = ..\..\$(MODE)\bin +OUT_FILE_BIN = $(OUT_DIR)\$(NAME).exe +OUT_FILE_BIN_CXX = "$(OUT_DIR)\$(NAME)++.exe" +OUT_FILE_JAR = $(OUT_DIR)\$(NAME).jar -java: - javac -classpath ../../.. Awk.java AwkApplet.java +TMP_DIR = $(MODE) +TMP_DIR_CXX = $(TMP_DIR)\cxx +TMP_DIR_JAR = $(TMP_DIR)\java -jrun: - java -Xms1m -Xmx2m -classpath ../../.. ase.test.awk.Awk +OBJ_FILES_BIN = $(TMP_DIR)\awk.obj +OBJ_FILES_BIN_CXX = $(TMP_DIR_CXX)\Awk.obj + +OBJ_FILES_JAR = \ + $(TMP_DIR_JAR)\AseAwk.class \ + $(TMP_DIR_JAR)\AseAwkPanel.class \ + $(TMP_DIR_JAR)\AseAwkApplet.class + +TARGETS = bin + +!if "$(JAVA_HOME)" != "" +TARGETS = $(TARGETS) jar +!endif + +!IF "$(MODE)" == "debug" +CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG +CXXFLAGS = $(CXXFLAGS) -D_DEBUG -DDEBUG +!ELSEIF "$(MODE)" == "release" +CFLAGS = $(CFLAGS) -DNDEBUG -O2 +CXXFLAGS = $(CXXFLAGS) -DNDEBUG -O2 +!ELSE +CFLAGS = $(CFLAGS) +CXXFLAGS = $(CXXFLAGS) +!ENDIF + +all: $(TARGETS) + +bin: $(OUT_FILE_BIN) $(OUT_FILE_BIN_CXX) + +jar: $(OUT_FILE_JAR) + +$(OUT_FILE_BIN): $(TMP_DIR) $(OUT_DIR) $(OBJ_FILES_BIN) + $(LD) $(LDFLAGS) $(STARTUP) $(OBJ_FILES_BIN),$@,,$(LIBS),, + +$(OUT_FILE_BIN_CXX): $(TMP_DIR_CXX) $(OUT_FILE_BIN) $(OBJ_FILES_BIN_CXX) + $(LD) $(LDFLAGS) $(STARTUP) $(OBJ_FILES_BIN_CXX),$@,,$(LIBS_CXX),, + +$(OUT_FILE_JAR): $(TMP_DIR_JAR) $(OBJ_FILES_JAR) + $(JAR) -xvf ..\..\$(MODE)\lib\aseawk.jar + $(JAR) -cvfm $(OUT_FILE_JAR) manifest ase -C $(TMP_DIR_JAR) . + +$(TMP_DIR)\awk.obj: awk.c + $(CC) $(CFLAGS) -o$@ -c awk.c + +$(TMP_DIR_CXX)\Awk.obj: Awk.cpp + $(CC) $(CXXFLAGS) -o$@ -c Awk.cpp + +$(TMP_DIR_JAR)\AseAwk.class: AseAwk.java + $(JAVAC) $(JAVACFLAGS) -d $(TMP_DIR_JAR) AseAwk.java + +$(TMP_DIR_JAR)\AseAwkApplet.class: AseAwkApplet.java + $(JAVAC) $(JAVACFLAGS) -d $(TMP_DIR_JAR) AseAwkApplet.java + +$(TMP_DIR_JAR)\AseAwkPanel.class: AseAwkPanel.java + $(JAVAC) $(JAVACFLAGS) -d $(TMP_DIR_JAR) AseAwkPanel.java + +$(OUT_DIR): + -md $(OUT_DIR) + +$(TMP_DIR): + -md $(TMP_DIR) + +$(TMP_DIR_CXX): $(TMP_DIR) + -md $(TMP_DIR_CXX) + +$(TMP_DIR_JAR): $(TMP_DIR) + -md $(TMP_DIR_JAR) clean: - del $(OBJS) *.obj *.class aseawk.exe - -.SUFFIXES: .c .obj -.c.obj: - $(CC) $(CFLAGS) -c $< + -del $(OUT_FILE_BIN) + -del $(OUT_FILE_BIN_CXX) + -del $(OBJ_FILES_BIN) + -del $(OBJ_FILES_BIN_CXX) + -del $(OUT_FILE_JAR) + -del $(OBJ_FILES_JAR) + -del $(TMP_DIR)\*.class diff --git a/ase/test/awk/msw-cl.mak b/ase/test/awk/msw-cl.mak index 661581eb..e30a910e 100644 --- a/ase/test/awk/msw-cl.mak +++ b/ase/test/awk/msw-cl.mak @@ -110,7 +110,7 @@ $(TMP_DIR_JAR): $(TMP_DIR) clean: -del $(OUT_FILE_BIN) - -del $(OUT_FILE_BIN_CXX) + -del $(OUT_FILE_BIN_CXX) -del $(OBJ_FILES_BIN) -del $(OBJ_FILES_BIN_CXX) -del $(OUT_FILE_JAR) diff --git a/ase/utl/main.c b/ase/utl/main.c index 8c401a0f..343bedad 100644 --- a/ase/utl/main.c +++ b/ase/utl/main.c @@ -19,8 +19,6 @@ int ase_runmain (int argc, ase_achar_t* argv[], int(*mf) (int,ase_char_t*[])) #elif defined(ASE_CHAR_IS_WCHAR) -#include - int ase_runmain (int argc, ase_achar_t* argv[], int(*mf) (int,ase_char_t*[])) { int i, ret; diff --git a/ase/utl/msw-bcc.mak b/ase/utl/msw-bcc.mak index 84edaeb8..77027ec8 100644 --- a/ase/utl/msw-bcc.mak +++ b/ase/utl/msw-bcc.mak @@ -8,7 +8,15 @@ CC = bcc32 LD = ilink32 AR = tlib -CFLAGS = -O2 -WM -WU -RT- -w -q -I..\.. +CFLAGS = -WM -WU -RT- -w -q -I..\.. + +!IF "$(MODE)" == "debug" +CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG +!ELSEIF "$(MODE)" == "release" +CFLAGS = $(CFLAGS) -DNDEBUG -O2 +!ELSE +CFLAGS = $(CFLAGS) +!ENDIF OUT_DIR = ..\$(MODE)\lib OUT_FILE_LIB = $(OUT_DIR)\$(NAME).lib diff --git a/ase/utl/stdio.h b/ase/utl/stdio.h index c00c496c..9df0b66e 100644 --- a/ase/utl/stdio.h +++ b/ase/utl/stdio.h @@ -41,6 +41,10 @@ #define ase_clearerr(s) clearerr(s) #define ase_fflush(s) fflush(s) +#define ASE_STDIN stdin +#define ASE_STDOUT stdout +#define ASE_STDERR stderr + #ifdef __cplusplus extern "C" { #endif