diff --git a/ase/ase.dsw b/ase/ase.dsw index 5971636f..d42128b3 100644 --- a/ase/ase.dsw +++ b/ase/ase.dsw @@ -87,6 +87,18 @@ Package=<4> ############################################################################### +Project: "asetestawk++"=.\test\awk\asetestawk++.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + Project: "aselsp"=.\lsp\aselsp.dsp - Package Owner=<4> Package=<5> diff --git a/ase/awk/Awk.cpp b/ase/awk/Awk.cpp index 8dc77bb2..ba65dfff 100644 --- a/ase/awk/Awk.cpp +++ b/ase/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.8 2007/05/05 16:32:46 bacon Exp $ + * $Id: Awk.cpp,v 1.9 2007/05/06 06:55:05 bacon Exp $ */ #include @@ -9,6 +9,10 @@ namespace ASE { + Awk::Source::Source (Mode mode): mode (mode) + { + } + Awk::Source::Mode Awk::Source::getMode () const { return this->mode; @@ -70,7 +74,7 @@ namespace ASE return this->mode; } - Awk::Awk (): awk (ASE_NULL), + Awk::Awk (): awk (ASE_NULL), functionMap (ASE_NULL), sourceIn (Source::READ), sourceOut (Source::WRITE) { } @@ -82,7 +86,7 @@ namespace ASE int Awk::parse () { - if (awk == ASE_NULL && open() == -1) return -1; + ASE_ASSERT (awk != ASE_NULL); ase_awk_srcios_t srcios; @@ -95,11 +99,7 @@ namespace ASE int Awk::run (const char_t* main, const char_t** args) { - if (awk == ASE_NULL) - { - // TODO: SET ERROR INFO - return -1; - } + ASE_ASSERT (awk != ASE_NULL); ase_awk_runios_t runios; @@ -117,6 +117,8 @@ namespace ASE int Awk::open () { + ASE_ASSERT (awk == ASE_NULL && functionMap == ASE_NULL); + ase_awk_prmfns_t prmfns; prmfns.mmgr.malloc = malloc; @@ -156,7 +158,8 @@ namespace ASE return -1; } - functionMap = ase_awk_map_open (this, 512, ASE_NULL, awk); + functionMap = ase_awk_map_open ( + this, 512, freeFunctionMapValue, awk); if (functionMap == ASE_NULL) { // TODO: set ERROR INFO -> ENOMEM... @@ -190,26 +193,63 @@ namespace ASE pair = ase_awk_map_get (functionMap, name, len); if (pair == ASE_NULL) return -1; - //ASE_AWK_PAIR_VAL(pair); - return 0; + FunctionHandler handler; + handler = *(FunctionHandler*)ASE_AWK_PAIR_VAL(pair); + + return (this->*handler) (); } int Awk::addFunction ( const char_t* name, size_t minArgs, size_t maxArgs, FunctionHandler handler) { - void* p = ase_awk_addbfn (awk, name, ase_strlen(name), + ASE_ASSERT (awk != ASE_NULL); + + FunctionHandler* tmp; + tmp = (FunctionHandler*)this->malloc (ASE_SIZEOF(handler)); + if (tmp == ASE_NULL) + { + // TODO: SET ERROR INFO -> ENOMEM + return -1; + } + + //ase_memcpy (tmp, &handler, ASE_SIZEOF(handler)); + *tmp = handler; + + size_t nameLen = ase_strlen(name); + + void* p = ase_awk_addbfn (awk, name, nameLen, 0, minArgs, maxArgs, ASE_NULL, functionHandler); + if (p == ASE_NULL) + { + this->free (tmp); + return -1; + } - //ase_memcpy (ASE_NULL, &handler, sizeof(handler)); - return (p == ASE_NULL)? -1: 0; + ase_awk_pair_t* pair; + pair = ase_awk_map_put (functionMap, name, nameLen, tmp); + if (pair == ASE_NULL) + { + // TODO: SET ERROR INFO + ase_awk_delbfn (awk, name, nameLen); + this->free (tmp); + return -1; + } + + return 0; } int Awk::deleteFunction (const char_t* name) { - // TODO: open if it is not open.... - return ase_awk_delbfn (awk, name, ase_strlen(name)); + ASE_ASSERT (awk != ASE_NULL); + + size_t nameLen = ase_strlen(name); + + int n = ase_awk_delbfn (awk, name, nameLen); + if (n == 0) ase_awk_map_remove (functionMap, name, nameLen); + + return n; } Awk::ssize_t Awk::sourceReader ( @@ -348,6 +388,12 @@ namespace ASE return awk->dispatchFunction (name, len); } + void Awk::freeFunctionMapValue (void* owner, void* value) + { + Awk* awk = (Awk*)owner; + awk->free (value); + } + void* Awk::malloc (void* custom, size_t n) { return ((Awk*)custom)->malloc (n); diff --git a/ase/awk/Awk.hpp b/ase/awk/Awk.hpp index e79569e1..cc1b8364 100644 --- a/ase/awk/Awk.hpp +++ b/ase/awk/Awk.hpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.hpp,v 1.7 2007/05/05 16:32:46 bacon Exp $ + * $Id: Awk.hpp,v 1.8 2007/05/06 06:55:05 bacon Exp $ */ #ifndef _ASE_AWK_AWK_HPP_ @@ -112,20 +112,21 @@ namespace ASE Awk (); virtual ~Awk (); - int parse (); - int run (const char_t* main, const char_t** args); - void close (); + virtual int open (); + virtual void close (); + virtual int parse (); + virtual int run (const char_t* main = ASE_NULL, + const char_t** args = ASE_NULL); typedef int (Awk::*FunctionHandler) (); - int addFunction ( + virtual int addFunction ( const char_t* name, size_t minArgs, size_t maxArgs, FunctionHandler handler); - int deleteFunction (const char_t* main); + virtual int deleteFunction (const char_t* main); protected: - int open (); virtual int dispatchFunction (const char_t* name, size_t len); @@ -205,6 +206,7 @@ namespace ASE static int functionHandler ( ase_awk_run_t* run, const char_t* name, size_t len); + static void freeFunctionMapValue (void* owner, void* value); static void* malloc (void* custom, size_t n); static void* realloc (void* custom, void* ptr, size_t n); diff --git a/ase/awk/StdAwk.cpp b/ase/awk/StdAwk.cpp index 1c5b964a..4a2a72d3 100644 --- a/ase/awk/StdAwk.cpp +++ b/ase/awk/StdAwk.cpp @@ -1,5 +1,5 @@ /* - * $Id: StdAwk.cpp,v 1.2 2007/05/05 16:32:46 bacon Exp $ + * $Id: StdAwk.cpp,v 1.3 2007/05/06 06:55:05 bacon Exp $ */ #include @@ -9,9 +9,21 @@ namespace ASE StdAwk::StdAwk () { - addFunction (ASE_T("sin"), 1, 1, (FunctionHandler)&StdAwk::sin); - addFunction (ASE_T("cos"), 1, 1, (FunctionHandler)&StdAwk::cos); - addFunction (ASE_T("tan"), 1, 1, (FunctionHandler)&StdAwk::tan); + } + + int StdAwk::open () + { + int n = Awk::open (); + if (n == 0) + { + /* + addFunction (ASE_T("sin"), 1, 1, (FunctionHandler)&StdAwk::sin); + addFunction (ASE_T("cos"), 1, 1, (FunctionHandler)&StdAwk::cos); + addFunction (ASE_T("tan"), 1, 1, (FunctionHandler)&StdAwk::tan); + */ + } + + return n; } int StdAwk::sin () diff --git a/ase/awk/StdAwk.hpp b/ase/awk/StdAwk.hpp index c920e77d..885251bb 100644 --- a/ase/awk/StdAwk.hpp +++ b/ase/awk/StdAwk.hpp @@ -1,5 +1,5 @@ /* - * $Id: StdAwk.hpp,v 1.2 2007/05/05 16:32:46 bacon Exp $ + * $Id: StdAwk.hpp,v 1.3 2007/05/06 06:55:05 bacon Exp $ */ #ifndef _ASE_AWK_STDAWK_HPP_ @@ -15,6 +15,8 @@ namespace ASE public: StdAwk (); + int open (); + protected: int sin (); int cos (); diff --git a/ase/awk/makefile.in b/ase/awk/makefile.in index 9c8bd07f..4aaf7da3 100644 --- a/ase/awk/makefile.in +++ b/ase/awk/makefile.in @@ -1,5 +1,5 @@ # -# $Id: makefile.in,v 1.4 2007/05/02 15:07:33 bacon Exp $ +# $Id: makefile.in,v 1.5 2007/05/06 04:23:44 bacon Exp $ # NAME = aseawk @@ -51,7 +51,9 @@ OBJ_FILES_LIB = \ OBJ_FILES_JNI = $(TMP_DIR)/jni.o -OBJ_FILES_LIB_CXX = $(TMP_DIR)/cxx/Awk.o +OBJ_FILES_LIB_CXX = \ + $(TMP_DIR)/cxx/Awk.o \ + $(TMP_DIR)/cxx/StdAwk.o OBJ_FILES_SO = $(OBJ_FILES_LIB:.o=.lo) $(OBJ_FILES_JNI:.o=.lo) @@ -136,6 +138,9 @@ $(TMP_DIR)/ase/awk/Exception.class: $(TMP_DIR)/cxx/Awk.o: Awk.cpp Awk.hpp $(CXX) $(CXXFLAGS) -o $@ -c Awk.cpp +$(TMP_DIR)/cxx/StdAwk.o: StdAwk.cpp StdAwk.hpp Awk.hpp + $(CXX) $(CXXFLAGS) -o $@ -c StdAwk.cpp + $(OUT_DIR): mkdir -p $(OUT_DIR) diff --git a/ase/awk/map.c b/ase/awk/map.c index eb6ed582..8d71234d 100644 --- a/ase/awk/map.c +++ b/ase/awk/map.c @@ -1,5 +1,5 @@ /* - * $Id: map.c,v 1.4 2007/05/05 16:32:46 bacon Exp $ + * $Id: map.c,v 1.5 2007/05/06 06:55:05 bacon Exp $ * * {License} */ @@ -105,7 +105,8 @@ ase_awk_pair_t* ase_awk_map_get ( } ase_awk_pair_t* ase_awk_map_put ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, void* val) + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, + void* val) { int n; ase_awk_pair_t* px; @@ -116,7 +117,7 @@ ase_awk_pair_t* ase_awk_map_put ( } int ase_awk_map_putx ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, void* val, ase_awk_pair_t** px) { ase_awk_pair_t* pair; @@ -165,7 +166,8 @@ int ase_awk_map_putx ( } ase_awk_pair_t* ase_awk_map_set ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, void* val) + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, + void* val) { ase_awk_pair_t* pair; ase_size_t hc; @@ -217,7 +219,7 @@ ase_awk_pair_t* ase_awk_map_setpair ( } int ase_awk_map_remove ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen) + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen) { ase_awk_pair_t* pair, * prev; ase_size_t hc; diff --git a/ase/awk/map.h b/ase/awk/map.h index fd9a7e2d..029b7531 100644 --- a/ase/awk/map.h +++ b/ase/awk/map.h @@ -1,5 +1,5 @@ /* - * $Id: map.h,v 1.4 2007/05/05 16:32:46 bacon Exp $ + * $Id: map.h,v 1.5 2007/05/06 06:55:05 bacon Exp $ * * {License} */ @@ -60,14 +60,16 @@ ase_awk_pair_t* ase_awk_map_get ( ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen); ase_awk_pair_t* ase_awk_map_put ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, void* val); + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, + void* val); int ase_awk_map_putx ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, void* val, ase_awk_pair_t** px); ase_awk_pair_t* ase_awk_map_set ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen, void* val); + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, + void* val); ase_awk_pair_t* ase_awk_map_getpair ( ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen, @@ -77,7 +79,7 @@ ase_awk_pair_t* ase_awk_map_setpair ( ase_awk_map_t* map, ase_awk_pair_t* pair, void* val); int ase_awk_map_remove ( - ase_awk_map_t* map, ase_char_t* keyptr, ase_size_t keylen); + ase_awk_map_t* map, const ase_char_t* keyptr, ase_size_t keylen); int ase_awk_map_walk (ase_awk_map_t* map, int (*walker)(ase_awk_pair_t*,void*), void* arg); diff --git a/ase/test/awk/Awk.cpp b/ase/test/awk/Awk.cpp index 12a57c14..da640d2a 100644 --- a/ase/test/awk/Awk.cpp +++ b/ase/test/awk/Awk.cpp @@ -1,34 +1,202 @@ /* - * $Id: Awk.cpp,v 1.1 2007/05/02 15:07:33 bacon Exp $ + * $Id: Awk.cpp,v 1.2 2007/05/06 06:55:05 bacon Exp $ */ -#include +#include +#include -class TestAwk: public ASE::Awk +#include +#include +#include + +#include +#include +#include + +class TestAwk: public ASE::StdAwk { - int openSource (SourceMode mode) +public: + int parse (const char_t* name) { - return 1; + ase_strxcpy (sourceInName, ASE_COUNTOF(sourceInName), name); + return StdAwk::parse (); } - int closeSource (SourceMode mode) +protected: + int openSource (Source& io) + { + Source::Mode mode = io.getMode(); + + if (mode == Source::READ) + { + FILE* fp = ase_fopen (sourceInName, ASE_T("r")); + if (fp == ASE_NULL) return -1; + io.setHandle (fp); + } + else if (mode == Source::WRITE) + { + return 0; + } + + return -1; + } + + int closeSource (Source& io) + { + Source::Mode mode = io.getMode(); + + if (mode == Source::READ) + { + fclose ((FILE*)io.getHandle()); + io.setHandle (ASE_NULL); + return 0; + } + else if (mode == Source::WRITE) + { + return 0; + } + + return -1; + } + + ssize_t readSource (Source& io, char_t* buf, size_t count) { return 0; } - ase_ssize_t readSource (ase_char_t* buf, ase_size_t count) + ssize_t writeSource (Source& io, char_t* buf, size_t count) { return 0; } - ase_ssize_t writeSource (ase_char_t* buf, ase_size_t count); + + // pipe io handlers + int openPipe (Pipe& io) { return -1; } + int closePipe (Pipe& io) { return 0; } + 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) { return 0; } + int nextPipe (Pipe& io) { return 0; } + + // file io handlers + int openFile (File& io) { return -1; } + int closeFile (File& io) { return 0; } + 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; } + int flushFile (File& io) { return 0; } + int nextFile (File& io) { return 0; } + + // console io handlers + int openConsole (Console& io) { return 1; } + int closeConsole (Console& io) { return 0; } + ssize_t readConsole (Console& io, char_t* buf, size_t len) { return 0; } + ssize_t writeConsole (Console& io, char_t* buf, size_t len) + { + return ase_printf (ASE_T(".%s"), len, buf); + } + int flushConsole (Console& io) { return 0; } + int nextConsole (Console& io) { return 0; } + + // primitive operations + void* malloc (size_t n) { return ::malloc (n); } + void* realloc (void* ptr, size_t n) { return ::realloc (ptr, n); } + void free (void* ptr) { ::free (ptr); } + + bool_t isUpper (cint_t c) { return ase_isupper (c); } + bool_t isLower (cint_t c) { return ase_islower (c); } + bool_t isAlpha (cint_t c) { return ase_isalpha (c); } + bool_t isDigit (cint_t c) { return ase_isdigit (c); } + bool_t isXdigit (cint_t c) { return ase_isxdigit (c); } + bool_t isAlnum (cint_t c) { return ase_isalnum (c); } + bool_t isSpace (cint_t c) { return ase_isspace (c); } + bool_t isPrint (cint_t c) { return ase_isprint (c); } + bool_t isGraph (cint_t c) { return ase_isgraph (c); } + bool_t isCntrl (cint_t c) { return ase_iscntrl (c); } + bool_t isPunct (cint_t c) { return ase_ispunct (c); } + cint_t toUpper (cint_t c) { return ase_toupper (c); } + cint_t toLower (cint_t c) { return ase_tolower (c); } + + real_t pow (real_t x, real_t y) + { + return ::pow (x, y); + } + + int vsprintf (char_t* buf, size_t size, const char_t* fmt, va_list arg) + { + return ase_vsprintf (buf, size, fmt, arg); + } + + void vdprintf (const char_t* fmt, va_list arg) + { + ase_vfprintf (stderr, fmt, arg); + } + +private: + char_t sourceInName[1024+1]; }; -int main () +#ifndef NDEBUG +void ase_assert_abort (void) { - - + abort (); +} + +void ase_assert_printf (const ase_char_t* fmt, ...) +{ + va_list ap; +#ifdef _WIN32 + int n; + ase_char_t buf[1024]; +#endif + + va_start (ap, fmt); +#if defined(_WIN32) + n = _vsntprintf (buf, ASE_COUNTOF(buf), fmt, ap); + if (n < 0) buf[ASE_COUNTOF(buf)-1] = ASE_T('\0'); + + #if defined(_MSC_VER) && (_MSC_VER<1400) + MessageBox (NULL, buf, + ASE_T("Assertion Failure"), MB_OK|MB_ICONERROR); + #else + MessageBox (NULL, buf, + ASE_T("\uB2DD\uAE30\uB9AC \uC870\uB610"), MB_OK|MB_ICONERROR); + #endif +#else + ase_vprintf (fmt, ap); +#endif + va_end (ap); +} +#endif + +int ase_main (int argc, ase_char_t* argv[]) +{ + TestAwk awk; + + if (awk.open() == -1) + { + ase_fprintf (stderr, ASE_T("cannot open awk\n")); + //awk.close (); + return -1; + } + +return -1; + if (awk.parse(ASE_T("t.awk")) == -1) + { + ase_fprintf (stderr, ASE_T("cannot parse\n")); + //awk.close (); + return -1; + } + + if (awk.run () == -1) + { + ase_fprintf (stderr, ASE_T("cannot run\n")); + //awk.close (); + return -1; + } + + awk.close (); + return 0; }