Recovered from cvs revision 2007-07-18 11:12:00

This commit is contained in:
hyung-hwan 2007-07-18 20:12:00 +00:00
parent af7146069a
commit 5c7341a6d3
4 changed files with 219 additions and 57 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.cpp,v 1.5 2007/07/16 11:16:46 bacon Exp $ * $Id: Awk.cpp,v 1.6 2007/07/17 09:46:19 bacon Exp $
*/ */
#include "stdafx.h" #include "stdafx.h"
@ -12,6 +12,8 @@
#include <msclr/auto_gcroot.h> #include <msclr/auto_gcroot.h>
using System::Runtime::InteropServices::GCHandle;
namespace ASE namespace ASE
{ {
class StubAwk: public Awk class StubAwk: public Awk
@ -45,19 +47,10 @@ namespace ASE
return -1; return -1;
} }
//interior_ptr<System::IO::Stream> p = wrapper->SourceInputStream;
//io.setHandle (wrapper->SourceInputStream);
System::IO::StreamReader^ reader = gcnew System::IO::StreamReader (wrapper->SourceInputStream); System::IO::StreamReader^ reader = gcnew System::IO::StreamReader (wrapper->SourceInputStream);
System::Runtime::InteropServices::GCHandle* handle = (System::Runtime::InteropServices::GCHandle*)malloc (sizeof(System::Runtime::InteropServices::GCHandle)); System::Runtime::InteropServices::GCHandle gh = System::Runtime::InteropServices::GCHandle::Alloc (reader);
if (handle == NULL) System::IntPtr^ ip = System::Runtime::InteropServices::GCHandle::ToIntPtr(gh);
{ io.setHandle (ip->ToPointer());
reader->Close ();
return -1;
}
handle->Alloc (reader/*, System::Runtime::InteropServices::GCHandleType::Pinned */);
io.setHandle (handle);
} }
else else
{ {
@ -73,15 +66,9 @@ namespace ASE
} }
System::IO::StreamWriter^ writer = gcnew System::IO::StreamWriter (wrapper->SourceOutputStream); System::IO::StreamWriter^ writer = gcnew System::IO::StreamWriter (wrapper->SourceOutputStream);
System::Runtime::InteropServices::GCHandle* handle = (System::Runtime::InteropServices::GCHandle*)::malloc (sizeof(System::Runtime::InteropServices::GCHandle)); System::Runtime::InteropServices::GCHandle gh = System::Runtime::InteropServices::GCHandle::Alloc (writer);
if (handle == NULL) System::IntPtr^ ip = System::Runtime::InteropServices::GCHandle::ToIntPtr(gh);
{ io.setHandle (ip->ToPointer());
writer->Close ();
return -1;
}
handle->Alloc (writer/*, System::Runtime::InteropServices::GCHandleType::Pinned*/);
io.setHandle (handle);
} }
return 1; return 1;
@ -89,57 +76,129 @@ namespace ASE
int closeSource (Source& io) int closeSource (Source& io)
{ {
System::Runtime::InteropServices::GCHandle* handle = (System::Runtime::InteropServices::GCHandle*)io.getHandle(); System::IntPtr ip ((void*)io.getHandle());
System::Runtime::InteropServices::GCHandle gh = System::Runtime::InteropServices::GCHandle::FromIntPtr (ip);
if (io.getMode() == Source::READ) if (io.getMode() == Source::READ)
{ {
System::IO::StreamReader^ reader = (System::IO::StreamReader^)handle->Target; System::IO::StreamReader^ reader = (System::IO::StreamReader^)gh.Target;
reader->Close (); reader->Close ();
} }
else else
{ {
System::IO::StreamWriter^ writer = (System::IO::StreamWriter^)handle->Target; System::IO::StreamWriter^ writer = (System::IO::StreamWriter^)gh.Target;
writer->Close (); writer->Close ();
} }
handle->Free (); gh.Free ();
::free (handle);
return 0; return 0;
} }
ssize_t readSource (Source& io, char_t* buf, size_t len) ssize_t readSource (Source& io, char_t* buf, size_t len)
{ {
System::Runtime::InteropServices::GCHandle* handle = (System::Runtime::InteropServices::GCHandle*)io.getHandle(); System::IntPtr ip ((void*)io.getHandle());
System::IO::StreamReader^ reader = (System::IO::StreamReader^)handle->Target; System::Runtime::InteropServices::GCHandle gh = System::Runtime::InteropServices::GCHandle::FromIntPtr (ip);
System::IO::StreamReader^ reader = (System::IO::StreamReader^)gh.Target;
cli::array<char_t>^ b = gcnew cli::array<char_t>(len); cli::array<char_t>^ b = gcnew cli::array<char_t>(len);
int n = reader->Read (b, 0, len); int n = reader->Read (b, 0, len);
for (int i = 0; i < n; i++) buf[i] = b[i]; for (int i = 0; i < n; i++) buf[i] = b[i];
return n; return n;
} }
ssize_t writeSource (Source& io, char_t* buf, size_t len) ssize_t writeSource (Source& io, char_t* buf, size_t len)
{ {
System::Runtime::InteropServices::GCHandle* handle = (System::Runtime::InteropServices::GCHandle*)io.getHandle(); System::IntPtr ip ((void*)io.getHandle());
System::IO::StreamWriter^ writer = (System::IO::StreamWriter^)handle->Target; System::Runtime::InteropServices::GCHandle gh = System::Runtime::InteropServices::GCHandle::FromIntPtr (ip);
System::IO::StreamWriter^ writer = (System::IO::StreamWriter^)gh.Target;
cli::array<char_t>^ b = gcnew cli::array<char_t>(len); cli::array<char_t>^ b = gcnew cli::array<char_t>(len);
for (int i = 0; i < (int)len; i++) buf[i] = b[i]; for (int i = 0; i < (int)len; i++) b[i] = buf[i];
writer->Write (b, 0, len); writer->Write (b, 0, len);
return len; return len;
} }
int openPipe (Pipe& io) {return 0; } int openPipe (Pipe& io)
int closePipe (Pipe& io) {return 0; } {
ssize_t readPipe (Pipe& io, char_t* buf, size_t len) {return 0; } ASE::Net::Awk::Pipe^ nio = gcnew ASE::Net::Awk::Pipe ();
ssize_t writePipe (Pipe& io, char_t* buf, size_t len) {return 0; } nio->Mode = (ASE::Net::Awk::Pipe::MODE)io.getMode();
int flushPipe (Pipe& io) {return 0; }
int openFile (File& io) {return 0; } GCHandle gh = GCHandle::Alloc (nio);
int closeFile (File& io) {return 0; } io.setHandle (GCHandle::ToIntPtr(gh).ToPointer());
ssize_t readFile (File& io, char_t* buf, size_t len) {return 0; }
ssize_t writeFile (File& io, char_t* buf, size_t len) {return 0; } return wrapper->FireOpenPipe (nio);
int flushFile (File& io) {return 0; } }
int closePipe (Pipe& io)
{
IntPtr ip ((void*)io.getHandle ());
GCHandle gh = GCHandle::FromIntPtr (ip);
int n = wrapper->FireClosePipe ((ASE::Net::Awk::Pipe^)gh.Target);
gh.Free ();
return n;
}
ssize_t readPipe (Pipe& io, char_t* buf, size_t len)
{
return 0;
}
ssize_t writePipe (Pipe& io, char_t* buf, size_t len)
{
return 0;
}
int flushPipe (Pipe& io)
{
IntPtr ip ((void*)io.getHandle());
GCHandle gh = GCHandle::FromIntPtr (ip);
return wrapper->FireFlushPipe ((ASE::Net::Awk::Pipe^)gh.Target);
}
int openFile (File& io)
{
ASE::Net::Awk::File^ nio = gcnew ASE::Net::Awk::File ();
nio->Mode = (ASE::Net::Awk::File::MODE)io.getMode();
GCHandle gh = GCHandle::Alloc (nio);
io.setHandle (GCHandle::ToIntPtr(gh).ToPointer());
return wrapper->FireOpenFile (nio);
}
int closeFile (File& io)
{
IntPtr ip ((void*)io.getHandle ());
GCHandle gh = GCHandle::FromIntPtr (ip);
int n = wrapper->FireCloseFile ((ASE::Net::Awk::File^)gh.Target);
gh.Free ();
return n;
}
ssize_t readFile (File& io, char_t* buf, size_t len)
{
IntPtr ip ((void*)io.getHandle());
GCHandle gh = GCHandle::FromIntPtr (ip);
return wrapper->FireReadFile ((ASE::Net::Awk::File^)gh.Target);
}
ssize_t writeFile (File& io, char_t* buf, size_t len)
{
IntPtr ip ((void*)io.getHandle());
GCHandle gh = GCHandle::FromIntPtr (ip);
return wrapper->FireWriteFile ((ASE::Net::Awk::File^)gh.Target);
}
int flushFile (File& io)
{
IntPtr ip ((void*)io.getHandle());
GCHandle gh = GCHandle::FromIntPtr (ip);
return wrapper->FireFlushFile ((ASE::Net::Awk::File^)gh.Target);
}
int openConsole (Console& io) {return 0; } int openConsole (Console& io) {return 0; }
int closeConsole (Console& io) {return 0; } int closeConsole (Console& io) {return 0; }
@ -183,12 +242,11 @@ namespace ASE
} }
private: private:
msclr::auto_gcroot<Net::Awk^> wrapper; msclr::auto_gcroot<ASE::Net::Awk^> wrapper;
}; };
namespace Net namespace Net
{ {
Awk::Awk () Awk::Awk ()
{ {
awk = new ASE::StubAwk (this); awk = new ASE::StubAwk (this);
@ -239,6 +297,53 @@ namespace ASE
{ {
return 0; return 0;
} }
int Awk::FireOpenFile (File^ file)
{
return OpenFileHandler (file);
}
int Awk::FireCloseFile (File^ file)
{
return CloseFileHandler (file);
}
int Awk::FireReadFile (File^ file)
{
int n = ReadFileHandler (file);
return n;
}
int Awk::FireWriteFile (File^ file)
{
int n = WriteFileHandler (file);
return n;
}
int Awk::FireFlushFile (File^ file)
{
return FlushFileHandler (file);
}
int Awk::FireOpenPipe (Pipe^ pipe)
{
return OpenPipeHandler (pipe);
}
int Awk::FireClosePipe (Pipe^ pipe)
{
return ClosePipeHandler (pipe);
}
int Awk::FireReadPipe (Pipe^ pipe)
{
int n = ReadPipeHandler (pipe);
return n;
}
int Awk::FireWritePipe (Pipe^ pipe)
{
int n = WritePipeHandler (pipe);
return n;
}
int Awk::FireFlushPipe (Pipe^ pipe)
{
return FlushPipeHandler (pipe);
}
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp,v 1.3 2007/07/16 11:12:12 bacon Exp $ * $Id: Awk.hpp,v 1.4 2007/07/17 09:46:19 bacon Exp $
*/ */
#pragma once #pragma once
@ -38,7 +38,19 @@ namespace ASE
ref class Extio ref class Extio
{ {
public:
Extio (): handle (nullptr)
{
}
property Object^ Handle
{
Object^ get () { return this->handle; }
void set (Object^ handle) { this->handle = handle; }
}
private:
Object^ handle;
}; };
ref class Pipe: public Extio ref class Pipe: public Extio
@ -102,7 +114,7 @@ namespace ASE
Awk (); Awk ();
virtual ~Awk (); virtual ~Awk ();
bool Open (); //bool Open ();
void Close (); void Close ();
bool Parse (); bool Parse ();
@ -113,7 +125,6 @@ namespace ASE
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);
property System::IO::Stream^ SourceInputStream property System::IO::Stream^ SourceInputStream
{ {
System::IO::Stream^ get () System::IO::Stream^ get ()
@ -139,6 +150,30 @@ namespace ASE
this->sourceOutputStream = stream; this->sourceOutputStream = stream;
} }
} }
delegate int OpenPipe (Pipe^ pipe);
delegate int ClosePipe (Pipe^ pipe);
delegate int ReadPipe (Pipe^ pipe);
delegate int WritePipe (Pipe^ pipe);
delegate int FlushPipe (Pipe^ pipe);
delegate int OpenFile (File^ file);
delegate int CloseFile (File^ file);
delegate int ReadFile (File^ file);
delegate int WriteFile (File^ file);
delegate int FlushFile (File^ file);
event OpenPipe^ OpenPipeHandler;
event ClosePipe^ ClosePipeHandler;
event ReadPipe^ ReadPipeHandler;
event WritePipe^ WritePipeHandler;
event FlushPipe^ FlushPipeHandler;
event OpenFile^ OpenFileHandler;
event CloseFile^ CloseFileHandler;
event ReadFile^ ReadFileHandler;
event WriteFile^ WriteFileHandler;
event FlushFile^ FlushFileHandler;
protected: protected:
ASE::Awk* awk; ASE::Awk* awk;
@ -147,7 +182,19 @@ namespace ASE
System::IO::Stream^ sourceOutputStream; System::IO::Stream^ sourceOutputStream;
public protected: public protected:
int Awk::DispatchFunction (System::String^ name); int DispatchFunction (System::String^ name);
int FireOpenFile (File^ file);
int FireCloseFile (File^ file);
int FireReadFile (File^ file);
int FireWriteFile (File^ file);
int FireFlushFile (File^ file);
int FireOpenPipe (Pipe^ pipe);
int FireClosePipe (Pipe^ pipe);
int FireReadPipe (Pipe^ pipe);
int FireWritePipe (Pipe^ pipe);
int FireFlushPipe (Pipe^ pipe);
}; };
} }

