diff --git a/qse/configure b/qse/configure index a04bc4ea..1f00015a 100755 --- a/qse/configure +++ b/qse/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63 for qse 0.5.1. +# Generated by GNU Autoconf 2.63 for qse 0.5.2. # # Report bugs to . # @@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='qse' PACKAGE_TARNAME='qse' -PACKAGE_VERSION='0.5.1' -PACKAGE_STRING='qse 0.5.1' +PACKAGE_VERSION='0.5.2' +PACKAGE_STRING='qse 0.5.2' PACKAGE_BUGREPORT='bacon@abiyo.net' # Factoring default headers for most tests. @@ -1511,7 +1511,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures qse 0.5.1 to adapt to many kinds of systems. +\`configure' configures qse 0.5.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1581,7 +1581,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of qse 0.5.1:";; + short | recursive ) echo "Configuration of qse 0.5.2:";; esac cat <<\_ACEOF @@ -1695,7 +1695,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -qse configure 0.5.1 +qse configure 0.5.2 generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1709,7 +1709,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by qse $as_me 0.5.1, which was +It was created by qse $as_me 0.5.2, which was generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -2436,7 +2436,7 @@ fi # Define the identity of the package. PACKAGE='qse' - VERSION='0.5.1' + VERSION='0.5.2' cat >>confdefs.h <<_ACEOF @@ -26126,7 +26126,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by qse $as_me 0.5.1, which was +This file was extended by qse $as_me 0.5.2, which was generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26189,7 +26189,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -qse config.status 0.5.1 +qse config.status 0.5.2 configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/qse/configure.ac b/qse/configure.ac index 061c316c..781d8138 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -1,5 +1,5 @@ dnl AC_PREREQ(2.59) -AC_INIT([qse],[0.5.1],[bacon@abiyo.net]) +AC_INIT([qse],[0.5.2],[bacon@abiyo.net]) AC_CONFIG_HEADER([include/qse/config.h]) AC_CONFIG_AUX_DIR([ac/au]) AC_CONFIG_MACRO_DIR([ac/m4]) diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 474d14fe..67e355bd 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.hpp 228 2009-07-11 03:01:36Z hyunghwan.chung $ + * $Id: Awk.hpp 229 2009-07-12 13:06:01Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -55,6 +55,9 @@ public: typedef qse_awk_rio_cmd_t rio_cmd_t; + class Run; + friend class Run; + class Source { public: @@ -118,10 +121,10 @@ public: Source& operator= (const Source&); }; - class Run; - /** - * RIO class + * The RIOBase class is a base class to represent runtime I/O context. + * The Console, File, Pipe classes inherit this class to implement + * an actual I/O context. */ class RIOBase { @@ -219,74 +222,116 @@ public: char_t* filename; }; - class Argument; - class Return; - - friend class Run; - friend class Argument; - friend class Return; - class Value { public: - Value (): run (QSE_NULL), val (qse_awk_val_nil) {} - Value (Run& run): run (&run), val (qse_awk_val_nil) {} - Value (Run* run): run (run), val (qse_awk_val_nil) {} + // initialization + void* operator new (size_t n, Run* run) throw (); + void* operator new[] (size_t n, Run* run) throw (); + + #if !defined(__BORLANDC__) + // deletion when initialization fails + void operator delete (void* p, Run* run) throw (); + void operator delete[] (void* p, Run* run) throw (); + #endif + + // normal deletion + void operator delete (void* p) throw (); + void operator delete[] (void* p) throw (); + + Value (); + Value (Run& run); + Value (Run* run); Value (const Value& v); ~Value (); Value& operator= (const Value& v); + void clear (); + operator val_t* () const { return val; } operator long_t () const; operator real_t () const; operator const char_t* () const; - void clear (); + val_t* toVal () const + { + return operator val_t* (); + } - int get (long_t* v) const; - int get (real_t* v) const; - int get (const char_t** str, size_t* len) const; + long_t toInt () const + { + return operator long_t (); + } - int set (val_t* v); - int set (Run* r, val_t* v); + real_t toReal () const + { + return operator real_t (); + } - int set (long_t v); - int set (Run* r, long_t v); - int set (real_t v); - int set (Run* r, real_t v); - int set (const char_t* str, size_t len); - int set (Run* r, const char_t* str, size_t len); - int set (const char_t* str); - int set (Run* r, const char_t* str); + const char_t* toStr (size_t* len) const + { + const char_t* p; + size_t l; - int setIndexed (const char_t* idx, size_t isz, val_t* v); - int setIndexed (Run* r, const char_t* idx, size_t isz, val_t* v); + if (getStr (&p, &l) == -1) + { + p = EMPTY_STRING; + l = 0; + } + + if (len != QSE_NULL) *len = l; + return p; + } - int setIndexed (const char_t* idx, size_t isz, long_t v); - int setIndexed (Run* r, const char_t* idx, size_t isz, long_t v); - int setIndexed ( + int getInt (long_t* v) const; + int getReal (real_t* v) const; + int getStr (const char_t** str, size_t* len) const; + + int setVal (val_t* v); + int setVal (Run* r, val_t* v); + + int setInt (long_t v); + int setInt (Run* r, long_t v); + int setReal (real_t v); + int setReal (Run* r, real_t v); + int setStr (const char_t* str, size_t len); + int setStr (Run* r, const char_t* str, size_t len); + int setStr (const char_t* str); + int setStr (Run* r, const char_t* str); + + int setIndexedVal ( + const char_t* idx, size_t isz, val_t* v); + int setIndexedVal ( + Run* r, const char_t* idx, size_t isz, val_t* v); + + int setIndexedInt ( + const char_t* idx, size_t isz, long_t v); + int setIndexedInt ( + Run* r, const char_t* idx, size_t isz, long_t v); + + int setIndexedReal ( const char_t* idx, size_t isz, real_t v ); - int setIndexed ( + int setIndexedReal ( Run* r, const char_t* idx, size_t isz, real_t v ); - int setIndexed ( + int setIndexedStr ( const char_t* idx, size_t isz, const char_t* str, size_t len ); - int setIndexed ( + int setIndexedStr ( Run* r, const char_t* idx, size_t isz, @@ -294,6 +339,19 @@ public: size_t len ); + int setIndexedStr ( + const char_t* idx, + size_t isz, + const char_t* str + ); + + int setIndexedStr ( + Run* r, + const char_t* idx, + size_t isz, + const char_t* str + ); + bool isIndexed () const; int getIndexed ( @@ -305,111 +363,13 @@ public: protected: Run* run; val_t* val; - }; - /** - * Represents an argument to an intrinsic function - */ - class Argument - { - public: - friend class Awk; - friend class Run; + mutable struct + { + qse_xstr_t str; + } cached; - Argument (Run& run); - Argument (Run* run); - ~Argument (); - - protected: - Argument (); - void clear (); - - public: - // initialization - void* operator new (size_t n, awk_t* awk) throw (); - void* operator new[] (size_t n, awk_t* awk) throw (); - - #if !defined(__BORLANDC__) - // deletion when initialization fails - void operator delete (void* p, awk_t* awk); - void operator delete[] (void* p, awk_t* awk); - #endif - - // normal deletion - void operator delete (void* p); - void operator delete[] (void* p); - - private: - Argument (const Argument&); - Argument& operator= (const Argument&); - - protected: - int init (val_t* v); - int init (const char_t* str, size_t len); - - public: - long_t toInt () const; - real_t toReal () const; - const char_t* toStr (size_t* len) const; - - bool isIndexed () const; - - int getIndexed (const char_t* idxptr, Argument& val) const; - int getIndexed (const char_t* idxptr, size_t idxlen, Argument& val) const; - int getIndexed (long_t idx, Argument& val) const; - - int getFirstIndex (Argument& val) const; - int getNextIndex (Argument& val) const; - - protected: - Run* run; - val_t* val; - - qse_long_t inum; - qse_real_t rnum; - mutable qse_str_t str; - }; - - /** - * Represents a return value of an intrinsic function - */ - class Return - { - public: - friend class Awk; - friend class Run; - - Return (Run& run); - Return (Run* run); - ~Return (); - - private: - Return (const Return&); - Return& operator= (const Return&); - - protected: - 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); - - bool isIndexed () const; - - int setIndexed (const char_t* idx, size_t iln, long_t v); - int setIndexed (const char_t* idx, size_t iln, real_t v); - int setIndexed (const char_t* idx, size_t iln, const char_t* str, size_t sln); - int setIndexed (long_t idx, long_t v); - int setIndexed (long_t idx, real_t v); - int setIndexed (long_t idx, const char_t* str, size_t sln); - - void clear (); - - protected: - Run* run; - val_t* val; + static const char_t* EMPTY_STRING; }; // generated by generrcode.awk @@ -608,9 +568,7 @@ public: { protected: friend class Awk; - friend class Argument; - friend class Return; - friend class RIO; + friend class Value; Run (Awk* awk); Run (Awk* awk, rtx_t* run); @@ -702,7 +660,7 @@ public: * On success, 0 is returned. * On failure, -1 is returned. */ - int setGlobal (int id, const Return& global); + int setGlobal (int id, const Value& global); /** * Gets the value of a global variable. @@ -720,7 +678,7 @@ public: * On success, 0 is returned. * On failure, -1 is returned. */ - int getGlobal (int id, Argument& global) const; + int getGlobal (int id, Value& global) const; void* alloc (size_t size); void free (void* ptr); @@ -847,8 +805,9 @@ public: */ virtual int call ( const char_t* name, - const Return* args, - size_t nargs + Value* ret, + const Value* args, + size_t nargs ); /** @@ -887,7 +846,7 @@ public: * Represents a user-defined intrinsic function. */ typedef int (Awk::*FunctionHandler) ( - Run& run, Return& ret, const Argument* args, size_t nargs, + Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); /** @@ -953,7 +912,7 @@ protected: // run-time callbacks virtual bool onLoopEnter (Run& run); - virtual void onLoopExit (Run& run, const Argument& ret); + virtual void onLoopExit (Run& run, const Value& ret); virtual void onStatement (Run& run, size_t line); // primitive handlers diff --git a/qse/include/qse/awk/StdAwk.hpp b/qse/include/qse/awk/StdAwk.hpp index 04f0a4f3..c6fa99ed 100644 --- a/qse/include/qse/awk/StdAwk.hpp +++ b/qse/include/qse/awk/StdAwk.hpp @@ -1,5 +1,5 @@ /* - * $Id: StdAwk.hpp 226 2009-07-09 12:46:14Z hyunghwan.chung $ + * $Id: StdAwk.hpp 229 2009-07-12 13:06:01Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -78,29 +78,29 @@ public: protected: // intrinsic functions - int sin (Run& run, Return& ret, const Argument* args, size_t nargs, + int sin (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int cos (Run& run, Return& ret, const Argument* args, size_t nargs, + int cos (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int tan (Run& run, Return& ret, const Argument* args, size_t nargs, + int tan (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int atan (Run& run, Return& ret, const Argument* args, size_t nargs, + int atan (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int atan2 (Run& run, Return& ret, const Argument* args, size_t nargs, + int atan2 (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int log (Run& run, Return& ret, const Argument* args, size_t nargs, + int log (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int exp (Run& run, Return& ret, const Argument* args, size_t nargs, + int exp (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int sqrt (Run& run, Return& ret, const Argument* args, size_t nargs, + int sqrt (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int fnint (Run& run, Return& ret, const Argument* args, size_t nargs, + int fnint (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int rand (Run& run, Return& ret, const Argument* args, size_t nargs, + int rand (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int srand (Run& run, Return& ret, const Argument* args, size_t nargs, + int srand (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); - int system (Run& run, Return& ret, const Argument* args, size_t nargs, + int system (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len); // pipe io handlers diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index cb4f29e0..8610a27e 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp 228 2009-07-11 03:01:36Z hyunghwan.chung $ + * $Id: Awk.cpp 229 2009-07-12 13:06:01Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -169,22 +169,101 @@ Awk::Console::Mode Awk::Console::getMode () const // Awk::Value ////////////////////////////////////////////////////////////////// +const Awk::char_t* Awk::Value::EMPTY_STRING = QSE_T(""); + +void* Awk::Value::operator new (size_t n, Run* run) throw () +{ + void* ptr = qse_awk_rtx_alloc (run->rtx, QSE_SIZEOF(run) + n); + if (ptr == QSE_NULL) return QSE_NULL; + + *(Run**)ptr = run; + return (char*)ptr+QSE_SIZEOF(run); +} + +void* Awk::Value::operator new[] (size_t n, Run* run) throw () +{ + void* ptr = qse_awk_rtx_alloc (run->rtx, QSE_SIZEOF(run) + n); + if (ptr == QSE_NULL) return QSE_NULL; + + *(Run**)ptr = run; + return (char*)ptr+QSE_SIZEOF(run); +} + +#if !defined(__BORLANDC__) +void Awk::Value::operator delete (void* ptr, Run* run) throw () +{ + qse_awk_rtx_free (run->rtx, (char*)ptr-QSE_SIZEOF(run)); +} + +void Awk::Value::operator delete[] (void* ptr, Run* run) throw () +{ + qse_awk_rtx_free (run->rtx, (char*)ptr-QSE_SIZEOF(run)); +} +#endif + +void Awk::Value::operator delete (void* ptr) throw () +{ + void* p = (char*)ptr-QSE_SIZEOF(Run*); + qse_awk_rtx_free ((*(Run**)p)->rtx, p); +} + +void Awk::Value::operator delete[] (void* ptr) throw () +{ + void* p = (char*)ptr-QSE_SIZEOF(Run*); + qse_awk_rtx_free ((*(Run**)p)->rtx, p); +} + +Awk::Value::Value (): run (QSE_NULL), val (qse_awk_val_nil) +{ + cached.str.ptr = QSE_NULL; + cached.str.len = 0; +} + +Awk::Value::Value (Run& run): run (&run), val (qse_awk_val_nil) +{ + cached.str.ptr = QSE_NULL; + cached.str.len = 0; +} + +Awk::Value::Value (Run* run): run (run), val (qse_awk_val_nil) +{ + cached.str.ptr = QSE_NULL; + cached.str.len = 0; +} + Awk::Value::Value (const Value& v): run (v.run), val (v.val) { if (run != QSE_NULL) qse_awk_rtx_refupval (run->rtx, val); + + cached.str.ptr = QSE_NULL; + cached.str.len = 0; } Awk::Value::~Value () { if (run != QSE_NULL) + { qse_awk_rtx_refdownval (run->rtx, val); + if (cached.str.ptr != QSE_NULL) + qse_awk_rtx_free (run->rtx, cached.str.ptr); + } } Awk::Value& Awk::Value::operator= (const Value& v) { + if (this == &v) return *this; + if (run != QSE_NULL) + { qse_awk_rtx_refdownval (run->rtx, val); + if (cached.str.ptr != QSE_NULL) + { + qse_awk_rtx_free (run->rtx, cached.str.ptr); + cached.str.ptr = QSE_NULL; + cached.str.len = 0; + } + } run = v.run; val = v.val; @@ -201,6 +280,13 @@ void Awk::Value::clear () { qse_awk_rtx_refdownval (run->rtx, val); + if (cached.str.ptr != QSE_NULL) + { + qse_awk_rtx_free (run->rtx, cached.str.ptr); + cached.str.ptr = QSE_NULL; + cached.str.len = 0; + } + run = QSE_NULL; val = qse_awk_val_nil; } @@ -209,14 +295,14 @@ void Awk::Value::clear () Awk::Value::operator Awk::long_t () const { long_t v; - if (get (&v) <= -1) v = 0; + if (getInt (&v) <= -1) v = 0; return v; } Awk::Value::operator Awk::real_t () const { real_t v; - if (get (&v) <= -1) v = 0.0; + if (getReal (&v) <= -1) v = 0.0; return v; } @@ -224,15 +310,19 @@ Awk::Value::operator const Awk::char_t* () const { const char_t* ptr; size_t len; - if (get (&ptr, &len) <= -1) ptr = QSE_T(""); + if (getStr (&ptr, &len) <= -1) ptr = QSE_T(""); return ptr; } -int Awk::Value::get (long_t* v) const +int Awk::Value::getInt (long_t* v) const { long_t lv = 0; - if (run != QSE_NULL) + QSE_ASSERT (val != QSE_NULL); + + if (run != QSE_NULL && + val->type != QSE_AWK_VAL_NIL && + val->type != QSE_AWK_VAL_MAP) { real_t rv; int n = qse_awk_rtx_valtonum (run->rtx, val, &lv, &rv); @@ -244,11 +334,15 @@ int Awk::Value::get (long_t* v) const return 0; } -int Awk::Value::get (real_t* v) const +int Awk::Value::getReal (real_t* v) const { real_t rv = 0; - if (run != QSE_NULL) + QSE_ASSERT (val != QSE_NULL); + + if (run != QSE_NULL && + val->type != QSE_AWK_VAL_NIL && + val->type != QSE_AWK_VAL_MAP) { long_t lv; int n = qse_awk_rtx_valtonum (run->rtx, val, &lv, &rv); @@ -260,37 +354,74 @@ int Awk::Value::get (real_t* v) const return 0; } -int Awk::Value::get (const char_t** str, size_t* len) const +int Awk::Value::getStr (const char_t** str, size_t* len) const { -#if 0 -if v is a string, return the pointer and the length. -otherwise call valtostr.... how can i handle free then??? + const char_t* p = EMPTY_STRING; + size_t l = 0; - real_t rv = 0; + QSE_ASSERT (val != QSE_NULL); - if (run != QSE_NULL) + if (run != QSE_NULL && + val->type != QSE_AWK_VAL_NIL && + val->type != QSE_AWK_VAL_MAP) { - long_t lv; - int n = qse_awk_rtx_valtostr (run->rtx, val, &lv, &rv); - if (n <= -1) return -1; - if (n == 0) rv = lv; + if (val->type == QSE_AWK_VAL_STR) + { + p = ((qse_awk_val_str_t*)val)->ptr; + l = ((qse_awk_val_str_t*)val)->len; + } + else + { + if (cached.str.ptr == QSE_NULL) + { + qse_awk_rtx_valtostr_out_t out; + out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; + if (qse_awk_rtx_valtostr ( + run->rtx, val, &out) == QSE_NULL) + { + return -1; + } + + p = out.u.cpldup.ptr; + l = out.u.cpldup.len; + + cached.str.ptr = out.u.cpldup.ptr; + cached.str.len = out.u.cpldup.len; + } + else + { + p = cached.str.ptr; + l = cached.str.len; + } + } } - *v = rv; + *str = p; + *len = l; + return 0; -#endif } -int Awk::Value::set (val_t* v) +int Awk::Value::setVal (val_t* v) { if (run == QSE_NULL) return -1; - return set (run, v); + return setVal (run, v); } -int Awk::Value::set (Run* r, val_t* v) +int Awk::Value::setVal (Run* r, val_t* v) { if (run != QSE_NULL) + { qse_awk_rtx_refdownval (run->rtx, val); + if (cached.str.ptr != QSE_NULL) + { + qse_awk_rtx_free (run->rtx, cached.str.ptr); + cached.str.ptr = QSE_NULL; + cached.str.len = 0; + } + } + + QSE_ASSERT (cached.str.ptr == QSE_NULL); qse_awk_rtx_refupval (r->rtx, v); run = r; @@ -299,81 +430,81 @@ int Awk::Value::set (Run* r, val_t* v) return 0; } -int Awk::Value::set (long_t v) +int Awk::Value::setInt (long_t v) { if (run == QSE_NULL) return -1; - return set (run, v); + return setInt (run, v); } -int Awk::Value::set (Run* r, long_t v) +int Awk::Value::setInt (Run* r, long_t v) { val_t* tmp; tmp = qse_awk_rtx_makeintval (r->rtx, v); if (tmp == QSE_NULL) return -1; - int n = set (r, tmp); + int n = setVal (r, tmp); QSE_ASSERT (n == 0); return n; } -int Awk::Value::set (real_t v) +int Awk::Value::setReal (real_t v) { if (run == QSE_NULL) return -1; - return set (run, v); + return setReal (run, v); } -int Awk::Value::set (Run* r, real_t v) +int Awk::Value::setReal (Run* r, real_t v) { val_t* tmp; tmp = qse_awk_rtx_makerealval (r->rtx, v); if (tmp == QSE_NULL) return -1; - int n = set (r, tmp); + int n = setVal (r, tmp); QSE_ASSERT (n == 0); return n; } -int Awk::Value::set (const char_t* str, size_t len) +int Awk::Value::setStr (const char_t* str, size_t len) { if (run == QSE_NULL) return -1; - return set (run, str, len); + return setStr (run, str, len); } -int Awk::Value::set (Run* r, const char_t* str, size_t len) +int Awk::Value::setStr (Run* r, const char_t* str, size_t len) { val_t* tmp; tmp = qse_awk_rtx_makestrval (r->rtx, str, len); if (tmp == QSE_NULL) return -1; - int n = set (r, tmp); + int n = setVal (r, tmp); QSE_ASSERT (n == 0); return n; } -int Awk::Value::set (const char_t* str) +int Awk::Value::setStr (const char_t* str) { if (run == QSE_NULL) return -1; - return set (run, str); + return setStr (run, str); } -int Awk::Value::set (Run* r, const char_t* str) +int Awk::Value::setStr (Run* r, const char_t* str) { val_t* tmp; tmp = qse_awk_rtx_makestrval0 (r->rtx, str); if (tmp == QSE_NULL) return -1; - int n = set (r, tmp); + int n = setVal (r, tmp); QSE_ASSERT (n == 0); return n; } -int Awk::Value::setIndexed (const char_t* idx, size_t isz, val_t* v) +int Awk::Value::setIndexedVal (const char_t* idx, size_t isz, val_t* v) { if (run == QSE_NULL) return -1; - return setIndexed (run, idx, isz, v); + return setIndexedVal (run, idx, isz, v); } -int Awk::Value::setIndexed (Run* r, const char_t* idx, size_t isz, val_t* v) +int Awk::Value::setIndexedVal (Run* r, const char_t* idx, size_t isz, val_t* v) { if (val->type != QSE_AWK_VAL_MAP) { @@ -433,63 +564,85 @@ int Awk::Value::setIndexed (Run* r, const char_t* idx, size_t isz, val_t* v) return 0; } -int Awk::Value::setIndexed (const char_t* idx, size_t isz, long_t v) +int Awk::Value::setIndexedInt (const char_t* idx, size_t isz, long_t v) { if (run == QSE_NULL) return -1; - return setIndexed (run, idx, isz, v); + return setIndexedInt (run, idx, isz, v); } -int Awk::Value::setIndexed (Run* r, const char_t* idx, size_t isz, long_t v) +int Awk::Value::setIndexedInt (Run* r, const char_t* idx, size_t isz, long_t v) { val_t* tmp; tmp = qse_awk_rtx_makeintval (r->rtx, v); if (tmp == QSE_NULL) return -1; qse_awk_rtx_refupval (r->rtx, tmp); - int n = setIndexed (r, idx, isz, tmp); + int n = setIndexedVal (r, idx, isz, tmp); qse_awk_rtx_refdownval (r->rtx, tmp); return n; } -int Awk::Value::setIndexed (const char_t* idx, size_t isz, real_t v) +int Awk::Value::setIndexedReal (const char_t* idx, size_t isz, real_t v) { if (run == QSE_NULL) return -1; - return setIndexed (run, idx, isz, v); + return setIndexedReal (run, idx, isz, v); } -int Awk::Value::setIndexed (Run* r, const char_t* idx, size_t isz, real_t v) +int Awk::Value::setIndexedReal (Run* r, const char_t* idx, size_t isz, real_t v) { val_t* tmp; tmp = qse_awk_rtx_makerealval (r->rtx, v); if (tmp == QSE_NULL) return -1; qse_awk_rtx_refupval (r->rtx, tmp); - int n = setIndexed (r, idx, isz, tmp); + int n = setIndexedVal (r, idx, isz, tmp); qse_awk_rtx_refdownval (r->rtx, tmp); return n; } -int Awk::Value::setIndexed (const char_t* idx, size_t isz, const char_t* str, size_t len) +int Awk::Value::setIndexedStr (const char_t* idx, size_t isz, const char_t* str, size_t len) { if (run == QSE_NULL) return -1; - return setIndexed (run, idx, isz, str, len); + return setIndexedStr (run, idx, isz, str, len); } -int Awk::Value::setIndexed (Run* r, const char_t* idx, size_t isz, const char_t* str, size_t len) +int Awk::Value::setIndexedStr ( + Run* r, const char_t* idx, size_t isz, const char_t* str, size_t len) { val_t* tmp; tmp = qse_awk_rtx_makestrval (r->rtx, str, len); if (tmp == QSE_NULL) return -1; qse_awk_rtx_refupval (r->rtx, tmp); - int n = setIndexed (r, idx, isz, tmp); + int n = setIndexedVal (r, idx, isz, tmp); qse_awk_rtx_refdownval (r->rtx, tmp); return n; } +int Awk::Value::setIndexedStr (const char_t* idx, size_t isz, const char_t* str) +{ + if (run == QSE_NULL) return -1; + return setIndexedStr (run, idx, isz, str); +} + +int Awk::Value::setIndexedStr ( + Run* r, const char_t* idx, size_t isz, const char_t* str) +{ + val_t* tmp; + tmp = qse_awk_rtx_makestrval0 (r->rtx, str); + if (tmp == QSE_NULL) return -1; + + qse_awk_rtx_refupval (r->rtx, tmp); + int n = setIndexedVal (r, idx, isz, tmp); + qse_awk_rtx_refdownval (r->rtx, tmp); + + return n; +} + + bool Awk::Value::isIndexed () const { QSE_ASSERT (val != QSE_NULL); @@ -519,334 +672,10 @@ int Awk::Value::getIndexed (const char_t* idx, size_t isz, Value& v) const } // if v.set fails, it should return an error - return v.set (run, (val_t*)QSE_MAP_VPTR(pair)); -} - -////////////////////////////////////////////////////////////////// -// Awk::Argument -////////////////////////////////////////////////////////////////// - -Awk::Argument::Argument (Run& run): run (&run), val (QSE_NULL) -{ - this->inum = 0; - this->rnum = 0.0; - - this->str.ptr = QSE_NULL; - this->str.len = 0; -} - -Awk::Argument::Argument (Run* run): run (run), val (QSE_NULL) -{ - this->inum = 0; - this->rnum = 0.0; - - this->str.ptr = QSE_NULL; - this->str.len = 0; -} - -Awk::Argument::Argument (): run (QSE_NULL), val (QSE_NULL) -{ - this->inum = 0; - this->rnum = 0.0; - - this->str.ptr = QSE_NULL; - this->str.len = 0; -} - -Awk::Argument::~Argument () -{ - clear (); -} - -void Awk::Argument::clear () -{ - if (this->val == QSE_NULL) - { - /* case 1. not initialized. - * case 2. initialized with the second init. - * none of the cases. create a new string so the sttring - * that str.ptr is pointing to doesn't have to be freed */ - this->str.ptr = QSE_NULL; - this->str.len = 0; - } - else if (this->val->type == QSE_AWK_VAL_MAP) - { - QSE_ASSERT (this->run != QSE_NULL); - - /* when the value is a map, str.ptr and str.len are - * used for index iteration in getFirstIndex & getNextIndex */ - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = QSE_NULL; - } - else - { - QSE_ASSERT (this->run != QSE_NULL); - - if (this->str.ptr != QSE_NULL) - { - if (this->val->type != QSE_AWK_VAL_STR) - { - awk_t* awk = this->run->awk->awk; - qse_awk_free (awk, this->str.ptr); - } - - this->str.ptr = QSE_NULL; - this->str.len = 0; - } - - if (this->val != QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = QSE_NULL; - } - - } - - this->rnum = 0.0; - this->inum = 0; -} - -void* Awk::Argument::operator new (size_t n, awk_t* awk) throw () -{ - void* ptr = qse_awk_alloc (awk, QSE_SIZEOF(awk) + n); - if (ptr == QSE_NULL) return QSE_NULL; - - *(awk_t**)ptr = awk; - return (char*)ptr+QSE_SIZEOF(awk); -} - -void* Awk::Argument::operator new[] (size_t n, awk_t* awk) throw () -{ - void* ptr = qse_awk_alloc (awk, QSE_SIZEOF(awk) + n); - if (ptr == QSE_NULL) return QSE_NULL; - - *(awk_t**)ptr = awk; - return (char*)ptr+QSE_SIZEOF(awk); -} - -#if !defined(__BORLANDC__) -void Awk::Argument::operator delete (void* ptr, awk_t* awk) -{ - qse_awk_free (awk, (char*)ptr-QSE_SIZEOF(awk)); -} - -void Awk::Argument::operator delete[] (void* ptr, awk_t* awk) -{ - qse_awk_free (awk, (char*)ptr-QSE_SIZEOF(awk)); -} -#endif - -void Awk::Argument::operator delete (void* ptr) -{ - void* p = (char*)ptr-QSE_SIZEOF(awk_t*); - qse_awk_free (*(awk_t**)p, p); -} - -void Awk::Argument::operator delete[] (void* ptr) -{ - void* p = (char*)ptr-QSE_SIZEOF(awk_t*); - qse_awk_free (*(awk_t**)p, p); -} - -int Awk::Argument::init (val_t* v) -{ - // this method is used internally only - // and should never be called more than once - QSE_ASSERT (this->val == QSE_NULL); - QSE_ASSERT (v != QSE_NULL); - - qse_awk_rtx_refupval (this->run->rtx, v); - this->val = v; - - if (v->type == QSE_AWK_VAL_STR) - { - int n = qse_awk_rtx_valtonum ( - this->run->rtx, v, &this->inum, &this->rnum); - if (n == 0) - { - this->rnum = (qse_real_t)this->inum; - this->str.ptr = ((qse_awk_val_str_t*)this->val)->ptr; - this->str.len = ((qse_awk_val_str_t*)this->val)->len; - return 0; - } - else if (n == 1) - { - this->inum = (qse_long_t)this->rnum; - this->str.ptr = ((qse_awk_val_str_t*)this->val)->ptr; - this->str.len = ((qse_awk_val_str_t*)this->val)->len; - return 0; - } - } - else if (v->type == QSE_AWK_VAL_INT) - { - this->inum = ((qse_awk_val_int_t*)v)->val; - this->rnum = (qse_real_t)((qse_awk_val_int_t*)v)->val; - - this->str.ptr = qse_awk_rtx_valtocpldup ( - this->run->rtx, v, &this->str.len); - if (this->str.ptr != QSE_NULL) return 0; - } - else if (v->type == QSE_AWK_VAL_REAL) - { - this->inum = (qse_long_t)((qse_awk_val_real_t*)v)->val; - this->rnum = ((qse_awk_val_real_t*)v)->val; - - this->str.ptr = qse_awk_rtx_valtocpldup ( - this->run->rtx, v, &this->str.len); - if (this->str.ptr != QSE_NULL) return 0; - } - else if (v->type == QSE_AWK_VAL_NIL) - { - this->inum = 0; - this->rnum = 0.0; - - this->str.ptr = qse_awk_rtx_valtocpldup ( - this->run->rtx, v, &this->str.len); - if (this->str.ptr != QSE_NULL) return 0; - } - else if (v->type == QSE_AWK_VAL_MAP) - { - this->inum = 0; - this->rnum = 0.0; - this->str.ptr = QSE_NULL; - this->str.len = 0; - return 0; - } - - // an error has occurred - qse_awk_rtx_refdownval (this->run->rtx, v); - this->val = QSE_NULL; - return -1; -} - -int Awk::Argument::init (const char_t* str, size_t len) -{ - QSE_ASSERT (this->val == QSE_NULL); - - this->str.ptr = (char_t*)str; - this->str.len = len; - - if (qse_awk_rtx_strtonum ( - this->run->rtx, 0, - str, len, &this->inum, &this->rnum) == 0) - { - this->rnum = (real_t)this->inum; - } - else - { - this->inum = (long_t)this->rnum; - } - - return 0; -} - -Awk::long_t Awk::Argument::toInt () const -{ - return this->inum; -} - -Awk::real_t Awk::Argument::toReal () const -{ - return this->rnum; -} - -const Awk::char_t* Awk::Argument::toStr (size_t* len) const -{ - - if (this->val != QSE_NULL && - this->val->type == QSE_AWK_VAL_MAP) - { - *len = 0; - return QSE_T(""); - } - else if (this->str.ptr == QSE_NULL) - { - *len = 0; - return QSE_T(""); - } - else - { - *len = this->str.len; - return this->str.ptr; - } -} - -bool Awk::Argument::isIndexed () const -{ - if (this->val == QSE_NULL) return false; - return this->val->type == QSE_AWK_VAL_MAP; -} - -int Awk::Argument::getIndexed (const char_t* idxptr, Awk::Argument& val) const -{ - return getIndexed (idxptr, qse_strlen(idxptr), val); -} - -int Awk::Argument::getIndexed ( - const char_t* idxptr, size_t idxlen, Awk::Argument& val) const -{ - val.clear (); - - // not initialized yet. val is just nil. not an error - if (this->val == QSE_NULL) return 0; - // not a map. val is just nil. not an error - if (this->val->type != QSE_AWK_VAL_MAP) return 0; - - // get the value from the map. - qse_awk_val_map_t* m = (qse_awk_val_map_t*)this->val; - pair_t* pair = qse_map_search (m->map, idxptr, idxlen); - - // the key is not found. it is not an error. val is just nil - if (pair == QSE_NULL) return 0; - - // if val.init fails, it should return an error - return val.init ((val_t*)QSE_MAP_VPTR(pair)); -} - -int Awk::Argument::getIndexed (long_t idx, Argument& val) const -{ - val.clear (); - - // not initialized yet. val is just nil. not an error - if (this->val == QSE_NULL) return 0; - - // not a map. val is just nil. not an error - if (this->val->type != QSE_AWK_VAL_MAP) return 0; - - char_t ri[128]; - - int rl = Awk::sprintf ( - (awk_t*)this->run->awk, ri, QSE_COUNTOF(ri), - #if QSE_SIZEOF_LONG_LONG > 0 - QSE_T("%lld"), (long long)idx - #elif QSE_SIZEOF___INT64 > 0 - QSE_T("%I64d"), (__int64)idx - #elif QSE_SIZEOF_LONG > 0 - QSE_T("%ld"), (long)idx - #elif QSE_SIZEOF_INT > 0 - QSE_T("%d"), (int)idx - #else - #error unsupported size - #endif - ); - - if (rl < 0) - { - run->setError (ERR_INTERN, 0, QSE_NULL, 0); - return -1; - } - - // get the value from the map. - qse_awk_val_map_t* m = (qse_awk_val_map_t*)this->val; - pair_t* pair = qse_map_search (m->map, ri, rl); - - // the key is not found. it is not an error. val is just nil - if (pair == QSE_NULL) return 0; - - // if val.init fails, it should return an error - return val.init ((val_t*)QSE_MAP_VPTR(pair)); + return v.setVal (run, (val_t*)QSE_MAP_VPTR(pair)); } +#if 0 int Awk::Argument::getFirstIndex (Awk::Argument& val) const { val.clear (); @@ -895,299 +724,6 @@ int Awk::Argument::getNextIndex (Awk::Argument& val) const return 1; } -////////////////////////////////////////////////////////////////// -// Awk::Return -////////////////////////////////////////////////////////////////// - -Awk::Return::Return (Run& run): run(&run), val(qse_awk_val_nil) -{ -} - -Awk::Return::Return (Run* run): run(run), val(qse_awk_val_nil) -{ -} - -Awk::Return::~Return () -{ - clear (); -} - -Awk::val_t* Awk::Return::toVal () const -{ - return this->val; -} - -Awk::Return::operator Awk::val_t* () const -{ - return this->val; -} - -int Awk::Return::set (long_t v) -{ - if (this->run == QSE_NULL) return -1; - - val_t* x = qse_awk_rtx_makeintval (this->run->rtx, v); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - qse_awk_rtx_refupval (this->run->rtx, this->val); - - return 0; -} - -int Awk::Return::set (real_t v) -{ - if (this->run == QSE_NULL) return -1; - - val_t* x = qse_awk_rtx_makerealval (this->run->rtx, v); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - qse_awk_rtx_refupval (this->run->rtx, this->val); - - return 0; -} - -int Awk::Return::set (const char_t* ptr, size_t len) -{ - if (this->run == QSE_NULL) return -1; - - val_t* x = qse_awk_rtx_makestrval (this->run->rtx, ptr, len); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - qse_awk_rtx_refupval (this->run->rtx, this->val); - return 0; -} - -bool Awk::Return::isIndexed () const -{ - if (this->val == QSE_NULL) return false; - return this->val->type == QSE_AWK_VAL_MAP; -} - -int Awk::Return::setIndexed (const char_t* idx, size_t iln, long_t v) -{ - if (this->run == QSE_NULL) return -1; - - int opt = this->run->awk->getOption(); - if ((opt & OPT_MAPTOVAR) == 0) - { - /* refer to run_return in run.c */ - this->run->setError (ERR_MAPNOTALLOWED, 0, QSE_NULL, 0); - return -1; - } - - if (this->val->type != QSE_AWK_VAL_MAP) - { - val_t* x = qse_awk_rtx_makemapval (this->run->rtx); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x); - - val_t* x2 = qse_awk_rtx_makeintval (this->run->rtx, v); - if (x2 == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x); - return -1; - } - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)x)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - qse_awk_rtx_refdownval (this->run->rtx, x); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - } - else - { - val_t* x2 = qse_awk_rtx_makeintval (this->run->rtx, v); - if (x2 == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)this->val)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - } - - return 0; -} - -int Awk::Return::setIndexed (const char_t* idx, size_t iln, real_t v) -{ - if (this->run == QSE_NULL) return -1; - - int opt = this->run->awk->getOption(); - if ((opt & OPT_MAPTOVAR) == 0) - { - /* refer to run_return in run.c */ - this->run->setError (ERR_MAPNOTALLOWED, 0, QSE_NULL, 0); - return -1; - } - - if (this->val->type != QSE_AWK_VAL_MAP) - { - val_t* x = qse_awk_rtx_makemapval (this->run->rtx); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x); - - val_t* x2 = qse_awk_rtx_makerealval (this->run->rtx, v); - if (x2 == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x); - return -1; - } - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)x)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - qse_awk_rtx_refdownval (this->run->rtx, x); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - } - else - { - val_t* x2 = qse_awk_rtx_makerealval (this->run->rtx, v); - if (x2 == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)this->val)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - } - - return 0; -} - -int Awk::Return::setIndexed (const char_t* idx, size_t iln, const char_t* str, size_t sln) -{ - if (this->run == QSE_NULL) return -1; - - int opt = this->run->awk->getOption(); - if ((opt & OPT_MAPTOVAR) == 0) - { - /* refer to run_return in run.c */ - this->run->setError (ERR_MAPNOTALLOWED, 0, QSE_NULL, 0); - return -1; - } - - if (this->val->type != QSE_AWK_VAL_MAP) - { - val_t* x = qse_awk_rtx_makemapval (this->run->rtx); - if (x == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x); - - val_t* x2 = qse_awk_rtx_makestrval (this->run->rtx, str, sln); - if (x2 == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x); - return -1; - } - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)x)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - qse_awk_rtx_refdownval (this->run->rtx, x); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = x; - } - else - { - val_t* x2 = qse_awk_rtx_makestrval (this->run->rtx, str, sln); - if (x2 == QSE_NULL) return -1; - - qse_awk_rtx_refupval (this->run->rtx, x2); - - pair_t* pair = qse_map_upsert ( - ((qse_awk_val_map_t*)this->val)->map, - (char_t*)idx, iln, x2, 0); - if (pair == QSE_NULL) - { - qse_awk_rtx_refdownval (this->run->rtx, x2); - this->run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; - } - } - - return 0; -} - -int Awk::Return::setIndexed (long_t idx, long_t v) -{ - if (this->run == QSE_NULL) return -1; - - char_t ri[128]; - - int rl = Awk::sprintf ( - (awk_t*)this->run->awk, ri, QSE_COUNTOF(ri), - #if QSE_SIZEOF_LONG_LONG > 0 - QSE_T("%lld"), (long long)idx - #elif QSE_SIZEOF___INT64 > 0 - QSE_T("%I64d"), (__int64)idx - #elif QSE_SIZEOF_LONG > 0 - QSE_T("%ld"), (long)idx - #elif QSE_SIZEOF_INT > 0 - QSE_T("%d"), (int)idx - #else - #error unsupported size - #endif - ); - - if (rl < 0) - { - this->run->setError (ERR_INTERN, 0, QSE_NULL, 0); - return -1; - } - - return setIndexed (ri, rl, v); -} - int Awk::Return::setIndexed (long_t idx, real_t v) { if (this->run == QSE_NULL) return -1; @@ -1217,42 +753,7 @@ int Awk::Return::setIndexed (long_t idx, real_t v) return setIndexed (ri, rl, v); } - -int Awk::Return::setIndexed (long_t idx, const char_t* str, size_t sln) -{ - if (this->run == QSE_NULL) return -1; - - char_t ri[128]; - - int rl = Awk::sprintf ( - (awk_t*)this->run->awk, ri, QSE_COUNTOF(ri), - #if QSE_SIZEOF_LONG_LONG > 0 - QSE_T("%lld"), (long long)idx - #elif QSE_SIZEOF___INT64 > 0 - QSE_T("%I64d"), (__int64)idx - #elif QSE_SIZEOF_LONG > 0 - QSE_T("%ld"), (long)idx - #elif QSE_SIZEOF_INT > 0 - QSE_T("%d"), (int)idx - #else - #error unsupported size - #endif - ); - - if (rl < 0) - { - this->run->setError (ERR_INTERN, 0, QSE_NULL, 0); - return -1; - } - - return setIndexed (ri, rl, str, sln); -} - -void Awk::Return::clear () -{ - qse_awk_rtx_refdownval (this->run->rtx, this->val); - this->val = qse_awk_val_nil; -} +#endif ////////////////////////////////////////////////////////////////// // Awk::Run @@ -1391,19 +892,17 @@ int Awk::Run::setGlobal (int id, const char_t* ptr, size_t len) return n; } -int Awk::Run::setGlobal (int id, const Return& gbl) +int Awk::Run::setGlobal (int id, const Value& gbl) { QSE_ASSERT (this->rtx != QSE_NULL); - return qse_awk_rtx_setgbl (this->rtx, id, gbl.toVal()); + return qse_awk_rtx_setgbl (this->rtx, id, (val_t*)gbl); } -int Awk::Run::getGlobal (int id, Argument& gbl) const +int Awk::Run::getGlobal (int id, Value& g) const { QSE_ASSERT (this->rtx != QSE_NULL); - - gbl.clear (); - return gbl.init (qse_awk_rtx_getgbl (this->rtx, id)); + return g.setVal ((Run*)this, qse_awk_rtx_getgbl (this->rtx, id)); } ////////////////////////////////////////////////////////////////// @@ -1753,37 +1252,44 @@ int Awk::loop () return n; } -int Awk::call (const char_t* name, const Return* args, size_t nargs) +int Awk::call (const char_t* name, Value* ret, const Value* args, size_t nargs) { QSE_ASSERT (awk != QSE_NULL); QSE_ASSERT (runctx.rtx != QSE_NULL); + val_t* buf[16]; val_t** ptr = QSE_NULL; if (args != QSE_NULL) { - ptr = (val_t**) qse_awk_alloc (awk, QSE_SIZEOF(val_t*) * nargs); - if (ptr == QSE_NULL) + if (nargs <= QSE_COUNTOF(buf)) ptr = buf; + else { - runctx.setError (ERR_NOMEM); - return -1; + ptr = (val_t**) qse_awk_alloc ( + awk, QSE_SIZEOF(val_t*) * nargs); + if (ptr == QSE_NULL) + { + runctx.setError (ERR_NOMEM); + return -1; + } } - for (size_t i = 0; i < nargs; i++) ptr[i] = args[i].val; + for (size_t i = 0; i < nargs; i++) ptr[i] = (val_t*)args[i]; } - val_t* ret = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs); + val_t* rv = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs); - if (ptr != QSE_NULL) qse_awk_free (awk, ptr); + if (ptr != QSE_NULL && ptr != buf) qse_awk_free (awk, ptr); - if (ret == QSE_NULL) + if (rv == QSE_NULL) { retrieveError (runctx.rtx); return -1; } -// TODO: how can i store it??? - qse_awk_rtx_refdownval (runctx.rtx, ret); + ret->setVal (&runctx, rv); + + qse_awk_rtx_refdownval (runctx.rtx, rv); return 0; } @@ -1796,7 +1302,6 @@ void Awk::stop () int Awk::dispatchFunction (Run* run, const char_t* name, size_t len) { pair_t* pair; - awk_t* awk = run->awk->awk; pair = qse_map_search (functionMap, name, len); if (pair == QSE_NULL) @@ -1810,34 +1315,35 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len) size_t i, nargs = qse_awk_rtx_getnargs(run->rtx); - //Argument* args = QSE_NULL; - //try { args = new Argument [nargs]; } catch (...) {} - Argument* args = new(awk) Argument[nargs]; - if (args == QSE_NULL) + Value buf[16]; + Value* args; + if (nargs <= QSE_COUNTOF(buf)) args = buf; + else { - run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - return -1; + args = new(run) Value[nargs]; + if (args == QSE_NULL) + { + run->setError (ERR_NOMEM, 0, QSE_NULL, 0); + return -1; + } } for (i = 0; i < nargs; i++) { - args[i].run = run; // dirty late initialization - // due to c++ array creation limitation. - val_t* v = qse_awk_rtx_getarg (run->rtx, i); - if (args[i].init (v) == -1) + if (args[i].setVal (run, v) == -1) { run->setError (ERR_NOMEM, 0, QSE_NULL, 0); - delete[] args; + if (args != buf) delete[] args; return -1; } } - Return ret (run); + Value ret (run); int n = (this->*handler) (*run, ret, args, nargs, name, len); - delete[] args; + if (args != buf) delete[] args; if (n <= -1) { @@ -1846,7 +1352,7 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len) return -1; } - qse_awk_rtx_setretval (run->rtx, ret); + qse_awk_rtx_setretval (run->rtx, ret.toVal()); return 0; } @@ -1996,7 +1502,7 @@ bool Awk::onLoopEnter (Run& run) return true; } -void Awk::onLoopExit (Run& run, const Argument& ret) +void Awk::onLoopExit (Run& run, const Value& ret) { } @@ -2160,8 +1666,8 @@ void Awk::onLoopExit (rtx_t* rtx, val_t* ret, void* data) { Run* run = (Run*)data; - Argument x (run); - if (x.init (ret) == -1) + Value x; + if (x.setVal (run, ret) == -1) qse_awk_rtx_seterrnum (run->rtx, (errnum_t)ERR_NOMEM); else run->awk->onLoopExit (*run, x); } diff --git a/qse/lib/awk/StdAwk.cpp b/qse/lib/awk/StdAwk.cpp index 1d560ff3..67c3f389 100644 --- a/qse/lib/awk/StdAwk.cpp +++ b/qse/lib/awk/StdAwk.cpp @@ -1,5 +1,5 @@ /* - * $Id: StdAwk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $ + * $Id: StdAwk.cpp 229 2009-07-12 13:06:01Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -81,10 +81,10 @@ void StdAwk::close () Awk::close (); } -int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::sin (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_SINL) (real_t)::sinl(args[0].toReal()) #elif defined(HAVE_SIN) @@ -97,10 +97,10 @@ int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::cos (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::cos (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_COSL) (real_t)::cosl(args[0].toReal()) #elif defined(HAVE_COS) @@ -113,10 +113,10 @@ int StdAwk::cos (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::tan (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::tan (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_TANL) (real_t)::tanl(args[0].toReal()) #elif defined(HAVE_TAN) @@ -129,10 +129,10 @@ int StdAwk::tan (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::atan (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::atan (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_ATANL) (real_t)::atanl(args[0].toReal()) #elif defined(HAVE_ATAN) @@ -145,10 +145,10 @@ int StdAwk::atan (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::atan2 (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::atan2 (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_ATAN2L) (real_t)::atan2l(args[0].toReal(), args[1].toReal()) #elif defined(HAVE_ATAN2) @@ -161,10 +161,10 @@ int StdAwk::atan2 (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::log (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::log (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_LOGL) (real_t)::logl(args[0].toReal()) #elif defined(HAVE_LOG) @@ -177,10 +177,10 @@ int StdAwk::log (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::exp (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::exp (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_EXPL) (real_t)::expl(args[0].toReal()) #elif defined(HAVE_EXP) @@ -193,10 +193,10 @@ int StdAwk::exp (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::sqrt (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::sqrt (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ( + return ret.setReal ( #if defined(HAVE_SQRTL) (real_t)::sqrtl(args[0].toReal()) #elif defined(HAVE_SQRT) @@ -209,19 +209,19 @@ int StdAwk::sqrt (Run& run, Return& ret, const Argument* args, size_t nargs, ); } -int StdAwk::fnint (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::fnint (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set (args[0].toInt()); + return ret.setInt (args[0].toInt()); } -int StdAwk::rand (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::rand (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { - return ret.set ((real_t)(::rand() % RAND_MAX) / RAND_MAX); + return ret.setReal ((real_t)(::rand() % RAND_MAX) / RAND_MAX); } -int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::srand (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { unsigned int prevSeed = this->seed; @@ -240,19 +240,19 @@ int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs, } ::srand (this->seed); - return ret.set ((long_t)prevSeed); + return ret.setInt ((long_t)prevSeed); } -int StdAwk::system (Run& run, Return& ret, const Argument* args, size_t nargs, +int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs, const char_t* name, size_t len) { size_t l; const char_t* ptr = args[0].toStr(&l); #ifdef _WIN32 - return ret.set ((long_t)::_tsystem(ptr)); + return ret.setInt ((long_t)::_tsystem(ptr)); #elif defined(QSE_CHAR_IS_MCHAR) - return ret.set ((long_t)::system(ptr)); + return ret.setInt ((long_t)::system(ptr)); #else char* mbs = (char*) qse_awk_alloc ((awk_t*)(Awk*)run, l*5+1); if (mbs == QSE_NULL) return -1; @@ -271,7 +271,7 @@ int StdAwk::system (Run& run, Return& ret, const Argument* args, size_t nargs, } mbs[mbl] = '\0'; - int n = ret.set ((long_t)::system(mbs)); + int n = ret.setInt ((long_t)::system(mbs)); qse_awk_free ((awk_t*)(Awk*)run, mbs); return n; diff --git a/qse/samples/awk/awk05.cpp b/qse/samples/awk/awk05.cpp index 653a55b3..3b7c168e 100644 --- a/qse/samples/awk/awk05.cpp +++ b/qse/samples/awk/awk05.cpp @@ -34,33 +34,13 @@ static void print_error (const qse_char_t* msg) print_error (0, msg); } -static int awk_main (int argc, qse_char_t* argv[]) +static int run_awk (QSE::StdAwk& awk) { - QSE::StdAwk awk; - QSE::StdAwk::Run* run; - - // initialize awk - if (awk.open() <= -1) - { - print_error (awk.getErrorMessage()); - return -1; - } - // ARGV[0] - if (awk.addArgument (QSE_T("awk05")) <= -1) - { - print_error (awk.getErrorMessage()); - awk.close (); - return -1; - } + if (awk.addArgument (QSE_T("awk05")) <= -1) return -1; // ARGV[1] and/or the first console input file - if (awk.addArgument (QSE_T("awk05.cpp")) <= -1) - { - print_error (awk.getErrorMessage()); - awk.close (); - return -1; - } + if (awk.addArgument (QSE_T("awk05.cpp")) <= -1) return -1; const qse_char_t* script = QSE_T( "BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n" @@ -72,24 +52,23 @@ static int awk_main (int argc, qse_char_t* argv[]) QSE::StdAwk::SourceFile out (QSE_T("awk05.out")); // parse the script string and deparse it to awk05.out. - run = awk.parse (&in, &out); - if (run == QSE_NULL) - { - print_error (awk.getErrorLine(), awk.getErrorMessage()); - awk.close (); - return -1; - } + if (awk.parse (&in, &out) == QSE_NULL) return -1; // execute the BEGIN, pattern-action, END blocks. - if (awk.loop () <= -1) - { - print_error (awk.getErrorLine(), awk.getErrorMessage()); - awk.close (); - return -1; - } + return awk.loop (); +} + +static int awk_main (int argc, qse_char_t* argv[]) +{ + QSE::StdAwk awk; + + int ret = awk.open (); + if (ret >= 0) ret = run_awk (awk); + + if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage()); awk.close (); - return 0; + return ret; } int qse_main (int argc, qse_achar_t* argv[]) diff --git a/qse/samples/awk/awk06.cpp b/qse/samples/awk/awk06.cpp index 653a55b3..079da862 100644 --- a/qse/samples/awk/awk06.cpp +++ b/qse/samples/awk/awk06.cpp @@ -29,67 +29,59 @@ static void print_error (unsigned long line, const qse_char_t* msg) } -static void print_error (const qse_char_t* msg) +static int run_awk (QSE::StdAwk& awk) { - print_error (0, msg); + QSE::StdAwk::Run* run; + + const qse_char_t* script = QSE_T( + "function add (a, b) { return a + b }\n" + "function mul (a, b) { return a * b }\n" + "function div (a, b) { return a / b }\n" + ); + + QSE::StdAwk::SourceString in (script); + QSE::StdAwk::SourceFile out (QSE_T("awk06.out")); + + // parse the script and deparse it to awk06.out + run = awk.parse (&in, &out); + if (run == QSE_NULL) return -1; + + QSE::StdAwk::Value arg[2]; + if (arg[0].setInt (run, -20) <= -1) return -1; + if (arg[1].setStr (run, QSE_T("51")) <= -1) return -1; + + // ret = add (-20, 51) + QSE::StdAwk::Value ret; + if (awk.call (QSE_T("add"), &ret, arg, 2) <= -1) return -1; + + // ret = mul (ret, 51); + arg[0] = ret; + if (awk.call (QSE_T("mul"), &ret, arg, 2) <= -1) return -1; + + // ret = div (ret, 2); + arg[0] = ret; + if (arg[1].setReal (run, 2) <= -1) return -1; + if (awk.call (QSE_T("div"), &ret, arg, 2) <= -1) return -1; + + // output the result in various types + qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt()); + qse_printf (QSE_T(" (real) [%Lf]\n"), (long double)ret.toReal()); + qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL)); + + return 0; } static int awk_main (int argc, qse_char_t* argv[]) { QSE::StdAwk awk; - QSE::StdAwk::Run* run; - // initialize awk - if (awk.open() <= -1) - { - print_error (awk.getErrorMessage()); - return -1; - } + int ret = awk.open(); - // ARGV[0] - if (awk.addArgument (QSE_T("awk05")) <= -1) - { - print_error (awk.getErrorMessage()); - awk.close (); - return -1; - } - - // ARGV[1] and/or the first console input file - if (awk.addArgument (QSE_T("awk05.cpp")) <= -1) - { - print_error (awk.getErrorMessage()); - awk.close (); - return -1; - } - - const qse_char_t* script = QSE_T( - "BEGIN { print \">> PRINT ALL LINES WHOSE LENGTH IS GREATER THAN 0\"; }\n" - "length($0) > 0 { print $0; count++; }\n" - "END { print \">> TOTAL\", count, \"LINES\"; }\n" - ); - - QSE::StdAwk::SourceString in (script); - QSE::StdAwk::SourceFile out (QSE_T("awk05.out")); - - // parse the script string and deparse it to awk05.out. - run = awk.parse (&in, &out); - if (run == QSE_NULL) - { - print_error (awk.getErrorLine(), awk.getErrorMessage()); - awk.close (); - return -1; - } - - // execute the BEGIN, pattern-action, END blocks. - if (awk.loop () <= -1) - { - print_error (awk.getErrorLine(), awk.getErrorMessage()); - awk.close (); - return -1; - } + if (ret >= 0) ret = run_awk (awk); + if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage()); awk.close (); - return 0; + return -1; } int qse_main (int argc, qse_achar_t* argv[])