diff --git a/ase/cmd/awk/awk.c b/ase/cmd/awk/awk.c index 0715ea29..720df83b 100644 --- a/ase/cmd/awk/awk.c +++ b/ase/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 312 2008-08-02 13:40:04Z baconevi $ + * $Id: awk.c 313 2008-08-03 14:06:43Z baconevi $ */ #include @@ -32,10 +32,23 @@ #include #endif -struct awk_src_io +struct srcio_t { - const ase_char_t* input_file; - FILE* input_handle; + int type; /* file or string */ + + union + { + struct + { + ase_char_t* ptr; + ase_char_t* cur; + } str; + struct { + int count; + const ase_char_t* name[128]; + FILE* handle; + } file; + } data; }; #if defined(_WIN32) @@ -61,7 +74,6 @@ static void custom_awk_dprintf (void* custom, const ase_char_t* fmt, ...) va_end (ap); } - /* custom memory management function */ static void* custom_awk_malloc (void* custom, ase_size_t n) { @@ -118,26 +130,28 @@ static int custom_awk_sprintf ( static ase_ssize_t awk_srcio_in ( int cmd, void* arg, ase_char_t* data, ase_size_t size) { - struct awk_src_io* src_io = (struct awk_src_io*)arg; + struct srcio_t* srcio = (struct srcio_t*)arg; ase_cint_t c; if (cmd == ASE_AWK_IO_OPEN) { - if (src_io->input_file == ASE_NULL) return 0; - src_io->input_handle = ase_fopen (src_io->input_file, ASE_T("r")); - if (src_io->input_handle == NULL) return -1; + if (srcio->input_file == ASE_NULL) return 0; + srcio->input_handle = ase_fopen (srcio->input_file, ASE_T("r")); + if (srcio->input_handle == NULL) return -1; + + ase_awk_setsinname (); return 1; } else if (cmd == ASE_AWK_IO_CLOSE) { - if (src_io->input_file == ASE_NULL) return 0; - fclose ((FILE*)src_io->input_handle); + if (srcio->input_file == ASE_NULL) return 0; + fclose ((FILE*)srcio->input_handle); return 0; } else if (cmd == ASE_AWK_IO_READ) { ase_ssize_t n = 0; - FILE* fp = (FILE*)src_io->input_handle; + FILE* fp = (FILE*)srcio->input_handle; while (!ase_feof(fp) && n < size) { ase_cint_t c = ase_fgetc (fp); @@ -150,6 +164,11 @@ static ase_ssize_t awk_srcio_in ( } return n; } + /* + else if (cmd == ASE_AWK_IO_NEXT) + { + } + */ return -1; } @@ -157,7 +176,7 @@ static ase_ssize_t awk_srcio_in ( static ase_ssize_t awk_srcio_out ( int cmd, void* arg, ase_char_t* data, ase_size_t size) { - /*struct awk_src_io* src_io = (struct awk_src_io*)arg;*/ + /*struct srcio_t* srcio = (struct srcio_t*)arg;*/ if (cmd == ASE_AWK_IO_OPEN) return 1; else if (cmd == ASE_AWK_IO_CLOSE) @@ -344,7 +363,6 @@ static ase_ssize_t awk_extio_file ( errarg.ptr = epa->name; errarg.len = ase_strlen(epa->name); - ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1); return -1; } @@ -997,13 +1015,13 @@ static void handle_args (argc, argv) return -1; } - if (src_io.input_file != NULL) + if (srcio.input_file != NULL) { print_usage (argv[0]); return -1; } - src_io.input_file = argv[i]; + srcio.input_file = argv[i]; mode = 0; } else if (mode == 2) /* argument mode */ @@ -1030,33 +1048,33 @@ static void handle_args (argc, argv) } #endif -static int handle_args (int argc, ase_char_t* argv[], struct awk_src_io* src_io) +static int handle_args (int argc, ase_char_t* argv[], struct srcio_t* srcio) { ase_cint_t c; static ase_opt_lng_t lng[] = { - { ASE_T("implicit"), 0 }, - { ASE_T("explicit"), 0 }, - { ASE_T("bxor"), 0 }, - { ASE_T("shift"), 0 }, - { ASE_T("idiv"), 0 }, - { ASE_T("extio"), 0 }, - { ASE_T("newline"), 0 }, - { ASE_T("baseone"), 0 }, - { ASE_T("stripspaces"), 0 }, - { ASE_T("nextofile"), 0 }, - { ASE_T("crlf"), 0 }, - { ASE_T("argstomain"), 0 }, - { ASE_T("reset"), 0 }, - { ASE_T("maptovar"), 0 }, - { ASE_T("pablock"), 0 }, + { ASE_T("implicit"), 0 }, + { ASE_T("explicit"), 0 }, + { ASE_T("bxor"), 0 }, + { ASE_T("shift"), 0 }, + { ASE_T("idiv"), 0 }, + { ASE_T("extio"), 0 }, + { ASE_T("newline"), 0 }, + { ASE_T("baseone"), 0 }, + { ASE_T("stripspaces"), 0 }, + { ASE_T("nextofile"), 0 }, + { ASE_T("crlf"), 0 }, + { ASE_T("argstomain"), 0 }, + { ASE_T("reset"), 0 }, + { ASE_T("maptovar"), 0 }, + { ASE_T("pablock"), 0 }, { ASE_T(":main"), ASE_T('m') }, { ASE_T(":file"), ASE_T('f') }, { ASE_T(":field-separator"), ASE_T('F') }, { ASE_T(":assign"), ASE_T('v') }, - { ASE_T("help"), ASE_T('h') } + { ASE_T("help"), ASE_T('h') } }; @@ -1080,8 +1098,8 @@ static int handle_args (int argc, ase_char_t* argv[], struct awk_src_io* src_io) return 1; case ASE_T('f'): - src_io->input_file = opt.arg; - ase_printf (ASE_T("[file] = %s\n"), opt.arg); + srcio.type = SIO_FILE; + srcio.data.file.name = opt.arg; break; case ASE_T('F'): @@ -1116,7 +1134,7 @@ static int handle_args (int argc, ase_char_t* argv[], struct awk_src_io* src_io) } } - if (src_io->input_file == ASE_NULL) + if (srcio->input_file == ASE_NULL) { /* the first is the source code... */ } @@ -1142,62 +1160,26 @@ static int handle_args (int argc, ase_char_t* argv[], struct awk_src_io* src_io) return 0; } -typedef struct extension_t +typedef struct extensrcion_t { ase_mmgr_t mmgr; ase_awk_prmfns_t prmfns; } -extension_t; +extensrcion_t; static void* fuser (void* org, void* space) { - extension_t* ext = (extension_t*)space; - /* remember the memory manager into the extension */ + extensrcion_t* ext = (extensrcion_t*)space; + /* remember the memory manager into the extensrcion */ ext->mmgr = *(ase_mmgr_t*)org; return &ext->mmgr; } -static int awk_main (int argc, ase_char_t* argv[]) +static ase_awk_t* open_awk (void) { ase_awk_t* awk; ase_mmgr_t mmgr; - extension_t* extension; - - ase_awk_srcios_t srcios; - struct awk_src_io src_io = { NULL, NULL }; - int opt, i, file_count = 0; -#ifdef _WIN32 - struct mmgr_data_t mmgr_data; -#endif - const ase_char_t* mfn = ASE_NULL; - int mode = 0; - int runarg_count = 0; - ase_awk_runarg_t runarg[128]; - int deparse = 0; - - opt = ASE_AWK_IMPLICIT | - ASE_AWK_EXTIO | - ASE_AWK_NEWLINE | - ASE_AWK_BASEONE | - ASE_AWK_PABLOCK; - - i = handle_args (argc, argv, &src_io); - if (i == -1) - { - print_usage (argv[0]); - return -1; - } - if (i == 1) return 0; - - infiles[file_count] = ASE_NULL; - runarg[runarg_count].ptr = NULL; - runarg[runarg_count].len = 0; - - if (mode != 0 || src_io.input_file == NULL) - { - print_usage (argv[0]); - return -1; - } + extensrcion_t* extensrcion; memset (&mmgr, 0, ASE_SIZEOF(mmgr)); mmgr.malloc = custom_awk_malloc; @@ -1216,7 +1198,7 @@ static int awk_main (int argc, ase_char_t* argv[]) mmgr.custom_data = ASE_NULL; #endif - awk = ase_awk_open (&mmgr, ASE_SIZEOF(extension_t), fuser); + awk = ase_awk_open (&mmgr, ASE_SIZEOF(extensrcion_t), fuser); if (awk == ASE_NULL) { #ifdef _WIN32 @@ -1226,16 +1208,62 @@ static int awk_main (int argc, ase_char_t* argv[]) return -1; } - app_awk = awk; - ase_awk_setccls (awk, ASE_GETCCLS()); - extension = (extension_t*) ase_awk_getextension (awk); - extension->prmfns.pow = custom_awk_pow; - extension->prmfns.sprintf = custom_awk_sprintf; - extension->prmfns.dprintf = custom_awk_dprintf; - extension->prmfns.custom_data = ASE_NULL; - ase_awk_setprmfns (awk, &extension->prmfns); + extensrcion = (extensrcion_t*) ase_awk_getextensrcion (awk); + extensrcion->prmfns.pow = custom_awk_pow; + extensrcion->prmfns.sprintf = custom_awk_sprintf; + extensrcion->prmfns.dprintf = custom_awk_dprintf; + extensrcion->prmfns.custom_data = ASE_NULL; + ase_awk_setprmfns (awk, &extensrcion->prmfns); + + ase_awk_setoption (awk, ASE_AWK_IMPLICIT | ASE_AWK_EXTIO | ASE_AWK_NEWLINE | ASE_AWK_BASEONE | ASE_AWK_PABLOCK); + + return awk; +} + +static int awk_main (int argc, ase_char_t* argv[]) +{ + ase_awk_t* awk; + ase_mmgr_t mmgr; + extensrcion_t* extensrcion; + + ase_awk_srcios_t srcios; + struct srcio_t srcio = { NULL, NULL }; + int i, file_count = 0; +#ifdef _WIN32 + struct mmgr_data_t mmgr_data; +#endif + const ase_char_t* mfn = ASE_NULL; + int mode = 0; + int runarg_count = 0; + ase_awk_runarg_t runarg[128]; + int deparse = 0; + + + i = handle_args (argc, argv, &srcio); + if (i == -1) + { + print_usage (argv[0]); + return -1; + } + if (i == 1) return 0; + + infiles[file_count] = ASE_NULL; + runarg[runarg_count].ptr = NULL; + runarg[runarg_count].len = 0; + + if (mode != 0 || srcio.input_file == NULL) + { + print_usage (argv[0]); + return -1; + } + + + awk = open_awk (); + if (awk == ASE_NULL) return -1; + + app_awk = awk; if (ase_awk_addfunc (awk, ASE_T("sleep"), 5, 0, @@ -1248,7 +1276,6 @@ static int awk_main (int argc, ase_char_t* argv[]) return -1; } - ase_awk_setoption (awk, opt); /* ase_awk_seterrstr (awk, ASE_AWK_EGBLRED, ASE_T("\uC804\uC5ED\uBCC0\uC218 \'%.*s\'\uAC00 \uC7AC\uC815\uC758 \uB418\uC5C8\uC2B5\uB2C8\uB2E4")); @@ -1257,7 +1284,7 @@ static int awk_main (int argc, ase_char_t* argv[]) srcios.in = awk_srcio_in; srcios.out = deparse? awk_srcio_out: NULL; - srcios.custom_data = &src_io; + srcios.custom_data = &srcio; ase_awk_setmaxdepth ( awk, ASE_AWK_DEPTH_BLOCK_PARSE | ASE_AWK_DEPTH_EXPR_PARSE, 50); @@ -1349,8 +1376,6 @@ int ase_main (int argc, ase_achar_t* argv[]) /*#if defined(_MSC_VER) _CrtDumpMemoryLeaks (); #endif*/ - _tprintf (_T("Press ENTER to quit\n")); - getchar (); #endif return n; diff --git a/ase/include/ase/awk/awk.h b/ase/include/ase/awk/awk.h index fca63cd0..455eea69 100644 --- a/ase/include/ase/awk/awk.h +++ b/ase/include/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 283 2008-07-22 13:12:56Z baconevi $ + * $Id: awk.h 313 2008-08-03 14:06:43Z baconevi $ * * {License} */ @@ -602,6 +602,8 @@ ase_awk_t* ase_awk_open ( ase_fuser_t mmgr_fuser ); +ase_awk_t* ase_awk_openstd (void); + /* * destroy an ase_awk_instance * diff --git a/ase/lib/awk/makefile.am b/ase/lib/awk/makefile.am index f1fb761e..53fd5829 100644 --- a/ase/lib/awk/makefile.am +++ b/ase/lib/awk/makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = nostdinc AM_CPPFLAGS = -I$(top_srcdir)/include lib_LTLIBRARIES = libaseawk.la -libaseawk_la_SOURCES = awk.c err.c tree.c tab.c parse.c run.c rec.c val.c func.c misc.c extio.c awk_i.h extio.h func.h misc.h parse.h run.h tab.h tree.h +libaseawk_la_SOURCES = awk.c err.c tree.c tab.c parse.c run.c rec.c val.c func.c misc.c extio.c std.c awk_i.h extio.h func.h misc.h parse.h run.h tab.h tree.h libaseawk_la_LDFLAGS= -L../cmn -version-info 1:0:0 libaseawk_la_LIBADD= -lasecmn diff --git a/ase/lib/utl/getopt.c b/ase/lib/utl/getopt.c index 08c8684e..db8bb101 100644 --- a/ase/lib/utl/getopt.c +++ b/ase/lib/utl/getopt.c @@ -1,5 +1,5 @@ /* - * $Id: getopt.c 290 2008-07-27 06:16:54Z baconevi $ + * $Id: getopt.c 313 2008-08-03 14:06:43Z baconevi $ * * {License} */ @@ -140,7 +140,7 @@ ase_cint_t ase_getopt (int argc, ase_char_t* const* argv, ase_opt_t* opt) return o->val; } - if (*end == ASE_T('=')) *end = ASE_T('\0'); + /*if (*end == ASE_T('=')) *end = ASE_T('\0');*/ opt->lngopt = opt->cur; return BADCH; }