Recovered from cvs revision 2007-08-20 14:19:00

This commit is contained in:
hyung-hwan 2007-08-20 23:27:00 +00:00
parent 153b5c7b45
commit 72c5c9174c
6 changed files with 258 additions and 64 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.cpp,v 1.47 2007/07/25 07:00:09 bacon Exp $ * $Id: Awk.cpp,v 1.48 2007/08/18 15:41:46 bacon Exp $
*/ */
#include <ase/awk/Awk.hpp> #include <ase/awk/Awk.hpp>
@ -327,7 +327,7 @@ namespace ASE
return 0; return 0;
} }
int Awk::Return::set (char_t* ptr, size_t len) int Awk::Return::set (const char_t* ptr, size_t len)
{ {
awk_t* awk = ase_awk_getrunawk(this->run); awk_t* awk = ase_awk_getrunawk(this->run);
char_t* tmp = ase_awk_strxdup (awk, ptr, len); char_t* tmp = ase_awk_strxdup (awk, ptr, len);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp,v 1.45 2007/07/15 16:31:59 bacon Exp $ * $Id: Awk.hpp,v 1.46 2007/08/18 15:41:46 bacon Exp $
*/ */
#ifndef _ASE_AWK_AWK_HPP_ #ifndef _ASE_AWK_AWK_HPP_
@ -185,7 +185,7 @@ namespace ASE
public: public:
int set (long_t v); int set (long_t v);
int set (real_t v); int set (real_t v);
int set (char_t* ptr, size_t len); int set (const char_t* ptr, size_t len);
void clear (); void clear ();
protected: protected:

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.cpp,v 1.14 2007/08/16 15:19:37 bacon Exp $ * $Id: Awk.cpp,v 1.16 2007/08/18 15:42:04 bacon Exp $
*/ */
#include "stdafx.h" #include "stdafx.h"
@ -17,24 +17,89 @@ using System::Runtime::InteropServices::GCHandle;
namespace ASE namespace ASE
{ {
class StubAwk: public Awk
class MojoAwk: protected Awk
{ {
public: public:
StubAwk (Net::Awk^ wrapper): wrapper(wrapper) MojoAwk (): wrapper(nullptr)
{ {
} }
~StubAwk () ~MojoAwk ()
{ {
wrapper = nullptr;
} }
int stubFunctionHandler ( int open (ASE::Net::Awk^ wrapper)
{
this->wrapper = wrapper;
int n = Awk::open ();
this->wrapper = nullptr;
return n;
}
void close (ASE::Net::Awk^ wrapper)
{
this->wrapper = wrapper;
Awk::close ();
this->wrapper = nullptr;
}
int getOption (ASE::Net::Awk^ wrapper) const
{
this->wrapper = wrapper;
int n = Awk::getOption ();
this->wrapper = nullptr;
return n;
}
void setOption (ASE::Net::Awk^ wrapper, int opt)
{
this->wrapper = wrapper;
Awk::setOption (opt);
this->wrapper = nullptr;
}
int parse (ASE::Net::Awk^ wrapper)
{
this->wrapper = wrapper;
int n = Awk::parse ();
this->wrapper = nullptr;
return n;
}
int run (ASE::Net::Awk^ wrapper, const char_t* main = ASE_NULL,
const char_t** args = ASE_NULL, size_t nargs = 0)
{
this->wrapper = wrapper;
int n = Awk::run (main, args, nargs);
this->wrapper = nullptr;
return n;
}
int addFunction (
ASE::Net::Awk^ wrapper, const char_t* name,
size_t minArgs, size_t maxArgs, FunctionHandler handler)
{
this->wrapper = wrapper;
int n = Awk::addFunction (name, minArgs, maxArgs, handler);
this->wrapper = nullptr;
return n;
}
int deleteFunction (ASE::Net::Awk^ wrapper, const char_t* main)
{
this->wrapper = wrapper;
int n = Awk::deleteFunction (main);
this->wrapper = nullptr;
return n;
}
int mojoFunctionHandler (
Return* ret, const Argument* args, size_t nargs, Return* ret, const Argument* args, size_t nargs,
const char_t* name, size_t len) const char_t* name, size_t len)
{ {
System::String^ nm = gcnew System::String (name, 0, len);
return wrapper->DispatchFunction (nm); return wrapper->DispatchFunction (ret, args, nargs, name, len);
} }
int openSource (Source& io) int openSource (Source& io)
@ -119,7 +184,6 @@ namespace ASE
gh.Free (); gh.Free ();
io.setHandle (NULL); io.setHandle (NULL);
return -1; return -1;
} }
} }
@ -393,58 +457,54 @@ namespace ASE
ase_vfprintf (stderr, fmt, arg); ase_vfprintf (stderr, fmt, arg);
} }
public: protected:
//msclr::auto_gcroot<ASE::Net::Awk^> wrapper; //msclr::auto_gcroot<ASE::Net::Awk^> wrapper;
gcroot<ASE::Net::Awk^> wrapper; mutable gcroot<ASE::Net::Awk^> wrapper;
}; };
namespace Net namespace Net
{ {
Awk::Awk () Awk::Awk ()
{ {
awk = new ASE::StubAwk (this); funcs = gcnew System::Collections::Hashtable();
if (awk->open () == -1)
awk = new ASE::MojoAwk ();
if (awk->open (this) == -1)
{ {
// TODO:... // TODO:...
//throw new AwkException ("cannot open awk"); //throw new AwkException ("cannot open awk");
} }
option = (OPTION)(awk->getOption () | awk->OPT_CRLF); //option = (OPTION)(awk->getOption (this) | MojoAwk::OPT_CRLF);
awk->setOption ((int)option); option = (OPTION)(awk->getOption (this) | ASE::Awk::OPT_CRLF);
awk->setOption (this, (int)option);
} }
Awk::~Awk () Awk::~Awk ()
{ {
System::Diagnostics::Debug::Print ("Awk::~Awk"); System::Diagnostics::Debug::Print ("Awk::~Awk");
/*if (awk != NULL)
{
awk->close ();
ASE::Awk* tmp = awk;
awk = NULL;
delete tmp;
}*/
if (awk != NULL) if (awk != NULL)
{ {
awk->close (); awk->close (this);
delete awk; delete awk;
awk = NULL; awk = NULL;
} }
if (funcs != nullptr)
{
funcs->Clear ();
delete funcs;
funcs = nullptr;
}
} }
Awk::!Awk () Awk::!Awk ()
{ {
System::Diagnostics::Debug::Print ("Awk::!Awk"); System::Diagnostics::Debug::Print ("Awk::!Awk");
/*
if (awk != NULL) if (awk != NULL)
{ {
awk->close (); awk->close (this);
ASE::Awk* tmp = awk;
awk = NULL;
delete tmp;
}*/
if (awk != NULL)
{
awk->close ();
delete awk; delete awk;
awk = NULL; awk = NULL;
} }
@ -452,55 +512,120 @@ System::Diagnostics::Debug::Print ("Awk::!Awk");
Awk::OPTION Awk::Option::get () Awk::OPTION Awk::Option::get ()
{ {
if (awk != NULL) this->option = (OPTION)awk->getOption (); if (awk != NULL) this->option = (OPTION)awk->getOption (this);
return this->option; return this->option;
} }
void Awk::Option::set (Awk::OPTION opt) void Awk::Option::set (Awk::OPTION opt)
{ {
this->option = opt; this->option = opt;
if (awk != NULL) awk->setOption ((int)this->option); if (awk != NULL) awk->setOption (this, (int)this->option);
} }
void Awk::Close () void Awk::Close ()
{ {
System::Diagnostics::Debug::Print ("Awk::Close"); if (awk != NULL) awk->close (this);
if (awk != NULL)
{
awk->close ();
// TODO: ....
((StubAwk*)awk)->wrapper =nullptr;
}
} }
bool Awk::Parse () bool Awk::Parse ()
{ {
return awk->parse () == 0; if (awk == NULL) return false;
return awk->parse (this) == 0;
} }
bool Awk::Run () bool Awk::Run ()
{ {
return awk->run () == 0; if (awk == NULL) return false;
return awk->run (this) == 0;
} }
bool Awk::AddFunction ( bool Awk::AddFunction (
System::String^ name, int minArgs, int maxArgs, System::String^ name, int minArgs, int maxArgs,
FunctionHandler^ handler) FunctionHandler^ handler)
{ {
cli::pin_ptr<const wchar_t> nptr = PtrToStringChars(name); cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(name);
return awk->addFunction (nptr, minArgs, maxArgs, int n = awk->addFunction (this, nptr, minArgs, maxArgs,
(ASE::Awk::FunctionHandler)&StubAwk::stubFunctionHandler) == 0; (ASE::Awk::FunctionHandler)&MojoAwk::mojoFunctionHandler);
if (n == 0) funcs->Add(name, handler);
return n == 0;
} }
bool Awk::DeleteFunction (System::String^ name) bool Awk::DeleteFunction (System::String^ name)
{ {
cli::pin_ptr<const wchar_t> nptr = PtrToStringChars(name); cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(name);
return awk->deleteFunction (nptr) == 0; int n = awk->deleteFunction (this, nptr);
if (n == 0) funcs->Remove (name);
return n == 0;
} }
int Awk::DispatchFunction (System::String^ name) int Awk::DispatchFunction (ASE::Awk::Return* ret,
const ASE::Awk::Argument* args, size_t nargs,
const char_t* name, size_t len)
{ {
System::String^ nm = gcnew System::String (name, 0, len);
FunctionHandler^ fh = (FunctionHandler^)funcs[nm];
if (fh == nullptr) return -1;
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]);
System::Object^ r = fh (nm, arg_arr);
if (r == nullptr) return -1;
System::Type^ type = r->GetType();
if (System::String::typeid == type)
{
System::String^ str = (System::String^)r;
cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(str);
ret->set (nptr, str->Length);
}
else if (System::SByte::typeid == type)
{
ret->set ((ASE::Awk::long_t)(__int8)r);
}
else if (System::Int16::typeid == type)
{
ret->set ((ASE::Awk::long_t)(__int16)r);
}
else if (System::Int32::typeid == type)
{
ret->set ((ASE::Awk::long_t)(__int32)r);
}
else if (System::Int64::typeid == type)
{
ret->set ((ASE::Awk::long_t)(__int64)r);
}
else if (System::Byte::typeid == type)
{
ret->set ((ASE::Awk::long_t)(unsigned __int8)r);
}
else if (System::UInt16::typeid == type)
{
ret->set ((ASE::Awk::long_t)(unsigned __int16)r);
}
else if (System::UInt32::typeid == type)
{
ret->set ((ASE::Awk::long_t)(unsigned __int32)r);
}
else if (System::UInt64::typeid == type)
{
ret->set ((ASE::Awk::long_t)(unsigned __int64)r);
}
else if (System::Single::typeid == type)
{
ret->set ((ASE::Awk::real_t)(float)r);
}
else if (System::Double::typeid == type)
{
ret->set ((ASE::Awk::real_t)(double)r);
}
else
{
System::String^ str = r->ToString();
cli::pin_ptr<const ASE::Awk::char_t> nptr = PtrToStringChars(str);
ret->set (nptr, str->Length);
}
return 0; return 0;
} }

View File

@ -1,21 +1,81 @@
/* /*
* $Id: Awk.hpp,v 1.11 2007/08/15 15:25:06 bacon Exp $ * $Id: Awk.hpp,v 1.13 2007/08/18 15:42:04 bacon Exp $
*/ */
#pragma once #pragma once
#include <ase/awk/Awk.hpp> #include <ase/awk/Awk.hpp>
#include <vcclr.h>
using namespace System; using namespace System;
namespace ASE namespace ASE
{ {
class MojoAwk;
namespace Net namespace Net
{ {
public ref class Awk abstract public ref class Awk abstract
{ {
public: public:
typedef ASE::Awk::long_t long_t;
typedef ASE::Awk::real_t real_t;
typedef ASE::Awk::char_t char_t;
typedef ASE::Awk::size_t size_t;
ref class Argument
{
public protected:
Argument (const ASE::Awk::Argument& arg)
{
size_t len;
const char_t* s = arg.toStr(&len);
str = gcnew System::String (s, 0, len);
inum = arg.toInt ();
rnum = arg.toReal ();
}
public:
long_t ToInt () { return inum; }
real_t ToReal () { return rnum; }
System::String^ ToStr () { return str; }
protected:
long_t inum;
real_t rnum;
System::String^ str;
};
ref class Return
{
public protected:
Return (ASE::Awk::Return& ret): ret (ret)
{
}
property System::Object^ Value
{
void set (System::String^ v)
{
cli::pin_ptr<const char_t> nptr = PtrToStringChars(v);
ret.set (nptr, v->Length);
}
void set (System::Single^ v)
{
ret.set ((real_t)(float)v);
}
void set (System::Double^ v)
{
ret.set ((real_t)(double)v);
}
}
public:
ASE::Awk::Return& ret;
};
ref class Source ref class Source
{ {
public: public:
@ -173,7 +233,7 @@ namespace ASE
bool Parse (); bool Parse ();
bool Run (); bool Run ();
delegate System::Object^ FunctionHandler (array<System::Object^>^ args); delegate System::Object^ FunctionHandler (System::String^ name, array<Argument^>^ args);
bool AddFunction (System::String^ name, int minArgs, int maxArgs, FunctionHandler^ handler); bool AddFunction (System::String^ name, int minArgs, int maxArgs, FunctionHandler^ handler);
bool DeleteFunction (System::String^ name); bool DeleteFunction (System::String^ name);
@ -185,8 +245,9 @@ namespace ASE
} }
protected: protected:
ASE::Awk* awk; MojoAwk* awk;
OPTION option; OPTION option;
System::Collections::Hashtable^ funcs;
public protected: public protected:
// Source // Source
@ -226,7 +287,9 @@ namespace ASE
virtual int NextConsole (Console^ console) = 0; virtual int NextConsole (Console^ console) = 0;
public protected: public protected:
int DispatchFunction (System::String^ name); int Awk::DispatchFunction (ASE::Awk::Return* ret,
const ASE::Awk::Argument* args, size_t nargs,
const char_t* name, size_t len);
}; };
} }

View File

@ -335,7 +335,7 @@ namespace asetestnet
this.Controls.Add(this.panel2); this.Controls.Add(this.panel2);
this.Controls.Add(this.statusStrip1); this.Controls.Add(this.statusStrip1);
this.Name = "AwkForm"; this.Name = "AwkForm";
this.Text = "ASE.CNT.AWK"; this.Text = "ASE.NET.AWK";
this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false);
this.panel1.ResumeLayout(false); this.panel1.ResumeLayout(false);
this.panel1.PerformLayout(); this.panel1.PerformLayout();

View File

@ -16,16 +16,22 @@ namespace asetestnet
InitializeComponent(); InitializeComponent();
} }
object sin(string name, ASE.Net.Awk.Argument[] args)
{
return System.Math.Sin(args[0].ToReal());
}
private void btnRun_Click(object sender, EventArgs e) private void btnRun_Click(object sender, EventArgs e)
{ {
//using (Awk awk = new Awk()) //using (Awk awk = new Awk())
for (int i = 0; i < 10000; i++) //for (int i = 0; i < 100; i++)
{ {
Awk awk = new Awk(); Awk awk = new Awk();
tbxSourceOutput.Text = ""; tbxSourceOutput.Text = "";
tbxConsoleOutput.Text = ""; tbxConsoleOutput.Text = "";
awk.AddFunction("sin", 1, 1, sin);
if (!awk.Parse(tbxSourceInput, tbxSourceOutput)) if (!awk.Parse(tbxSourceInput, tbxSourceOutput))
{ {
MessageBox.Show("Parse error"); MessageBox.Show("Parse error");