Recovered from cvs revision 2007-09-24 08:21:00

This commit is contained in:
hyung-hwan 2007-09-25 00:12:00 +00:00
parent a95cfc0029
commit 9312940dfa
29 changed files with 620 additions and 205 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp,v 1.55 2007/09/21 15:29:51 bacon Exp $
* $Id: Awk.cpp,v 1.56 2007/09/23 16:48:55 bacon Exp $
*/
@ -140,6 +140,11 @@ Awk::Argument::Argument (): run (ASE_NULL), val (ASE_NULL)
}
Awk::Argument::~Argument ()
{
clear ();
}
void Awk::Argument::clear ()
{
if (this->str.ptr != ASE_NULL)
{
@ -154,6 +159,7 @@ Awk::Argument::~Argument ()
{
ASE_ASSERT (this->run != ASE_NULL);
ase_awk_refdownval (this->run, this->val);
this->val = ASE_NULL;
}
}
@ -289,7 +295,7 @@ const Awk::char_t* Awk::Argument::toStr (size_t* len) const
// Awk::Return
//////////////////////////////////////////////////////////////////
Awk::Return::Return (run_t* run): run (run), type (ASE_AWK_VAL_NIL)
Awk::Return::Return (awk_t* awk): awk(awk), type (ASE_AWK_VAL_NIL)
{
}
@ -298,22 +304,24 @@ Awk::Return::~Return ()
clear ();
}
Awk::val_t* Awk::Return::toVal () const
Awk::val_t* Awk::Return::toVal (run_t* run) const
{
ASE_ASSERT (run != ASE_NULL);
switch (this->type)
{
case ASE_AWK_VAL_NIL:
return ase_awk_val_nil;
case ASE_AWK_VAL_INT:
return ase_awk_makeintval (this->run, this->v.inum);
return ase_awk_makeintval (run, this->v.inum);
case ASE_AWK_VAL_REAL:
return ase_awk_makerealval (this->run, this->v.rnum);
return ase_awk_makerealval (run, this->v.rnum);
case ASE_AWK_VAL_STR:
return ase_awk_makestrval (
this->run, this->v.str.ptr, this->v.str.len);
run, this->v.str.ptr, this->v.str.len);
}
return ASE_NULL;
@ -341,7 +349,6 @@ int Awk::Return::set (real_t v)
int Awk::Return::set (const char_t* ptr, size_t len)
{
awk_t* awk = ase_awk_getrunawk(this->run);
char_t* tmp = ase_awk_strxdup (awk, ptr, len);
if (tmp == ASE_NULL) return -1;
@ -359,7 +366,6 @@ void Awk::Return::clear ()
if (this->type == ASE_AWK_VAL_STR)
{
ASE_ASSERT (this->v.str.ptr != ASE_NULL);
awk_t* awk = ase_awk_getrunawk(this->run);
ase_awk_free (awk, this->v.str.ptr);
this->v.str.ptr = ASE_NULL;
this->v.str.len = 0;
@ -368,7 +374,6 @@ void Awk::Return::clear ()
this->type = ASE_AWK_VAL_NIL;
}
//////////////////////////////////////////////////////////////////
// Awk::Run
//////////////////////////////////////////////////////////////////
@ -378,6 +383,16 @@ Awk::Run::Run (Awk* awk):
{
}
Awk::Run::Run (Awk* awk, run_t* run):
awk (awk), run (run), callbackFailed (false)
{
ASE_ASSERT (this->run != ASE_NULL);
}
Awk::Run::~Run ()
{
}
int Awk::Run::stop () const
{
ASE_ASSERT (this->run != ASE_NULL);
@ -402,6 +417,68 @@ const Awk::char_t* Awk::Run::getErrorMessage () const
return ase_awk_getrunerrmsg (this->run);
}
int Awk::Run::setGlobal (int id, long_t v)
{
ASE_ASSERT (this->run != ASE_NULL);
ase_awk_val_t* tmp = ase_awk_makeintval (run, v);
if (tmp == ASE_NULL)
{
ase_awk_setrunerror (
this->run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0);
return -1;
}
ase_awk_refupval (run, tmp);
int n = ase_awk_setglobal (this->run, id, tmp);
ase_awk_refdownval (run, tmp);
return n;
}
int Awk::Run::setGlobal (int id, real_t v)
{
ASE_ASSERT (this->run != ASE_NULL);
ase_awk_val_t* tmp = ase_awk_makerealval (run, v);
if (tmp == ASE_NULL)
{
ase_awk_setrunerror (
this->run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0);
return -1;
}
ase_awk_refupval (run, tmp);
int n = ase_awk_setglobal (this->run, id, tmp);
ase_awk_refdownval (run, tmp);
return n;
}
int Awk::Run::setGlobal (int id, const char_t* ptr, size_t len)
{
ASE_ASSERT (run != ASE_NULL);
ase_awk_val_t* tmp = ase_awk_makestrval (run, ptr, len);
if (tmp == ASE_NULL)
{
ase_awk_setrunerror (
this->run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0);
return -1;
}
ase_awk_refupval (run, tmp);
int n = ase_awk_setglobal (this->run, id, tmp);
ase_awk_refdownval (run, tmp);
return n;
}
int Awk::Run::getGlobal (int id, Argument& global) const
{
ASE_ASSERT (run != ASE_NULL);
global.clear ();
return global.init (run,ase_awk_getglobal (this->run, id));
}
//////////////////////////////////////////////////////////////////
// Awk
//////////////////////////////////////////////////////////////////
@ -667,7 +744,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
ase_awk_runios_t runios;
ase_awk_runcbs_t runcbs;
ase_awk_runarg_t* runarg = ASE_NULL;
Run emptyRun (this);
Run runForCallback (this);
runios.pipe = pipeHandler;
runios.coproc = ASE_NULL;
@ -681,7 +758,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
runcbs.on_end = onRunEnd;
runcbs.on_return = onRunReturn;
runcbs.on_statement = onRunStatement;
runcbs.custom_data = &emptyRun;
runcbs.custom_data = &runForCallback;
}
if (nargs > 0)
@ -727,8 +804,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
return n;
}
int Awk::dispatchFunction (
run_t* run, const char_t* name, size_t len)
int Awk::dispatchFunction (run_t* run, const char_t* name, size_t len)
{
pair_t* pair;
awk_t* awk;
@ -736,7 +812,17 @@ int Awk::dispatchFunction (
awk = ase_awk_getrunawk (run);
pair = ase_awk_map_get (functionMap, name, len);
if (pair == ASE_NULL) return -1;
if (pair == ASE_NULL)
{
ase_cstr_t errarg;
errarg.ptr = name;
errarg.len = len;
ase_awk_setrunerror (
run, ASE_AWK_EFNNONE, 0, &errarg, 1);
return -1;
}
FunctionHandler handler;
handler = *(FunctionHandler*)ASE_AWK_PAIR_VAL(pair);
@ -746,32 +832,68 @@ int Awk::dispatchFunction (
//Argument* args = ASE_NULL;
//try { args = new Argument [nargs]; } catch (...) {}
Argument* args = new(awk) Argument[nargs];
if (args == ASE_NULL) return -1;
if (args == ASE_NULL)
{
ase_awk_setrunerror (
run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0);
return -1;
}
for (i = 0; i < nargs; i++)
{
val_t* v = ase_awk_getarg (run, i);
if (args[i].init (run, v) == -1)
{
ase_awk_setrunerror (
run, ASE_AWK_ENOMEM, 0, ASE_NULL, 0);
delete[] args;
return -1;
}
}
Return ret (run);
int n = (this->*handler) (&ret, args, nargs, name, len);
Run runForFunction (this, run);
Return ret (awk);
int n = (this->*handler) (runForFunction, ret, args, nargs, name, len);
delete[] args;
if (n <= -1) return -1;
if (n <= -1)
{
/* this is really the handler error. the underlying engine
* will take care of the error code. */
return -1;
}
val_t* r = ret.toVal ();
if (r == ASE_NULL) 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);
return 0;
}
int Awk::addGlobal (const char_t* name)
{
ASE_ASSERT (awk != ASE_NULL);
int n = ase_awk_addglobal (awk, name, ase_strlen(name));
if (n == -1) retrieveError ();
return n;
}
int Awk::deleteGlobal (const char_t* name)
{
ASE_ASSERT (awk != ASE_NULL);
int n = ase_awk_delglobal (awk, name, ase_strlen(name));
if (n == -1) retrieveError ();
return n;
}
int Awk::addFunction (
const char_t* name, size_t minArgs, size_t maxArgs,
FunctionHandler handler)
@ -791,7 +913,7 @@ int Awk::addFunction (
size_t nameLen = ase_strlen(name);
void* p = ase_awk_addbfn (awk, name, nameLen,
void* p = ase_awk_addfunc (awk, name, nameLen,
0, minArgs, maxArgs, ASE_NULL,
functionHandler);
if (p == ASE_NULL)
@ -804,7 +926,7 @@ int Awk::addFunction (
pair_t* pair = ase_awk_map_put (functionMap, name, nameLen, tmp);
if (pair == ASE_NULL)
{
ase_awk_delbfn (awk, name, nameLen);
ase_awk_delfunc (awk, name, nameLen);
ase_awk_free (awk, tmp);
setError (ERR_NOMEM);
@ -820,7 +942,7 @@ int Awk::deleteFunction (const char_t* name)
size_t nameLen = ase_strlen(name);
int n = ase_awk_delbfn (awk, name, nameLen);
int n = ase_awk_delfunc (awk, name, nameLen);
if (n == 0) ase_awk_map_remove (functionMap, name, nameLen);
else retrieveError ();
@ -1000,7 +1122,15 @@ void Awk::freeFunctionMapValue (void* owner, void* value)
void Awk::onRunStart (run_t* run, void* custom)
{
Run* r = (Run*)custom;
r->run = run;
// the actual run_t value for the run-time callback is set here.
// r here refers to runForCallback declared in Awk::run and is
// different from a Run instance available from intrinsic function
// handlers (runForFunction in dispatchFunction). however, all methods
// of the Run class will still work as intended in all places once
// r->run is set properly here.
// NOTE: I admit this strategy is ugly.
r->run = run;
r->callbackFailed = false;
r->awk->onRunStart (*r);

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.hpp,v 1.57 2007/09/22 14:40:44 bacon Exp $
* $Id: Awk.hpp,v 1.58 2007/09/23 16:48:55 bacon Exp $
*/
#ifndef _ASE_AWK_AWK_HPP_
@ -276,6 +276,8 @@ public:
char_t* filename;
};
class Run;
/**
* Represents an argument to an intrinsic function
*/
@ -283,10 +285,13 @@ public:
{
protected:
friend class Awk;
friend class Awk::Run;
Argument ();
~Argument ();
void clear ();
// initialization
void* operator new (size_t n, awk_t* awk) throw ();
void* operator new[] (size_t n, awk_t* awk) throw ();
@ -335,19 +340,20 @@ public:
protected:
friend class Awk;
Return (run_t* run);
Return (awk_t* awk);
~Return ();
val_t* toVal () const;
val_t* toVal (run_t* run) const;
public:
int set (long_t v);
int set (real_t v);
int set (const char_t* ptr, size_t len);
void clear ();
protected:
run_t* run;
awk_t* awk;
int type;
union
@ -357,13 +363,12 @@ public:
struct
{
char_t* ptr;
size_t len;
char_t* ptr;
size_t len;
} str;
} v;
};
// generated by generrcode.awk
/** Defines the error code */
enum ErrorCode
@ -534,6 +539,8 @@ public:
friend class Awk;
Run (Awk* awk);
Run (Awk* awk, run_t* run);
~Run ();
public:
int stop () const;
@ -542,9 +549,79 @@ public:
size_t getErrorLine () const;
const char_t* getErrorMessage () const;
/**
* Sets the value of a global variable. The global variable
* is indicated by the first parameter.
*
* @param id
* The ID to a global variable. This value corresponds
* to the predefined global variable IDs or the value
* returned by Awk::addGlobal.
* @param v
* The value to assign to the global variable.
*
* @return
* On success, 0 is returned.
* On failure, -1 is returned.
*/
int setGlobal (int id, long_t v);
/**
* Sets the value of a global variable. The global variable
* is indicated by the first parameter.
*
* @param id
* The ID to a global variable. This value corresponds
* to the predefined global variable IDs or the value
* returned by Awk::addGlobal.
* @param v
* The value to assign to the global variable.
*
* @return
* On success, 0 is returned.
* On failure, -1 is returned.
*/
int setGlobal (int id, real_t v);
/**
* Sets the value of a global variable. The global variable
* is indicated by the first parameter.
*
* @param id
* The ID to a global variable. This value corresponds
* to the predefined global variable IDs or the value
* returned by Awk::addGlobal.
* @param ptr The pointer to a character array
* @param len The number of characters in the array
*
* @return
* On success, 0 is returned.
* On failure, -1 is returned.
*/
int setGlobal (int id, const char_t* ptr, size_t len);
/**
* Gets the value of a global variable.
*
* @param id
* The ID to a global variable. This value corresponds
* to the predefined global variable IDs or the value
* returned by Awk::addGlobal.
* @param global
* The reference to the value holder of a global variable
* indicated by id. The parameter is set if thie method
* returns 0.
*
* @return
* On success, 0 is returned.
* On failure, -1 is returned.
*/
int getGlobal (int id, Argument& global) const;
protected:
Awk* awk;
run_t* run;
//mutable Value global;
bool callbackFailed;
};
@ -668,23 +745,33 @@ public:
const char_t** args = ASE_NULL, size_t nargs = 0);
/**
* Represents a user-defined function
* Adds a intrinsic global variable.
*/
virtual int addGlobal (const char_t* name);
/**
* Deletes a intrinsic global variable.
*/
virtual int deleteGlobal (const char_t* name);
/**
* Represents a user-defined intrinsic function.
*/
typedef int (Awk::*FunctionHandler) (
Return* ret, const Argument* args, size_t nargs,
Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
/**
* Adds a new user-defined function
* Adds a new user-defined intrinsic function.
*/
virtual int addFunction (
const char_t* name, size_t minArgs, size_t maxArgs,
FunctionHandler handler);
/**
* Deletes a user-defined function
* Deletes a user-defined intrinsic function
*/
virtual int deleteFunction (const char_t* main);
virtual int deleteFunction (const char_t* name);
/**
* Enables the run-time callback

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.java,v 1.13 2007/08/26 14:33:38 bacon Exp $
* $Id: Awk.java,v 1.14 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -77,9 +77,9 @@ public abstract class Awk
private native void setword (String ow, String nw);
private native void addbfn (
private native void addfunc (
String name, int min_args, int max_args) throws Exception;
private native void delbfn (String name) throws Exception;
private native void delfunc (String name) throws Exception;
native void setfilename (
long runid, String name) throws Exception;
@ -115,12 +115,12 @@ public abstract class Awk
public void addFunction (
String name, int min_args, int max_args) throws Exception
{
addbfn (name, min_args, max_args);
addfunc (name, min_args, max_args);
}
public void deleteFunction (String name) throws Exception
{
delbfn (name);
delfunc (name);
}
protected long builtinFunctionArgumentToLong (

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.cpp,v 1.26 2007/09/07 05:40:16 bacon Exp $
* $Id: StdAwk.cpp,v 1.27 2007/09/23 16:48:55 bacon Exp $
*/
#include <ase/awk/StdAwk.hpp>
@ -62,73 +62,73 @@ int StdAwk::open ()
return 0;
}
int StdAwk::sin (Return* ret, const Argument* args, size_t nargs,
int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::sin(args[0].toReal()));
return ret.set ((real_t)::sin(args[0].toReal()));
}
int StdAwk::cos (Return* ret, const Argument* args, size_t nargs,
int StdAwk::cos (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::cos(args[0].toReal()));
return ret.set ((real_t)::cos(args[0].toReal()));
}
int StdAwk::tan (Return* ret, const Argument* args, size_t nargs,
int StdAwk::tan (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::tan(args[0].toReal()));
return ret.set ((real_t)::tan(args[0].toReal()));
}
int StdAwk::atan (Return* ret, const Argument* args, size_t nargs,
int StdAwk::atan (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::atan(args[0].toReal()));
return ret.set ((real_t)::atan(args[0].toReal()));
}
int StdAwk::atan2 (Return* ret, const Argument* args, size_t nargs,
int StdAwk::atan2 (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::atan2(args[0].toReal(), args[1].toReal()));
return ret.set ((real_t)::atan2(args[0].toReal(), args[1].toReal()));
}
int StdAwk::log (Return* ret, const Argument* args, size_t nargs,
int StdAwk::log (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::log(args[0].toReal()));
return ret.set ((real_t)::log(args[0].toReal()));
}
int StdAwk::exp (Return* ret, const Argument* args, size_t nargs,
int StdAwk::exp (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::exp(args[0].toReal()));
return ret.set ((real_t)::exp(args[0].toReal()));
}
int StdAwk::sqrt (Return* ret, const Argument* args, size_t nargs,
int StdAwk::sqrt (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((real_t)::sqrt(args[0].toReal()));
return ret.set ((real_t)::sqrt(args[0].toReal()));
}
int StdAwk::fnint (Return* ret, const Argument* args, size_t nargs,
int StdAwk::fnint (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set (args[0].toInt());
return ret.set (args[0].toInt());
}
int StdAwk::rand (Return* ret, const Argument* args, size_t nargs,
int StdAwk::rand (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((long_t)::rand());
return ret.set ((long_t)::rand());
}
int StdAwk::srand (Return* ret, const Argument* args, size_t nargs,
int StdAwk::srand (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
unsigned int prevSeed = seed;
seed = (unsigned int)args[0].toInt();
::srand (seed);
return ret->set ((long_t)prevSeed);
return ret.set ((long_t)prevSeed);
}
#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER>=1400)
@ -138,13 +138,13 @@ int StdAwk::srand (Return* ret, const Argument* args, size_t nargs,
#define gmtime _gmtime64
#endif
int StdAwk::systime (Return* ret, const Argument* args, size_t nargs,
int StdAwk::systime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return ret->set ((long_t)::time(NULL));
return ret.set ((long_t)::time(NULL));
}
int StdAwk::strftime (Return* ret, const Argument* args, size_t nargs,
int StdAwk::strftime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
const char_t* fmt;
@ -168,10 +168,10 @@ int StdAwk::strftime (Return* ret, const Argument* args, size_t nargs,
size_t l = ::wcsftime (buf, ASE_COUNTOF(buf), fmt, tm);
#endif
return ret->set (buf, l);
return ret.set (buf, l);
}
int StdAwk::strfgmtime (Return* ret, const Argument* args, size_t nargs,
int StdAwk::strfgmtime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
const char_t* fmt;
@ -195,27 +195,31 @@ int StdAwk::strfgmtime (Return* ret, const Argument* args, size_t nargs,
size_t l = ::wcsftime (buf, ASE_COUNTOF(buf), fmt, tm);
#endif
return ret->set (buf, l);
return ret.set (buf, l);
}
int StdAwk::system (Return* ret, const Argument* args, size_t nargs,
int StdAwk::system (Run& run, Return& ret, const Argument* 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.set ((long_t)::_tsystem(ptr));
#elif defined(ASE_CHAR_IS_MCHAR)
return ret->set ((long_t)::system(ptr));
return ret.set ((long_t)::system(ptr));
#else
char* mbs = (char*)ase_awk_malloc (awk, l*5+1);
if (mbs == ASE_NULL) return -1;
::size_t mbl = ::wcstombs (mbs, ptr, l*5);
if (mbl == (::size_t)-1) return -1;
if (mbl == (::size_t)-1)
{
ase_awk_free (awk, mbs);
return -1;
}
mbs[mbl] = '\0';
int n = ret->set ((long_t)::system(mbs));
int n = ret.set ((long_t)::system(mbs));
ase_awk_free (awk, mbs);
return n;

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.hpp,v 1.15 2007/09/22 14:40:44 bacon Exp $
* $Id: StdAwk.hpp,v 1.16 2007/09/23 16:48:55 bacon Exp $
*/
#ifndef _ASE_AWK_STDAWK_HPP_
@ -25,35 +25,35 @@ public:
protected:
// intrinsic functions
int sin (Return* ret, const Argument* args, size_t nargs,
int sin (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int cos (Return* ret, const Argument* args, size_t nargs,
int cos (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int tan (Return* ret, const Argument* args, size_t nargs,
int tan (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int atan (Return* ret, const Argument* args, size_t nargs,
int atan (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int atan2 (Return* ret, const Argument* args, size_t nargs,
int atan2 (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int log (Return* ret, const Argument* args, size_t nargs,
int log (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int exp (Return* ret, const Argument* args, size_t nargs,
int exp (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int sqrt (Return* ret, const Argument* args, size_t nargs,
int sqrt (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int fnint (Return* ret, const Argument* args, size_t nargs,
int fnint (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int rand (Return* ret, const Argument* args, size_t nargs,
int rand (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int srand (Return* ret, const Argument* args, size_t nargs,
int srand (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int systime (Return* ret, const Argument* args, size_t nargs,
int systime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int strftime (Return* ret, const Argument* args, size_t nargs,
int strftime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int strfgmtime (Return* ret, const Argument* args, size_t nargs,
int strfgmtime (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
int system (Return* ret, const Argument* args, size_t nargs,
int system (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len);
// pipe io handlers

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c,v 1.8 2007/07/25 07:00:09 bacon Exp $
* $Id: awk.c,v 1.9 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -150,6 +150,18 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data)
awk->custom_data = custom_data;
if (ase_awk_initglobals (awk) == -1)
{
ase_awk_tab_close (&awk->parse.params);
ase_awk_tab_close (&awk->parse.locals);
ase_awk_tab_close (&awk->parse.globals);
ase_awk_map_close (awk->tree.afns);
ase_awk_map_close (awk->kwtab);
ase_str_close (&awk->token.name);
ASE_AWK_FREE (awk, awk);
return ASE_NULL;
}
return awk;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.h,v 1.11 2007/09/23 04:20:22 bacon Exp $
* $Id: awk.h,v 1.12 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -260,7 +260,7 @@ enum ase_awk_errnum_t
ASE_AWK_EBLKEND, /* END requires an action block */
ASE_AWK_EDUPBEG, /* duplicate BEGIN */
ASE_AWK_EDUPEND, /* duplicate END */
ASE_AWK_EBFNRED, /* builtin function redefined */
ASE_AWK_EBFNRED, /* intrinsic function redefined */
ASE_AWK_EAFNRED, /* function redefined */
ASE_AWK_EGBLRED, /* global variable redefined */
ASE_AWK_EPARRED, /* parameter redefined */
@ -292,7 +292,7 @@ enum ase_awk_errnum_t
ASE_AWK_EPOSIDX, /* wrong position index */
ASE_AWK_EARGTF, /* too few arguments */
ASE_AWK_EARGTM, /* too many arguments */
ASE_AWK_EFNNONE, /* no such function */
ASE_AWK_EFNNONE, /* "function '%.*s' not found" */
ASE_AWK_ENOTIDX, /* variable not indexable */
ASE_AWK_ENOTDEL, /* variable not deletable */
ASE_AWK_ENOTMAP, /* value not a map */
@ -311,8 +311,8 @@ enum ase_awk_errnum_t
ASE_AWK_ERNEXTEND, /* next called from END */
ASE_AWK_ERNEXTFBEG, /* nextfile called from BEGIN */
ASE_AWK_ERNEXTFEND, /* nextfile called from END */
ASE_AWK_EBFNUSER, /* wrong builtin function implementation */
ASE_AWK_EBFNIMPL, /* builtin function handler failed */
ASE_AWK_EBFNUSER, /* wrong intrinsic function implementation */
ASE_AWK_EBFNIMPL, /* intrinsic function handler failed */
ASE_AWK_EIOUSER, /* wrong user io handler implementation */
ASE_AWK_EIONONE, /* no such io name found */
ASE_AWK_EIOIMPL, /* i/o callback returned an error */
@ -425,8 +425,8 @@ int ase_awk_setword (ase_awk_t* awk,
int ase_awk_parse (ase_awk_t* awk, ase_awk_srcios_t* srcios);
/*
* Adds an intrinsic global variable. It should be called before a call
* to ase_awk_parse.
* Adds an intrinsic global variable. It should be called in
* add_globals_callback.
*
* @return
* On success, the ID of the global variable added is returned.
@ -434,6 +434,15 @@ int ase_awk_parse (ase_awk_t* awk, ase_awk_srcios_t* srcios);
*/
int ase_awk_addglobal (ase_awk_t* awk, const ase_char_t* name, ase_size_t len);
/*
* Deletes a instrinsic global variable.
*
* @return
* On success, 0 is returned.
* On failure, -1 is returned.
*/
int ase_awk_delglobal (ase_awk_t* awk, const ase_char_t* name, ase_size_t len);
/*
* ase_awk_run return 0 on success and -1 on failure, generally speaking.
* A runtime context is required for it to start running the program.
@ -458,8 +467,30 @@ int ase_awk_stop (ase_awk_run_t* run);
/* functions to access internal stack structure */
ase_size_t ase_awk_getnargs (ase_awk_run_t* run);
ase_awk_val_t* ase_awk_getarg (ase_awk_run_t* run, ase_size_t idx);
ase_awk_val_t* ase_awk_getglobal (ase_awk_run_t* run, ase_size_t idx);
int ase_awk_setglobal (ase_awk_run_t* run, ase_size_t idx, ase_awk_val_t* val);
/**
* Gets the value of a global variable.
*
* @param run A run-time context
* @param id The ID to a global variable.
* This value correspondsto the predefined global variable IDs or
* the value returned by ase_awk_addglobal.
* @return
* The pointer to a value is returned. This function never fails
* so long as id is valid. Otherwise, you may fall into trouble.
*/
ase_awk_val_t* ase_awk_getglobal (ase_awk_run_t* run, int id);
int ase_awk_setglobal (ase_awk_run_t* run, int id, ase_awk_val_t* val);
/**
* Sets the return value of a function from within a function handler.
*
* @param run A run-time context
* @param val A pointer to the value to set.
* ase_awk_refupval and ase_awk_refdownval are not needed because
* ase_awk_setretval never fails and it updates the reference count
* of the value properly.
*/
void ase_awk_setretval (ase_awk_run_t* run, ase_awk_val_t* val);
int ase_awk_setfilename (
@ -487,14 +518,14 @@ void ase_awk_setrunerror (
ase_awk_run_t* run, int errnum, ase_size_t errlin,
const ase_cstr_t* errarg, ase_size_t argcnt);
/* functions to manipulate built-in functions */
void* ase_awk_addbfn (
/* functions to manipulate intrinsic functions */
void* ase_awk_addfunc (
ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len,
int when_valid, ase_size_t min_args, ase_size_t max_args,
const ase_char_t* arg_spec,
int (*handler)(ase_awk_run_t*,const ase_char_t*,ase_size_t));
int ase_awk_delbfn (
int ase_awk_delfunc (
ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len);
void ase_awk_clrbfn (ase_awk_t* awk);

View File

@ -1,5 +1,5 @@
/*
* $Id: awk_i.h,v 1.6 2007/06/17 09:29:46 bacon Exp $
* $Id: awk_i.h,v 1.7 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -55,7 +55,7 @@ typedef struct ase_awk_tree_t ase_awk_tree_t;
struct ase_awk_tree_t
{
ase_size_t nglobals; /* total number of globals */
ase_size_t nbglobals; /* number of builtin globals */
ase_size_t nbglobals; /* number of intrinsic globals */
ase_cstr_t cur_afn;
ase_awk_map_t* afns; /* awk function map */
ase_awk_nde_t* begin;
@ -156,7 +156,7 @@ struct ase_awk_t
ase_size_t column;
} token;
/* builtin functions */
/* intrinsic functions */
struct
{
ase_awk_bfn_t* sys;

View File

@ -1,5 +1,5 @@
/*
* $Id: err.c,v 1.6 2007/08/24 13:17:59 bacon Exp $
* $Id: err.c,v 1.7 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -74,7 +74,7 @@ static const ase_char_t* __geterrstr (int errnum)
ASE_T("END not followed by a left bracket on the same line"),
ASE_T("duplicate BEGIN"),
ASE_T("duplicate END"),
ASE_T("built-in function '%.*s' redefined"),
ASE_T("intrinsic function '%.*s' redefined"),
ASE_T("function '%.*s' redefined"),
ASE_T("global variable '%.*s' redefined"),
ASE_T("parameter '%.*s' redefined"),
@ -123,8 +123,8 @@ static const ase_char_t* __geterrstr (int errnum)
ASE_T("next statement called from the END block"),
ASE_T("nextfile statement called from the BEGIN block"),
ASE_T("nextfile statement called from the END block"),
ASE_T("wrong implementation of built-in function handler"),
ASE_T("built-in function handler returned an error"),
ASE_T("wrong implementation of intrinsic function handler"),
ASE_T("intrinsic function handler returned an error"),
ASE_T("wrong implementation of user-defined io handler"),
ASE_T("no such io name found"),
ASE_T("i/o handler returned an error"),

View File

@ -1,5 +1,5 @@
/*
* $Id: func.c,v 1.8 2007/08/26 14:33:38 bacon Exp $
* $Id: func.c,v 1.9 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -43,7 +43,7 @@ static ase_awk_bfn_t __sys_bfn[] =
{ {ASE_NULL, 0}, 0, {0, 0, ASE_NULL}, ASE_NULL}
};
void* ase_awk_addbfn (
void* ase_awk_addfunc (
ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len,
int when_valid, ase_size_t min_args, ase_size_t max_args,
const ase_char_t* arg_spec,
@ -103,7 +103,8 @@ void* ase_awk_addbfn (
return p;
}
int ase_awk_delbfn (ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len)
int ase_awk_delfunc (
ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len)
{
ase_awk_bfn_t* p, * pp = ASE_NULL;
ase_cstr_t errarg;

View File

@ -1,5 +1,5 @@
/*
* $Id: jni.c,v 1.13 2007/08/26 14:33:38 bacon Exp $
* $Id: jni.c,v 1.14 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -1731,7 +1731,7 @@ static int __handle_bfn (
return 0;
}
JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc (
JNIEnv* env, jobject obj, jstring name, jint min_args, jint max_args)
{
jclass class;
@ -1786,13 +1786,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
}
for (i = 0; i < len; i++) tmp[i] = (ase_char_t)ptr[i];
n = (ase_awk_addbfn (awk, tmp, len, 0,
n = (ase_awk_addfunc (awk, tmp, len, 0,
min_args, max_args, ASE_NULL, __handle_bfn) == NULL)? -1: 0;
free (tmp);
}
else
{
n = (ase_awk_addbfn (awk, (ase_char_t*)ptr, len, 0,
n = (ase_awk_addfunc (awk, (ase_char_t*)ptr, len, 0,
min_args, max_args, ASE_NULL, __handle_bfn) == NULL)? -1: 0;
}
@ -1809,7 +1809,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
}
}
JNIEXPORT void JNICALL Java_ase_awk_Awk_delbfn (
JNIEXPORT void JNICALL Java_ase_awk_Awk_delfunc (
JNIEnv* env, jobject obj, jstring name)
{
jclass class;
@ -1863,12 +1863,12 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_delbfn (
}
for (i = 0; i < len; i++) tmp[i] = (ase_char_t)ptr[i];
n = ase_awk_delbfn (awk, tmp, len);
n = ase_awk_delfunc (awk, tmp, len);
free (tmp);
}
else
{
n = ase_awk_delbfn (awk, (ase_char_t*)ptr, len);
n = ase_awk_delfunc (awk, (ase_char_t*)ptr, len);
}
(*env)->ReleaseStringChars (env, name, ptr);

View File

@ -15,8 +15,8 @@ EXPORTS
Java_ase_awk_Awk_getdebug
Java_ase_awk_Awk_setdebug
Java_ase_awk_Awk_addbfn
Java_ase_awk_Awk_delbfn
Java_ase_awk_Awk_addfunc
Java_ase_awk_Awk_delfunc
Java_ase_awk_Awk_setfilename
Java_ase_awk_Awk_setofilename
Java_ase_awk_Awk_strtonum

View File

@ -1,5 +1,5 @@
/*
* $Id: jni.h,v 1.4 2007/06/24 11:14:58 bacon Exp $
* $Id: jni.h,v 1.5 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -23,9 +23,9 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (
JNIEnv* env, jobject obj, jstring mfn, jobjectArray args);
JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc (
JNIEnv* env, jobject obj, jstring name, jint min_args, jint max_args);
JNIEXPORT void JNICALL Java_ase_awk_Awk_delbfn (
JNIEXPORT void JNICALL Java_ase_awk_Awk_delfunc (
JNIEnv* env, jobject obj, jstring name);
JNIEXPORT jint JNICALL Java_ase_awk_Awk_getmaxdepth (

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c,v 1.13 2007/09/23 04:20:22 bacon Exp $
* $Id: parse.c,v 1.14 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -130,7 +130,8 @@ static int parse (ase_awk_t* awk);
static ase_awk_t* parse_progunit (ase_awk_t* awk);
static ase_awk_t* collect_globals (ase_awk_t* awk);
static ase_awk_t* add_builtin_globals (ase_awk_t* awk);
static int adjust_static_globals (ase_awk_t* awk);
static int add_global (
ase_awk_t* awk, const ase_char_t* name, ase_size_t len,
ase_size_t line, int force);
@ -479,7 +480,7 @@ static int parse (ase_awk_t* awk)
return -1;
}
if (add_builtin_globals (awk) == ASE_NULL)
if (adjust_static_globals (awk) == -1)
{
n = -1;
goto exit_parse;
@ -1247,7 +1248,39 @@ static ase_awk_nde_t* parse_block_dc (
return nde;
}
static ase_awk_t* add_builtin_globals (ase_awk_t* awk)
int ase_awk_initglobals (ase_awk_t* awk)
{
global_t* p = gtab;
int id;
/* ase_awk_initglobals is not generic-purpose. call this from
* ase_awk_open only. */
ASE_ASSERT (awk->tree.nbglobals == 0 && awk->tree.nglobals == 0);
awk->tree.nbglobals = 0;
while (p->name != ASE_NULL)
{
if (ase_awk_tab_add (
&awk->parse.globals, p->name, p->name_len) == (ase_size_t)-1)
{
return -1;
}
awk->tree.nbglobals++;
p++;
}
return 0;
}
static int adjust_static_globals (ase_awk_t* awk)
{
/* TODO: */
return 0;
}
#if 0
static ase_awk_t* add_static_globals (ase_awk_t* awk)
{
global_t* p = gtab;
int id;
@ -1258,11 +1291,14 @@ static ase_awk_t* add_builtin_globals (ase_awk_t* awk)
if (p->valid != 0 && (awk->option & p->valid) == 0)
{
#if 0
/* an invalid global variable are still added
* to the global variable table with an empty name.
* this is to prevent the run-time from looking up
* the variable */
id = add_global (awk, ASE_T(""), 0, 0, 1);
#endif
id = add_global (awk, p->name, p->name_len, 0, 1);
}
else
{
@ -1276,15 +1312,17 @@ static ase_awk_t* add_builtin_globals (ase_awk_t* awk)
return awk;
}
#endif
static int add_global (
ase_awk_t* awk, const ase_char_t* name, ase_size_t len,
ase_size_t line, int force)
ase_size_t line, int disabled)
{
ase_size_t nglobals;
/*
if (!force)
{
{*/
if (awk->option & ASE_AWK_UNIQUEFN)
{
/* check if it conflict with a builtin function name */
@ -1314,7 +1352,7 @@ static int add_global (
SETERRARG (awk, ASE_AWK_EDUPGBL, line, name, len);
return -1;
}
}
/*}*/
nglobals = ase_awk_tab_getsize (&awk->parse.globals);
if (nglobals >= ASE_AWK_MAX_GLOBALS)
@ -1329,6 +1367,10 @@ static int add_global (
return -1;
}
/* the disabled item is inserted normally but
* the name length is reset to zero. */
if (disabled) awk->parse.globals.buf[nglobals].name.len = 0;
/* return the id which is the index to the global table. */
return (int)nglobals;
}
@ -1339,6 +1381,30 @@ int ase_awk_addglobal (
return add_global (awk, name, len, 0, 0);
}
int ase_awk_delglobal (
ase_awk_t* awk, const ase_char_t* name, ase_size_t len)
{
ase_size_t n;
n = ase_awk_tab_find (&awk->parse.globals, 0, name, len);
if (n == (ase_size_t)-1)
{
SETERRARG (awk, ASE_AWK_ENOENT, 0, name, len);
return -1;
}
/* clear the name to emulate the action. this approach is
* in align with ase_awk_addglobal adding an ineffective global.
* anyway, this function cannot physically remove the entry
* because the existing global ID's known can all go wrong if
* it does so. the best is not to use this function as a normal
* program has no reason to do so. */
awk->parse.globals.buf[n].name.ptr[0] = ASE_T('\0');;
awk->parse.globals.buf[n].name.len = 0;
return 0;
}
static ase_awk_t* collect_globals (ase_awk_t* awk)
{
while (1)
@ -2794,7 +2860,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
return ASE_NULL;
}
/* check if name_dup is a built-in function name */
/* check if name_dup is an intrinsic function name */
bfn = ase_awk_getbfn (awk, name_dup, name_len);
if (bfn != ASE_NULL)
{
@ -2802,7 +2868,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line)
if (!MATCH(awk,TOKEN_LPAREN))
{
/* built-in function should be in the form
/* an intrinsic function should be in the form
* of the function call */
ASE_AWK_FREE (awk, name_dup);
@ -4958,8 +5024,8 @@ static int deparse (ase_awk_t* awk)
}
*/
if (ase_awk_putsrcstrx (awk,
awk->parse.globals.buf[i].name,
awk->parse.globals.buf[i].name_len) == -1)
awk->parse.globals.buf[i].name.ptr,
awk->parse.globals.buf[i].name.len) == -1)
{
EXIT_DEPARSE ();
}
@ -4978,8 +5044,8 @@ static int deparse (ase_awk_t* awk)
}
*/
if (ase_awk_putsrcstrx (awk,
awk->parse.globals.buf[i].name,
awk->parse.globals.buf[i].name_len) == -1)
awk->parse.globals.buf[i].name.ptr,
awk->parse.globals.buf[i].name.len) == -1)
{
EXIT_DEPARSE ();
}

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.h,v 1.3 2007/04/30 05:47:33 bacon Exp $
* $Id: parse.h,v 1.4 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -22,6 +22,8 @@ int ase_awk_putsrcstrx (
const ase_char_t* ase_awk_getglobalname (
ase_awk_t* awk, ase_size_t idx, ase_size_t* len);
int ase_awk_initglobals (ase_awk_t* awk);
#ifdef __cplusplus
}
#endif

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c,v 1.11 2007/08/26 14:33:38 bacon Exp $
* $Id: run.c,v 1.12 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -223,14 +223,18 @@ ase_awk_val_t* ase_awk_getarg (ase_awk_run_t* run, ase_size_t idx)
return STACK_ARG (run, idx);
}
ase_awk_val_t* ase_awk_getglobal (ase_awk_run_t* run, ase_size_t idx)
ase_awk_val_t* ase_awk_getglobal (ase_awk_run_t* run, int id)
{
return STACK_GLOBAL (run, idx);
ASE_ASSERTX (id >= 0,
"a global variable ID should be equal to or greater than 0");
return STACK_GLOBAL (run, id);
}
int ase_awk_setglobal (ase_awk_run_t* run, ase_size_t idx, ase_awk_val_t* val)
int ase_awk_setglobal (ase_awk_run_t* run, int id, ase_awk_val_t* val)
{
return __set_global (run, idx, ASE_NULL, val);
ASE_ASSERTX (id >= 0,
"a global variable ID should be equal to or greater than 0");
return __set_global (run, (ase_size_t)id, ASE_NULL, val);
}
static int __set_global (
@ -5207,7 +5211,7 @@ static ase_awk_val_t* __eval_bfn (ase_awk_run_t* run, ase_awk_nde_t* nde)
{
ase_awk_nde_call_t* call = (ase_awk_nde_call_t*)nde;
/* built-in function */
/* intrinsic function */
if (call->nargs < call->what.bfn.arg.min)
{
ase_awk_setrunerror (
@ -5477,7 +5481,7 @@ static ase_awk_val_t* __eval_call (
{
n = 0;
/* built-in function */
/* intrinsic function */
ASE_ASSERT (
call->nargs >= call->what.bfn.arg.min &&
call->nargs <= call->what.bfn.arg.max);

View File

@ -1,5 +1,5 @@
/*
* $Id: run.h,v 1.4 2007/09/23 04:20:22 bacon Exp $
* $Id: run.h,v 1.5 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -100,7 +100,9 @@ enum ase_awk_global_id_t
ASE_AWK_GLOBAL_RLENGTH,
ASE_AWK_GLOBAL_RS,
ASE_AWK_GLOBAL_RSTART,
ASE_AWK_GLOBAL_SUBSEP
ASE_AWK_GLOBAL_SUBSEP,
ASE_AWK_GLOBAL_MAX /* this is not the actual id. used internally */
};
#ifdef __cplusplus

View File

@ -1,5 +1,5 @@
/*
* $Id: tab.c,v 1.3 2007/04/30 05:47:33 bacon Exp $
* $Id: tab.c,v 1.4 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -100,9 +100,9 @@ void ase_awk_tab_clear (ase_awk_tab_t* tab)
for (i = 0; i < tab->size; i++)
{
ASE_AWK_FREE (tab->awk, tab->buf[i].name);
tab->buf[i].name = ASE_NULL;
tab->buf[i].name_len = 0;
ASE_AWK_FREE (tab->awk, tab->buf[i].name.ptr);
tab->buf[i].name.ptr = ASE_NULL;
tab->buf[i].name.len = 0;
}
tab->size = 0;
@ -114,10 +114,10 @@ ase_size_t ase_awk_tab_insert (
const ase_char_t* str, ase_size_t len)
{
ase_size_t i;
ase_char_t* str_dup;
ase_char_t* dup;
str_dup = ase_strxdup (str, len, &tab->awk->prmfns.mmgr);
if (str_dup == ASE_NULL) return (ase_size_t)-1;
dup = ase_strxdup (str, len, &tab->awk->prmfns.mmgr);
if (dup == ASE_NULL) return (ase_size_t)-1;
if (index >= tab->capa)
{
@ -131,14 +131,14 @@ ase_size_t ase_awk_tab_insert (
if (ase_awk_tab_setcapa(tab,capa) == ASE_NULL)
{
ASE_AWK_FREE (tab->awk, str_dup);
ASE_AWK_FREE (tab->awk, dup);
return (ase_size_t)-1;
}
}
for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1];
tab->buf[index].name = str_dup;
tab->buf[index].name_len = len;
tab->buf[index].name.ptr = dup;
tab->buf[index].name.len = len;
if (index > tab->size) tab->size = index + 1;
else tab->size++;
@ -160,18 +160,18 @@ ase_size_t ase_awk_tab_remove (
while (i < k)
{
ASE_AWK_FREE (tab->awk, tab->buf[i].name);
ASE_AWK_FREE (tab->awk, tab->buf[i].name.ptr);
if (j >= tab->size)
{
tab->buf[i].name = ASE_NULL;
tab->buf[i].name_len = 0;
tab->buf[i].name.ptr = ASE_NULL;
tab->buf[i].name.len = 0;
i++;
}
else
{
tab->buf[i].name = tab->buf[j].name;
tab->buf[i].name_len = tab->buf[j].name_len;
tab->buf[i].name.ptr = tab->buf[j].name.ptr;
tab->buf[i].name.len = tab->buf[j].name.len;
i++; j++;
}
}
@ -195,7 +195,7 @@ ase_size_t ase_awk_tab_find (
for (i = index; i < tab->size; i++)
{
if (ase_strxncmp (
tab->buf[i].name, tab->buf[i].name_len,
tab->buf[i].name.ptr, tab->buf[i].name.len,
str, len) == 0) return i;
}
@ -213,7 +213,7 @@ ase_size_t ase_awk_tab_rfind (
for (i = index + 1; i-- > 0; )
{
if (ase_strxncmp (
tab->buf[i].name, tab->buf[i].name_len,
tab->buf[i].name.ptr, tab->buf[i].name.len,
str, len) == 0) return i;
}
@ -231,7 +231,7 @@ ase_size_t ase_awk_tab_rrfind (
for (i = tab->size - index; i-- > 0; )
{
if (ase_strxncmp (
tab->buf[i].name, tab->buf[i].name_len,
tab->buf[i].name.ptr, tab->buf[i].name.len,
str, len) == 0) return i;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: tab.h,v 1.3 2007/04/30 05:47:33 bacon Exp $
* $Id: tab.h,v 1.4 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -20,8 +20,11 @@ struct ase_awk_tab_t
{
struct
{
ase_char_t* name;
ase_size_t name_len;
struct
{
ase_char_t* ptr;
ase_size_t len;
} name;
}* buf;
ase_size_t size;
ase_size_t capa;

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.h,v 1.3 2007/04/30 05:47:33 bacon Exp $
* $Id: tree.h,v 1.4 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -263,7 +263,7 @@ struct ase_awk_nde_call_t
} name;
} afn;
/* minimum information of a built-in function
/* minimum information of a intrinsic function
* needed during run-time. */
struct
{

View File

@ -1,5 +1,5 @@
/*
* $Id: val.c,v 1.7 2007/07/25 07:00:09 bacon Exp $
* $Id: val.c,v 1.8 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -275,7 +275,7 @@ ase_awk_val_t* ase_awk_makerefval (ase_awk_run_t* run, int id, ase_awk_val_t** a
return (ase_awk_val_t*)val;
}
ase_bool_t ase_awk_isbuiltinval (ase_awk_val_t* val)
ase_bool_t ase_awk_isstaticval (ase_awk_val_t* val)
{
return val == ASE_NULL ||
val == ase_awk_val_nil ||
@ -288,7 +288,7 @@ ase_bool_t ase_awk_isbuiltinval (ase_awk_val_t* val)
void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache)
{
if (ase_awk_isbuiltinval(val)) return;
if (ase_awk_isstaticval(val)) return;
#ifdef DEBUG_VAL
ase_dprintf (ASE_T("freeing [cache=%d] ... "), cache);
@ -356,7 +356,7 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache)
void ase_awk_refupval (ase_awk_run_t* run, ase_awk_val_t* val)
{
if (ase_awk_isbuiltinval(val)) return;
if (ase_awk_isstaticval(val)) return;
#ifdef DEBUG_VAL
ase_dprintf (ASE_T("ref up [ptr=%p] [count=%d] "), val, (int)val->ref);
@ -369,7 +369,7 @@ void ase_awk_refupval (ase_awk_run_t* run, ase_awk_val_t* val)
void ase_awk_refdownval (ase_awk_run_t* run, ase_awk_val_t* val)
{
if (ase_awk_isbuiltinval(val)) return;
if (ase_awk_isstaticval(val)) return;
#ifdef DEBUG_VAL
ase_dprintf (ASE_T("ref down [ptr=%p] [count=%d]\n"), val, (int)val->ref);
@ -389,7 +389,7 @@ void ase_awk_refdownval (ase_awk_run_t* run, ase_awk_val_t* val)
void ase_awk_refdownval_nofree (ase_awk_run_t* run, ase_awk_val_t* val)
{
if (ase_awk_isbuiltinval(val)) return;
if (ase_awk_isstaticval(val)) return;
ASE_ASSERTX (val->ref > 0,
"the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs");

View File

@ -1,5 +1,5 @@
/*
* $Id: val.h,v 1.5 2007/05/10 16:08:37 bacon Exp $
* $Id: val.h,v 1.6 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -177,7 +177,7 @@ ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run);
ase_awk_val_t* ase_awk_makerefval (
ase_awk_run_t* run, int id, ase_awk_val_t** adr);
ase_bool_t ase_awk_isbuiltinval (ase_awk_val_t* val);
ase_bool_t ase_awk_isstaticval (ase_awk_val_t* val);
void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache);
void ase_awk_refupval (ase_awk_run_t* run, ase_awk_val_t* val);

View File

@ -2,9 +2,16 @@
* changed the access modifier for the Awk::Source::Source from public
to protected.
* added source code documentation of ase/Awk/Awk.hpp.
* added ase_awk_addglobal to support the addition of a user-defined
global variable (awk/parse.c)
* started adding the source code documentation of awk/Awk.hpp.
* added to the awk interpreter the capibility to add a global variable.
- ase_awk_addglobal (awk/parse.c)
- Awk::addGlobal (awk/Awk.cpp)
* enhanced Awk::dispatchFunction to set more specific error code (awk/Awk.cpp)
* renamed ase_awk_addbfn & ase_awk_delbfn to ase_awk_addfunc & ase_awk_delfunc
respectively.
[0.3.0]

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp,v 1.7 2007/08/26 14:33:38 bacon Exp $
* $Id: Awk.cpp,v 1.8 2007/09/23 16:48:55 bacon Exp $
*
* {License}
*/
@ -555,7 +555,7 @@ HRESULT CAwk::Parse (VARIANT_BOOL* ret)
for (bfn_t* bfn = bfn_list; bfn != NULL; bfn = bfn->next)
{
if (ase_awk_addbfn (
if (ase_awk_addfunc (
handle, bfn->name.ptr, bfn->name.len, 0,
bfn->min_args, bfn->max_args, NULL,
__handle_bfn) == NULL)

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp,v 1.23 2007/09/06 08:44:42 bacon Exp $
* $Id: Awk.cpp,v 1.24 2007/09/23 16:48:55 bacon Exp $
*/
#include "stdafx.h"
@ -214,6 +214,22 @@ namespace ASE
}
}
int addGlobal (ASE::Net::Awk^ wrapper, const char_t* name)
{
this->wrapper = wrapper;
int n = Awk::addGlobal (name);
this->wrapper = nullptr;
return n;
}
int deleteGlobal (ASE::Net::Awk^ wrapper, const char_t* name)
{
this->wrapper = wrapper;
int n = Awk::deleteGlobal (name);
this->wrapper = nullptr;
return n;
}
int addFunction (
ASE::Net::Awk^ wrapper, const char_t* name,
size_t minArgs, size_t maxArgs, FunctionHandler handler)
@ -233,11 +249,11 @@ namespace ASE
}
int mojoFunctionHandler (
Return* ret, const Argument* args, size_t nargs,
Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
return wrapper->DispatchFunction (ret, args, nargs, name, len)? 0: -1;
return wrapper->DispatchFunction (run, ret, args, nargs, name, len)? 0: -1;
}
int openSource (Source& io)
@ -833,6 +849,40 @@ namespace ASE
stopRequested = true;
}
bool Awk::AddGlobal (System::String^ name, [System::Runtime::InteropServices::Out] int% id)
{
if (awk == NULL)
{
setError (ERROR::NOPER);
return -1;
}
cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(name);
int n = awk->addGlobal (this, nptr);
if (n == -1)
{
retrieveError ();
return false;
}
id = n;
return true;
}
bool Awk::DeleteGlobal (System::String^ name)
{
if (awk == NULL)
{
setError (ERROR::NOPER);
return false;
}
cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(name);
int n = awk->deleteGlobal (this, nptr);
if (n == -1) retrieveError ();
return n == 0;
}
bool Awk::AddFunction (
System::String^ name, int minArgs, int maxArgs,
FunctionHandler^ handler)
@ -864,7 +914,8 @@ namespace ASE
return n == 0;
}
bool Awk::DispatchFunction (ASE::Awk::Return* ret,
bool Awk::DispatchFunction (
ASE::Awk::Run& run, ASE::Awk::Return& ret,
const ASE::Awk::Argument* args, size_t nargs,
const char_t* name, size_t len)
{
@ -878,10 +929,12 @@ namespace ASE
}
cli::array<Argument^>^ arg_arr = gcnew cli::array<Argument^> (nargs);
for (size_t i = 0; i < nargs; i++) arg_arr[i] = gcnew Argument(args[i]);
for (size_t i = 0; i < nargs; i++)
arg_arr[i] = gcnew Argument(args[i]);
Return^ r = gcnew Return (*ret);
return fh(nm, arg_arr, r);
Return^ r = gcnew Return (ret);
return fh (nm, arg_arr, r);
}
bool Awk::SetWord (System::String^ ow, System::String^ nw)

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.hpp,v 1.21 2007/09/06 08:44:42 bacon Exp $
* $Id: Awk.hpp,v 1.22 2007/09/23 16:48:55 bacon Exp $
*/
#pragma once
@ -485,10 +485,13 @@ namespace ASE
/*event*/ RunReturnHandler^ OnRunReturn;
/*event*/ RunStatementHandler^ OnRunStatement;
virtual bool AddGlobal (System::String^ name, [System::Runtime::InteropServices::Out] int% id);
virtual bool DeleteGlobal (System::String^ name);
delegate bool FunctionHandler (System::String^ name, cli::array<Argument^>^ args, Return^ ret);
virtual bool AddFunction (System::String^ name, int minArgs, int maxArgs, FunctionHandler^ handler);
virtual bool DeleteFunction (System::String^ name);
virtual bool SetWord (System::String^ ow, System::String^ nw);
virtual bool UnsetWord (System::String^ ow);
virtual bool UnsetAllWords ();
@ -562,7 +565,8 @@ namespace ASE
virtual int NextConsole (Console^ console) = 0;
public protected:
bool Awk::DispatchFunction (ASE::Awk::Return* ret,
bool Awk::DispatchFunction (
ASE::Awk::Run& run, ASE::Awk::Return& ret,
const ASE::Awk::Argument* args, size_t nargs,
const char_t* name, size_t len);

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp,v 1.32 2007/08/26 14:33:38 bacon Exp $
* $Id: Awk.cpp,v 1.33 2007/09/23 16:48:55 bacon Exp $
*/
#include <ase/awk/StdAwk.hpp>
@ -46,8 +46,10 @@ public:
int n = ASE::StdAwk::open ();
#endif
if (addFunction (ASE_T("sleep"), 1, 1,
(FunctionHandler)&TestAwk::sleep) == -1)
idLastSleep = addGlobal (ASE_T("LAST_SLEEP"));
if (idLastSleep == -1 ||
addFunction (ASE_T("sleep"), 1, 1,
(FunctionHandler)&TestAwk::sleep) == -1)
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
StdAwk::close ();
@ -85,14 +87,16 @@ public:
#endif
}
int sleep (Return* ret, const Argument* args, size_t nargs,
int sleep (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
long_t x = args[0].toInt();
run.setGlobal (idLastSleep, x);
#ifdef _WIN32
::Sleep (args[0].toInt() * 1000);
return ret->set ((long_t)0);
::Sleep (x * 1000);
return ret.set ((long_t)0);
#else
return ret->set ((long_t)::sleep (args[0].toInt()));
return ret.set ((long_t)::sleep (x));
#endif
}
@ -467,6 +471,8 @@ private:
size_t numConOutFiles;
const char_t* conOutFile[128];
int idLastSleep;
#ifdef _WIN32
void* heap;
#endif
@ -567,6 +573,10 @@ int awk_main (int argc, ase_char_t* argv[])
{
awk.setOption (awk.getOption () & ~TestAwk::OPT_STRIPSPACES);
}
else if (ase_strcmp(argv[i], ASE_T("-noimplicit")) == 0)
{
awk.setOption (awk.getOption () & ~TestAwk::OPT_IMPLICIT);
}
else
{
print_usage (argv[0]);
@ -712,7 +722,6 @@ extern "C" int ase_main (int argc, ase_achar_t* argv[])
_CrtSetDbgFlag (_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
#endif
n = ase_runmain (argc,argv,awk_main);
#if defined(__linux) && defined(_DEBUG)

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c,v 1.14 2007/09/05 14:42:06 bacon Exp $
* $Id: awk.c,v 1.15 2007/09/23 16:48:55 bacon Exp $
*/
#include <ase/awk/awk.h>
@ -1058,7 +1058,7 @@ static int awk_main (int argc, ase_char_t* argv[])
app_awk = awk;
if (ase_awk_addbfn (awk,
if (ase_awk_addfunc (awk,
ASE_T("sleep"), 5, 0,
1, 1, ASE_NULL, bfn_sleep) == ASE_NULL)
{

Binary file not shown.