Recovered from cvs revision 2007-10-07 09:17:00

This commit is contained in:
hyung-hwan 2007-10-08 00:27:00 +00:00
parent 990332a24e
commit f3a2d73fba
4 changed files with 148 additions and 175 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.cpp,v 1.66 2007/10/04 04:48:27 bacon Exp $ * $Id: Awk.cpp,v 1.67 2007/10/05 15:11:30 bacon Exp $
* *
* {License} * {License}
*/ */
@ -166,7 +166,7 @@ void Awk::Argument::clear ()
/* when the value is a map, str.ptr and str.len are /* when the value is a map, str.ptr and str.len are
* used for index iteration in getFirstIndex & getNextIndex */ * used for index iteration in getFirstIndex & getNextIndex */
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = ASE_NULL; this->val = ASE_NULL;
} }
else else
@ -178,7 +178,7 @@ void Awk::Argument::clear ()
if (this->val->type != ASE_AWK_VAL_STR) if (this->val->type != ASE_AWK_VAL_STR)
{ {
ase_awk_free ( ase_awk_free (
ase_awk_getrunawk(this->run), this->run->awk->awk,
this->str.ptr); this->str.ptr);
} }
@ -188,7 +188,7 @@ void Awk::Argument::clear ()
if (this->val != ASE_NULL) if (this->val != ASE_NULL)
{ {
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = ASE_NULL; this->val = ASE_NULL;
} }
@ -241,21 +241,21 @@ void Awk::Argument::operator delete[] (void* ptr)
ase_awk_free (*(awk_t**)p, p); ase_awk_free (*(awk_t**)p, p);
} }
int Awk::Argument::init (run_t* run, val_t* v) int Awk::Argument::init (Run* run, val_t* v)
{ {
// this method is used internally only // this method is used internally only
// and should never be called more than once // and should never be called more than once
ASE_ASSERT (this->run == ASE_NULL && this->val == ASE_NULL); ASE_ASSERT (this->run == ASE_NULL && this->val == ASE_NULL);
ASE_ASSERT (run != ASE_NULL && v != ASE_NULL); ASE_ASSERT (run != ASE_NULL && v != ASE_NULL);
ase_awk_refupval (run, v); ase_awk_refupval (run->run, v);
this->run = run; this->run = run;
this->val = v; this->val = v;
if (v->type == ASE_AWK_VAL_STR) if (v->type == ASE_AWK_VAL_STR)
{ {
int n = ase_awk_valtonum ( int n = ase_awk_valtonum (
run, v, &this->inum, &this->rnum); run->run, v, &this->inum, &this->rnum);
if (n == 0) if (n == 0)
{ {
this->rnum = (ase_real_t)this->inum; this->rnum = (ase_real_t)this->inum;
@ -276,7 +276,7 @@ int Awk::Argument::init (run_t* run, val_t* v)
this->rnum = (ase_real_t)((ase_awk_val_int_t*)v)->val; this->rnum = (ase_real_t)((ase_awk_val_int_t*)v)->val;
this->str.ptr = ase_awk_valtostr ( this->str.ptr = ase_awk_valtostr (
run, v, 0, ASE_NULL, &this->str.len); run->run, v, 0, ASE_NULL, &this->str.len);
if (this->str.ptr != ASE_NULL) return 0; if (this->str.ptr != ASE_NULL) return 0;
} }
else if (v->type == ASE_AWK_VAL_REAL) else if (v->type == ASE_AWK_VAL_REAL)
@ -285,7 +285,7 @@ int Awk::Argument::init (run_t* run, val_t* v)
this->rnum = ((ase_awk_val_real_t*)v)->val; this->rnum = ((ase_awk_val_real_t*)v)->val;
this->str.ptr = ase_awk_valtostr ( this->str.ptr = ase_awk_valtostr (
run, v, 0, ASE_NULL, &this->str.len); run->run, v, 0, ASE_NULL, &this->str.len);
if (this->str.ptr != ASE_NULL) return 0; if (this->str.ptr != ASE_NULL) return 0;
} }
else if (v->type == ASE_AWK_VAL_NIL) else if (v->type == ASE_AWK_VAL_NIL)
@ -294,7 +294,7 @@ int Awk::Argument::init (run_t* run, val_t* v)
this->rnum = 0.0; this->rnum = 0.0;
this->str.ptr = ase_awk_valtostr ( this->str.ptr = ase_awk_valtostr (
run, v, 0, ASE_NULL, &this->str.len); run->run, v, 0, ASE_NULL, &this->str.len);
if (this->str.ptr != ASE_NULL) return 0; if (this->str.ptr != ASE_NULL) return 0;
} }
else if (v->type == ASE_AWK_VAL_MAP) else if (v->type == ASE_AWK_VAL_MAP)
@ -307,13 +307,13 @@ int Awk::Argument::init (run_t* run, val_t* v)
} }
// an error has occurred // an error has occurred
ase_awk_refdownval (run, v); ase_awk_refdownval (run->run, v);
this->run = ASE_NULL; this->run = ASE_NULL;
this->val = ASE_NULL; this->val = ASE_NULL;
return -1; return -1;
} }
int Awk::Argument::init (run_t* run, const char_t* str, size_t len) int Awk::Argument::init (Run* run, const char_t* str, size_t len)
{ {
ASE_ASSERT (this->run == ASE_NULL && this->val == ASE_NULL); ASE_ASSERT (this->run == ASE_NULL && this->val == ASE_NULL);
@ -321,7 +321,7 @@ int Awk::Argument::init (run_t* run, const char_t* str, size_t len)
this->str.ptr = (char_t*)str; this->str.ptr = (char_t*)str;
this->str.len = len; this->str.len = len;
if (ase_awk_strtonum (run, str, len, &this->inum, &this->rnum) == 0) if (ase_awk_strtonum (run->run, str, len, &this->inum, &this->rnum) == 0)
{ {
this->rnum = (real_t)this->inum; this->rnum = (real_t)this->inum;
} }
@ -408,9 +408,8 @@ int Awk::Argument::getIndexed (long_t idx, Argument& val) const
char_t ri[128]; char_t ri[128];
Awk* awk = (Awk*)ase_awk_getcustomdata(ase_awk_getrunawk(this->run));
int rl = Awk::sprintf ( int rl = Awk::sprintf (
awk, ri, ASE_COUNTOF(ri), &this->run->awk, ri, ASE_COUNTOF(ri),
#if ASE_SIZEOF_LONG_LONG > 0 #if ASE_SIZEOF_LONG_LONG > 0
ASE_T("%lld"), (long long)idx ASE_T("%lld"), (long long)idx
#elif ASE_SIZEOF___INT64 > 0 #elif ASE_SIZEOF___INT64 > 0
@ -426,7 +425,7 @@ int Awk::Argument::getIndexed (long_t idx, Argument& val) const
if (rl < 0) if (rl < 0)
{ {
ase_awk_setrunerror (this->run, ERR_INTERN, 0, ASE_NULL, 0); run->setError (ERR_INTERN, 0, ASE_NULL, 0);
return -1; return -1;
} }
@ -489,7 +488,7 @@ int Awk::Argument::getNextIndex (Awk::Argument& val) const
// Awk::Return // Awk::Return
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
Awk::Return::Return (run_t* run): run(run), val(ase_awk_val_nil) Awk::Return::Return (Run* run): run(run), val(ase_awk_val_nil)
{ {
} }
@ -512,16 +511,16 @@ int Awk::Return::set (long_t v)
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
ase_awk_val_t* x = ase_awk_makeintval (this->run, v); ase_awk_val_t* x = ase_awk_makeintval (this->run->run, v);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
ase_awk_refupval (this->run, this->val); ase_awk_refupval (this->run->run, this->val);
return 0; return 0;
} }
@ -530,16 +529,16 @@ int Awk::Return::set (real_t v)
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
ase_awk_val_t* x = ase_awk_makerealval (this->run, v); ase_awk_val_t* x = ase_awk_makerealval (this->run->run, v);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
ase_awk_refupval (this->run, this->val); ase_awk_refupval (this->run->run, this->val);
return 0; return 0;
} }
@ -548,16 +547,16 @@ int Awk::Return::set (const char_t* ptr, size_t len)
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
ase_awk_val_t* x = ase_awk_makestrval (this->run, ptr, len); ase_awk_val_t* x = ase_awk_makestrval (this->run->run, ptr, len);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror (this->run, ERR_NOMEM, 0, ASE_NULL, 0); this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
ase_awk_refupval (this->run, this->val); ase_awk_refupval (this->run->run, this->val);
return 0; return 0;
} }
@ -571,70 +570,64 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, long_t v)
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); int opt = this->run->awk->getOption();
if ((opt & OPT_MAPTOVAR) == 0) if ((opt & OPT_MAPTOVAR) == 0)
{ {
/* refer to run_return in run.c */ /* refer to run_return in run.c */
ase_awk_setrunerror ( this->run->setError (ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
return -1; return -1;
} }
if (this->val->type != ASE_AWK_VAL_MAP) if (this->val->type != ASE_AWK_VAL_MAP)
{ {
ase_awk_val_t* x = ase_awk_makemapval (this->run); ase_awk_val_t* x = ase_awk_makemapval (this->run->run);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x); ase_awk_refupval (this->run->run, x);
ase_awk_val_t* x2 = ase_awk_makeintval (this->run, v); ase_awk_val_t* x2 = ase_awk_makeintval (this->run->run, v);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)x)->map, idx, iln, x2); ((ase_awk_val_map_t*)x)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
} }
else else
{ {
ase_awk_val_t* x2 = ase_awk_makeintval (this->run, v); ase_awk_val_t* x2 = ase_awk_makeintval (this->run->run, v);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
} }
@ -646,70 +639,64 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, real_t v)
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); int opt = this->run->awk->getOption();
if ((opt & OPT_MAPTOVAR) == 0) if ((opt & OPT_MAPTOVAR) == 0)
{ {
/* refer to run_return in run.c */ /* refer to run_return in run.c */
ase_awk_setrunerror ( this->run->setError (ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
return -1; return -1;
} }
if (this->val->type != ASE_AWK_VAL_MAP) if (this->val->type != ASE_AWK_VAL_MAP)
{ {
ase_awk_val_t* x = ase_awk_makemapval (this->run); ase_awk_val_t* x = ase_awk_makemapval (this->run->run);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x); ase_awk_refupval (this->run->run, x);
ase_awk_val_t* x2 = ase_awk_makerealval (this->run, v); ase_awk_val_t* x2 = ase_awk_makerealval (this->run->run, v);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)x)->map, idx, iln, x2); ((ase_awk_val_map_t*)x)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
} }
else else
{ {
ase_awk_val_t* x2 = ase_awk_makerealval (this->run, v); ase_awk_val_t* x2 = ase_awk_makerealval (this->run->run, v);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
} }
@ -721,70 +708,64 @@ int Awk::Return::setIndexed (const char_t* idx, size_t iln, const char_t* str, s
{ {
ASE_ASSERT (this->run != ASE_NULL); ASE_ASSERT (this->run != ASE_NULL);
int opt = ase_awk_getoption (ase_awk_getrunawk(this->run)); int opt = this->run->awk->getOption();
if ((opt & OPT_MAPTOVAR) == 0) if ((opt & OPT_MAPTOVAR) == 0)
{ {
/* refer to run_return in run.c */ /* refer to run_return in run.c */
ase_awk_setrunerror ( this->run->setError (ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
this->run, ERR_MAPNOTALLOWED, 0, ASE_NULL, 0);
return -1; return -1;
} }
if (this->val->type != ASE_AWK_VAL_MAP) if (this->val->type != ASE_AWK_VAL_MAP)
{ {
ase_awk_val_t* x = ase_awk_makemapval (this->run); ase_awk_val_t* x = ase_awk_makemapval (this->run->run);
if (x == ASE_NULL) if (x == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x); ase_awk_refupval (this->run->run, x);
ase_awk_val_t* x2 = ase_awk_makestrval (this->run, str, sln); ase_awk_val_t* x2 = ase_awk_makestrval (this->run->run, str, sln);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)x)->map, idx, iln, x2); ((ase_awk_val_map_t*)x)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_refdownval (this->run, x); ase_awk_refdownval (this->run->run, x);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = x; this->val = x;
} }
else else
{ {
ase_awk_val_t* x2 = ase_awk_makestrval (this->run, str, sln); ase_awk_val_t* x2 = ase_awk_makestrval (this->run->run, str, sln);
if (x2 == ASE_NULL) if (x2 == ASE_NULL)
{ {
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
ase_awk_refupval (this->run, x2); ase_awk_refupval (this->run->run, x2);
ase_awk_pair_t* pair = ase_awk_map_put ( ase_awk_pair_t* pair = ase_awk_map_put (
((ase_awk_val_map_t*)this->val)->map, idx, iln, x2); ((ase_awk_val_map_t*)this->val)->map, idx, iln, x2);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_awk_refdownval (this->run, x2); ase_awk_refdownval (this->run->run, x2);
ase_awk_setrunerror ( this->run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
this->run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
} }
@ -796,9 +777,8 @@ int Awk::Return::setIndexed (long_t idx, long_t v)
{ {
char_t ri[128]; char_t ri[128];
Awk* awk = (Awk*)ase_awk_getcustomdata(ase_awk_getrunawk(this->run));
int rl = Awk::sprintf ( int rl = Awk::sprintf (
awk, ri, ASE_COUNTOF(ri), this->run->awk, ri, ASE_COUNTOF(ri),
#if ASE_SIZEOF_LONG_LONG > 0 #if ASE_SIZEOF_LONG_LONG > 0
ASE_T("%lld"), (long long)idx ASE_T("%lld"), (long long)idx
#elif ASE_SIZEOF___INT64 > 0 #elif ASE_SIZEOF___INT64 > 0
@ -814,7 +794,7 @@ int Awk::Return::setIndexed (long_t idx, long_t v)
if (rl < 0) if (rl < 0)
{ {
ase_awk_setrunerror (this->run, ERR_INTERN, 0, ASE_NULL, 0); this->run->setError (ERR_INTERN, 0, ASE_NULL, 0);
return -1; return -1;
} }
@ -825,9 +805,8 @@ int Awk::Return::setIndexed (long_t idx, real_t v)
{ {
char_t ri[128]; char_t ri[128];
Awk* awk = (Awk*)ase_awk_getcustomdata(ase_awk_getrunawk(this->run));
int rl = Awk::sprintf ( int rl = Awk::sprintf (
awk, ri, ASE_COUNTOF(ri), this->run->awk, ri, ASE_COUNTOF(ri),
#if ASE_SIZEOF_LONG_LONG > 0 #if ASE_SIZEOF_LONG_LONG > 0
ASE_T("%lld"), (long long)idx ASE_T("%lld"), (long long)idx
#elif ASE_SIZEOF___INT64 > 0 #elif ASE_SIZEOF___INT64 > 0
@ -843,7 +822,7 @@ int Awk::Return::setIndexed (long_t idx, real_t v)
if (rl < 0) if (rl < 0)
{ {
ase_awk_setrunerror (this->run, ERR_INTERN, 0, ASE_NULL, 0); this->run->setError (ERR_INTERN, 0, ASE_NULL, 0);
return -1; return -1;
} }
@ -854,9 +833,8 @@ int Awk::Return::setIndexed (long_t idx, const char_t* str, size_t sln)
{ {
char_t ri[128]; char_t ri[128];
Awk* awk = (Awk*)ase_awk_getcustomdata(ase_awk_getrunawk(this->run));
int rl = Awk::sprintf ( int rl = Awk::sprintf (
awk, ri, ASE_COUNTOF(ri), this->run->awk, ri, ASE_COUNTOF(ri),
#if ASE_SIZEOF_LONG_LONG > 0 #if ASE_SIZEOF_LONG_LONG > 0
ASE_T("%lld"), (long long)idx ASE_T("%lld"), (long long)idx
#elif ASE_SIZEOF___INT64 > 0 #elif ASE_SIZEOF___INT64 > 0
@ -872,7 +850,7 @@ int Awk::Return::setIndexed (long_t idx, const char_t* str, size_t sln)
if (rl < 0) if (rl < 0)
{ {
ase_awk_setrunerror (this->run, ERR_INTERN, 0, ASE_NULL, 0); this->run->setError (ERR_INTERN, 0, ASE_NULL, 0);
return -1; return -1;
} }
@ -881,7 +859,7 @@ int Awk::Return::setIndexed (long_t idx, const char_t* str, size_t sln)
void Awk::Return::clear () void Awk::Return::clear ()
{ {
ase_awk_refdownval (this->run, this->val); ase_awk_refdownval (this->run->run, this->val);
this->val = ase_awk_val_nil; this->val = ase_awk_val_nil;
} }
@ -1000,7 +978,7 @@ int Awk::Run::getGlobal (int id, Argument& global) const
ASE_ASSERT (run != ASE_NULL); ASE_ASSERT (run != ASE_NULL);
global.clear (); global.clear ();
return global.init (run, ase_awk_getglobal(this->run,id)); return global.init ((Run*)this, ase_awk_getglobal(this->run,id));
} }
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
@ -1262,7 +1240,9 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
ase_awk_runios_t runios; ase_awk_runios_t runios;
ase_awk_runcbs_t runcbs; ase_awk_runcbs_t runcbs;
ase_awk_runarg_t* runarg = ASE_NULL; ase_awk_runarg_t* runarg = ASE_NULL;
Run runForCallback (this);
// make sure that the run field is set in Awk::onRunStart.
Run runctx (this);
runios.pipe = pipeHandler; runios.pipe = pipeHandler;
runios.coproc = ASE_NULL; runios.coproc = ASE_NULL;
@ -1276,7 +1256,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
runcbs.on_end = onRunEnd; runcbs.on_end = onRunEnd;
runcbs.on_return = onRunReturn; runcbs.on_return = onRunReturn;
runcbs.on_statement = onRunStatement; runcbs.on_statement = onRunStatement;
runcbs.custom_data = &runForCallback; runcbs.custom_data = &runctx;
} }
if (nargs > 0) if (nargs > 0)
@ -1310,7 +1290,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
int n = ase_awk_run ( int n = ase_awk_run (
awk, main, &runios, awk, main, &runios,
(runCallback? &runcbs: ASE_NULL), (runCallback? &runcbs: ASE_NULL),
runarg, this); runarg, &runctx);
if (n == -1) retrieveError (); if (n == -1) retrieveError ();
if (runarg != ASE_NULL) if (runarg != ASE_NULL)
@ -1322,57 +1302,48 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
return n; return n;
} }
int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len) int Awk::dispatchFunction (Run* run, const char_t* name, size_t len)
{ {
pair_t* pair; pair_t* pair;
awk_t* awk; awk_t* awk = run->awk->awk;
awk = ase_awk_getrunawk (run); //awk = ase_awk_getrunawk (run);
pair = ase_awk_map_get (functionMap, name, len); pair = ase_awk_map_get (functionMap, name, len);
if (pair == ASE_NULL) if (pair == ASE_NULL)
{ {
ase_cstr_t errarg; run->setError (ERR_FNNONE, 0, name, len);
errarg.ptr = name;
errarg.len = len;
ase_awk_setrunerror (
run, ASE_AWK_EFNNONE, 0, &errarg, 1);
return -1; return -1;
} }
FunctionHandler handler; FunctionHandler handler;
handler = *(FunctionHandler*)ASE_AWK_PAIR_VAL(pair); handler = *(FunctionHandler*)ASE_AWK_PAIR_VAL(pair);
size_t i, nargs = ase_awk_getnargs(run); size_t i, nargs = ase_awk_getnargs(run->run);
//Argument* args = ASE_NULL; //Argument* args = ASE_NULL;
//try { args = new Argument [nargs]; } catch (...) {} //try { args = new Argument [nargs]; } catch (...) {}
Argument* args = new(awk) Argument[nargs]; Argument* args = new(awk) Argument[nargs];
if (args == ASE_NULL) if (args == ASE_NULL)
{ {
ase_awk_setrunerror ( run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
run, ERR_NOMEM, 0, ASE_NULL, 0);
return -1; return -1;
} }
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
{ {
val_t* v = ase_awk_getarg (run, i); val_t* v = ase_awk_getarg (run->run, i);
if (args[i].init (run, v) == -1) if (args[i].init (run, v) == -1)
{ {
ase_awk_setrunerror ( run->setError (ERR_NOMEM, 0, ASE_NULL, 0);
run, ERR_NOMEM, 0, ASE_NULL, 0);
delete[] args; delete[] args;
return -1; return -1;
} }
} }
Run runForFunction (this, run);
Return ret (run); Return ret (run);
int n = (this->*handler) (runForFunction, ret, args, nargs, name, len); int n = (this->*handler) (*run, ret, args, nargs, name, len);
delete[] args; delete[] args;
@ -1383,7 +1354,7 @@ int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len)
return -1; return -1;
} }
ase_awk_setretval (run, ret); ase_awk_setretval (run->run, ret);
return 0; return 0;
} }
@ -1619,8 +1590,9 @@ Awk::ssize_t Awk::consoleHandler (
int Awk::functionHandler ( int Awk::functionHandler (
run_t* run, const char_t* name, size_t len) run_t* run, const char_t* name, size_t len)
{ {
Awk* awk = (Awk*) ase_awk_getruncustomdata (run); Run* ctx = (Run*) ase_awk_getruncustomdata (run);
return awk->dispatchFunction (run, name, len); Awk* awk = ctx->awk;
return awk->dispatchFunction (ctx, name, len);
} }
void Awk::freeFunctionMapValue (void* owner, void* value) void Awk::freeFunctionMapValue (void* owner, void* value)
@ -1634,12 +1606,11 @@ void Awk::onRunStart (run_t* run, void* custom)
Run* r = (Run*)custom; Run* r = (Run*)custom;
// the actual run_t value for the run-time callback is set here. // the actual run_t value for the run-time callback is set here.
// r here refers to runForCallback declared in Awk::run and is // r here refers to runctx declared in Awk::run. As onRunStart
// different from a Run instance available from intrinsic function // is executed immediately after the run method is invoked,
// handlers (runForFunction in dispatchFunction). however, all methods // the run field can be set safely here. This seems to be the
// of the Run class will still work as intended in all places once // only place to acquire the run_t value safely as Awk::run
// r->run is set properly here. // is blocking.
// NOTE: I admit this strategy is ugly.
r->run = run; r->run = run;
r->callbackFailed = false; r->callbackFailed = false;
@ -1665,7 +1636,7 @@ void Awk::onRunReturn (run_t* run, val_t* ret, void* custom)
if (r->callbackFailed) return; if (r->callbackFailed) return;
Argument x; Argument x;
if (x.init (run, ret) == -1) if (x.init (r, ret) == -1)
{ {
r->callbackFailed = true; r->callbackFailed = true;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp,v 1.67 2007/10/04 04:48:27 bacon Exp $ * $Id: Awk.hpp,v 1.68 2007/10/05 15:11:30 bacon Exp $
* *
* {License} * {License}
*/ */
@ -315,8 +315,8 @@ public:
Argument& operator= (const Argument&); Argument& operator= (const Argument&);
protected: protected:
int init (run_t* run, val_t* v); int init (Run* run, val_t* v);
int init (run_t* run, const char_t* str, size_t len); int init (Run* run, const char_t* str, size_t len);
public: public:
long_t toInt () const; long_t toInt () const;
@ -333,7 +333,7 @@ public:
int getNextIndex (Awk::Argument& val) const; int getNextIndex (Awk::Argument& val) const;
protected: protected:
run_t* run; Run* run;
val_t* val; val_t* val;
ase_long_t inum; ase_long_t inum;
@ -352,8 +352,9 @@ public:
{ {
protected: protected:
friend class Awk; friend class Awk;
friend class Awk::Run;
Return (run_t* run); Return (Run* run);
~Return (); ~Return ();
private: private:
@ -381,7 +382,7 @@ public:
void clear (); void clear ();
protected: protected:
run_t* run; Run* run;
val_t* val; val_t* val;
}; };
@ -557,6 +558,8 @@ public:
{ {
protected: protected:
friend class Awk; friend class Awk;
friend class Awk::Argument;
friend class Awk::Return;
Run (Awk* awk); Run (Awk* awk);
Run (Awk* awk, run_t* run); Run (Awk* awk, run_t* run);
@ -808,8 +811,7 @@ public:
virtual void disableRunCallback (); virtual void disableRunCallback ();
protected: protected:
virtual int dispatchFunction ( virtual int dispatchFunction (Run* run, const char_t* name, size_t len);
run_t* run, const char_t* name, size_t len);
/** /**
* @name Source code I/O handlers * @name Source code I/O handlers

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.cpp,v 1.28 2007/10/04 04:48:27 bacon Exp $ * $Id: Awk.cpp,v 1.29 2007/10/05 15:11:30 bacon Exp $
* *
* {License} * {License}
*/ */
@ -175,11 +175,12 @@ namespace ASE
void onRunStart (const Run& run) void onRunStart (const Run& run)
{ {
wrapper->runErrorReported = false; wrapper->runErrorReported = false;
wrapper->stopRequested = false;
if (wrapper->OnRunStart != nullptr) if (wrapper->OnRunStart != nullptr)
{ {
wrapper->OnRunStart (wrapper); //wrapper->OnRunStart (wrapper);
wrapper->OnRunStart (
gcnew Context(wrapper, run));
} }
} }
void onRunEnd (const Run& run) void onRunEnd (const Run& run)
@ -195,14 +196,18 @@ namespace ASE
if (wrapper->OnRunEnd != nullptr) if (wrapper->OnRunEnd != nullptr)
{ {
wrapper->OnRunEnd (wrapper); //wrapper->OnRunEnd (wrapper);
wrapper->OnRunEnd (
gcnew Context(wrapper, run));
} }
} }
void onRunReturn (const Run& run, const Argument& ret) void onRunReturn (const Run& run, const Argument& ret)
{ {
if (wrapper->OnRunReturn != nullptr) if (wrapper->OnRunReturn != nullptr)
{ {
wrapper->OnRunReturn (wrapper); //wrapper->OnRunReturn (wrapper);
wrapper->OnRunReturn (
gcnew Context(wrapper, run));
} }
} }
@ -212,7 +217,9 @@ namespace ASE
if (wrapper->OnRunStatement != nullptr) if (wrapper->OnRunStatement != nullptr)
{ {
wrapper->OnRunStatement (wrapper); //wrapper->OnRunStatement (wrapper);
wrapper->OnRunStatement (
gcnew Context(wrapper, run));
} }
} }
@ -738,12 +745,11 @@ namespace ASE
return false; return false;
} }
// callback needs to be enabled to support the Stop method if (OnRunStart != nullptr || OnRunEnd != nullptr ||
//if (OnRunStart != nullptr || OnRunEnd != nullptr || OnRunReturn != nullptr || OnRunStatement != nullptr)
// OnRunReturn != nullptr || OnRunStatement != nullptr) {
//{
awk->enableRunCallback (this); awk->enableRunCallback (this);
//} }
if (args == nullptr || args->Length <= 0) if (args == nullptr || args->Length <= 0)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp,v 1.32 2007/10/04 14:26:21 bacon Exp $ * $Id: Awk.hpp,v 1.33 2007/10/05 15:11:30 bacon Exp $
* *
* {License} * {License}
*/ */
@ -263,12 +263,12 @@ namespace ASE
public: public:
property Awk^ Owner property Awk^ Owner
{ {
Awk^ get () { return this->owner; } Awk^ get () { return this->owner; }
} }
bool Stop () bool Stop ()
{ {
return run.stop () == 0; return run.stop () == 0;
} }
/* TODO: /* TODO:
@ -643,15 +643,10 @@ namespace ASE
virtual bool Run (); virtual bool Run ();
virtual bool Run (System::String^ entryPoint, cli::array<System::String^>^ args); virtual bool Run (System::String^ entryPoint, cli::array<System::String^>^ args);
/** delegate void RunStartHandler (Context^ ctx);
* sets the request to stop the Run method delegate void RunEndHandler (Context^ ctx);
*/ delegate void RunReturnHandler (Context^ ctx);
virtual void Stop (); delegate void RunStatementHandler (Context^ ctx);
delegate void RunStartHandler (Awk^ awk);
delegate void RunEndHandler (Awk^ awk);
delegate void RunReturnHandler (Awk^ awk);
delegate void RunStatementHandler (Awk^ awk);
/*event*/ RunStartHandler^ OnRunStart; /*event*/ RunStartHandler^ OnRunStart;
/*event*/ RunEndHandler^ OnRunEnd; /*event*/ RunEndHandler^ OnRunEnd;
@ -757,7 +752,6 @@ namespace ASE
void setError (ERROR num); void setError (ERROR num);
void retrieveError (); void retrieveError ();
bool runErrorReported; // only used if the run-callback is activated. bool runErrorReported; // only used if the run-callback is activated.
bool stopRequested;
}; };
} }