View File

@ -172,14 +172,6 @@
RelativePath="System.dll" RelativePath="System.dll"
AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
/> />
<AssemblyReference
RelativePath="System.Data.dll"
AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
/>
<AssemblyReference
RelativePath="System.XML.dll"
AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
/>
</References> </References>
<Files> <Files>
<Filter <Filter

View File

@ -19,11 +19,29 @@ namespace asetestnet
{ {
ASE.Net.Awk awk = new ASE.Net.StdAwk(); ASE.Net.Awk awk = new ASE.Net.StdAwk();
awk.Open(); awk.OpenFileHandler += new ASE.Net.Awk.OpenFile (OpenFile);
awk.CloseFileHandler += CloseFile;
//awk.Open();
awk.SourceInputStream = new System.IO.FileStream("t.awk", System.IO.FileMode.Open, System.IO.FileAccess.Read); awk.SourceInputStream = new System.IO.FileStream("t.awk", System.IO.FileMode.Open, System.IO.FileAccess.Read);
awk.SourceOutputStream = new System.IO.FileStream("t.out", System.IO.FileMode.Create, System.IO.FileAccess.Write); awk.SourceOutputStream = new System.IO.FileStream("t.out", System.IO.FileMode.Create, System.IO.FileAccess.Write);
awk.Parse(); awk.Parse();
awk.Run();
} }
private int OpenFile(ASE.Net.Awk.File file)
{
MessageBox.Show("OpenFile");
file.Handle = "abc";
return 1;
}
private int CloseFile(ASE.Net.Awk.File file)
{
MessageBox.Show("CloseFile" + (string)file.Handle);
return 0;
}
} }
} }