From 442732b538918b3098c03abff25e9ba1e8c8f935 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 3 Oct 2007 00:21:00 +0000 Subject: [PATCH] Recovered from cvs revision 2007-10-02 09:32:00 --- ase/awk/Awk.cpp | 326 +++++++++++++++++++++++++++++++++++-------- ase/awk/Awk.hpp | 29 ++-- ase/test/awk/Awk.cpp | 13 +- 3 files changed, 291 insertions(+), 77 deletions(-) diff --git a/ase/awk/Awk.cpp b/ase/awk/Awk.cpp index 769b7a9e..8259fd55 100644 --- a/ase/awk/Awk.cpp +++ b/ase/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.61 2007/09/30 15:12:20 bacon Exp $ + * $Id: Awk.cpp,v 1.63 2007/10/01 15:19:23 bacon Exp $ * * {License} */ @@ -444,7 +444,7 @@ int Awk::Argument::getNextIndex (Awk::Argument& val) const // Awk::Return ////////////////////////////////////////////////////////////////// -Awk::Return::Return (awk_t* awk): awk(awk), type (ASE_AWK_VAL_NIL) +Awk::Return::Return (run_t* run): run(run), val(ase_awk_val_nil) { } @@ -453,74 +453,298 @@ Awk::Return::~Return () clear (); } -Awk::val_t* Awk::Return::toVal (run_t* run) const +Awk::val_t* Awk::Return::toVal () const { - ASE_ASSERT (run != ASE_NULL); + return this->val; +} - switch (this->type) - { - case ASE_AWK_VAL_NIL: - return ase_awk_val_nil; - - case ASE_AWK_VAL_INT: - return ase_awk_makeintval (run, this->v.inum); - - case ASE_AWK_VAL_REAL: - return ase_awk_makerealval (run, this->v.rnum); - - case ASE_AWK_VAL_STR: - return ase_awk_makestrval ( - run, this->v.str.ptr, this->v.str.len); - } - - return ASE_NULL; +Awk::Return::operator Awk::val_t* () const +{ + return this->val; } int Awk::Return::set (long_t v) { - clear (); + ASE_ASSERT (this->run != ASE_NULL); - this->type = ASE_AWK_VAL_INT; - this->v.inum = v; + ase_awk_val_t* x = ase_awk_makeintval (this->run, v); + if (x == ASE_NULL) + { + ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refdownval (this->run, this->val); + this->val = x; + ase_awk_refupval (this->run, this->val); return 0; } int Awk::Return::set (real_t v) { - clear (); + ASE_ASSERT (this->run != ASE_NULL); - this->type = ASE_AWK_VAL_REAL; - this->v.rnum = v; + ase_awk_val_t* x = ase_awk_makerealval (this->run, v); + if (x == ASE_NULL) + { + ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refdownval (this->run, this->val); + this->val = x; + ase_awk_refupval (this->run, this->val); return 0; } int Awk::Return::set (const char_t* ptr, size_t len) { - char_t* tmp = ase_awk_strxdup (awk, ptr, len); - if (tmp == ASE_NULL) return -1; + ASE_ASSERT (this->run != ASE_NULL); - clear (); + ase_awk_val_t* x = ase_awk_makestrval (this->run, ptr, len); + if (x == ASE_NULL) + { + ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } - this->type = ASE_AWK_VAL_STR; - this->v.str.ptr = tmp; - this->v.str.len = len; + ase_awk_refdownval (this->run, this->val); + this->val = x; + ase_awk_refupval (this->run, this->val); + return 0; +} + +int Awk::Return::set (const char_t* idx, size_t iln, long_t v) +{ + ASE_ASSERT (this->run != ASE_NULL); + + int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); + if ((opt & OPT_MAPTOVAR) == 0) + { + /* refer to run_return in run.c */ + ase_awk_setrunerror ( + this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0); + return -1; + } + + if (this->val->type != ASE_AWK_VAL_MAP) + { + ase_awk_val_t* x = ase_awk_makemapval (this->run); + if (x == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + ase_awk_refupval (this->run, x); + + ase_awk_val_t* x2 = ase_awk_makeintval (this->run, v); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refdownval (this->run, this->val); + this->val = x; + } + else + { + ase_awk_val_t* x2 = ase_awk_makeintval (this->run, v); + if (x2 == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + } + + return 0; +} + +int Awk::Return::set (const char_t* idx, size_t iln, real_t v) +{ + ASE_ASSERT (this->run != ASE_NULL); + + int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); + if ((opt & OPT_MAPTOVAR) == 0) + { + /* refer to run_return in run.c */ + ase_awk_setrunerror ( + this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0); + return -1; + } + + if (this->val->type != ASE_AWK_VAL_MAP) + { + ase_awk_val_t* x = ase_awk_makemapval (this->run); + if (x == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + ase_awk_refupval (this->run, x); + + ase_awk_val_t* x2 = ase_awk_makerealval (this->run, v); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refdownval (this->run, this->val); + this->val = x; + } + else + { + ase_awk_val_t* x2 = ase_awk_makerealval (this->run, v); + if (x2 == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + } + + return 0; +} + +int Awk::Return::set (const char_t* idx, size_t iln, const char_t* str, size_t sln) +{ + ASE_ASSERT (this->run != ASE_NULL); + + int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); + if ((opt & OPT_MAPTOVAR) == 0) + { + /* refer to run_return in run.c */ + ase_awk_setrunerror ( + this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0); + return -1; + } + + if (this->val->type != ASE_AWK_VAL_MAP) + { + ase_awk_val_t* x = ase_awk_makemapval (this->run); + if (x == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + ase_awk_refupval (this->run, x); + + ase_awk_val_t* x2 = ase_awk_makestrval (this->run, str, sln); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_refdownval (this->run, x); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refdownval (this->run, this->val); + this->val = x; + } + else + { + ase_awk_val_t* x2 = ase_awk_makestrval (this->run, str, sln); + if (x2 == ASE_NULL) + { + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + + ase_awk_refupval (this->run, x2); + + ase_awk_pair_t* pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); + if (pair == ASE_NULL) + { + ase_awk_refdownval (this->run, x2); + ase_awk_setrunerror ( + this->run, ERR_NOMEM, 0, ASE_NULL, 0); + return -1; + } + } return 0; } void Awk::Return::clear () { - if (this->type == ASE_AWK_VAL_STR) - { - ASE_ASSERT (this->v.str.ptr != ASE_NULL); - ase_awk_free (awk, this->v.str.ptr); - this->v.str.ptr = ASE_NULL; - this->v.str.len = 0; - } - - this->type = ASE_AWK_VAL_NIL; + ase_awk_refdownval (this->run, this->val); + this->val = ase_awk_val_nil; } ////////////////////////////////////////////////////////////////// @@ -991,7 +1215,7 @@ int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len) if (args == ASE_NULL) { ase_awk_setrunerror ( - run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); + run, ERR_NOMEM, 0, ASE_NULL, 0); return -1; } @@ -1001,14 +1225,14 @@ int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len) if (args[i].init (run, v) == -1) { ase_awk_setrunerror ( - run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); + run, ERR_NOMEM, 0, ASE_NULL, 0); delete[] args; return -1; } } Run runForFunction (this, run); - Return ret (awk); + Return ret (run); int n = (this->*handler) (runForFunction, ret, args, nargs, name, len); @@ -1021,15 +1245,7 @@ int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len) return -1; } - val_t* r = ret.toVal (run); - if (r == ASE_NULL) - { - ase_awk_setrunerror ( - run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); - return -1; - } - - ase_awk_setretval (run, r); + ase_awk_setretval (run, ret); return 0; } @@ -1299,7 +1515,7 @@ void Awk::onRunEnd (run_t* run, int errnum, void* custom) if (errnum == ERR_NOERR && r->callbackFailed) { ase_awk_setrunerror ( - r->run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); + r->run, ERR_NOMEM, 0, ASE_NULL, 0); } r->awk->onRunEnd (*r); diff --git a/ase/awk/Awk.hpp b/ase/awk/Awk.hpp index 5db7e976..e6bbc22b 100644 --- a/ase/awk/Awk.hpp +++ b/ase/awk/Awk.hpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.hpp,v 1.63 2007/09/30 15:12:20 bacon Exp $ + * $Id: Awk.hpp,v 1.65 2007/10/01 15:19:23 bacon Exp $ * * {License} */ @@ -351,7 +351,7 @@ public: protected: friend class Awk; - Return (awk_t* awk); + Return (run_t* run); ~Return (); private: @@ -359,32 +359,23 @@ public: Return& operator= (const Return&); protected: - val_t* toVal (run_t* run) const; + val_t* toVal () const; + operator val_t* () const; public: int set (long_t v); int set (real_t v); int set (const char_t* ptr, size_t len); + int set (const char_t* idx, size_t iln, long_t v); + int set (const char_t* idx, size_t iln, real_t v); + int set (const char_t* idx, size_t iln, const char_t* str, size_t sln); + void clear (); - // TODO: Support MAP HERE... - protected: - awk_t* awk; - int type; - - union - { - ase_long_t inum; - ase_real_t rnum; - - struct - { - char_t* ptr; - size_t len; - } str; - } v; + run_t* run; + val_t* val; }; // generated by generrcode.awk diff --git a/ase/test/awk/Awk.cpp b/ase/test/awk/Awk.cpp index 6f12e000..83a10ac6 100644 --- a/ase/test/awk/Awk.cpp +++ b/ase/test/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.37 2007/09/30 15:12:20 bacon Exp $ + * $Id: Awk.cpp,v 1.38 2007/10/01 15:19:23 bacon Exp $ */ #include @@ -159,18 +159,25 @@ public: if (!args[0].isIndexed()) return 0; Argument idx; + size_t i; + char_t buf[128]; int n = args[0].getFirstIndex (idx); - while (n > 0) + for (i = 0; n > 0; i++) { size_t len; const char_t* ptr = idx.toStr(&len); n = args[0].getNextIndex (idx); + + int blen = ase_sprintf (buf, ASE_COUNTOF(buf), ASE_T("%lu"), (unsigned long)i); + if (blen < 0) return -1; + + if (ret.set (buf, blen, ptr, len) == -1) return -1; } if (n != 0) return -1; - return ret.set (L"XXXX", 4); + return 0; } int addConsoleInput (const char_t* file)