diff --git a/ase/cmd/awk/awk.c b/ase/cmd/awk/awk.c index a102b92b..a09af8e8 100644 --- a/ase/cmd/awk/awk.c +++ b/ase/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 415 2008-10-10 11:16:31Z baconevi $ + * $Id: awk.c 417 2008-10-12 15:08:26Z baconevi $ */ #include @@ -30,6 +30,8 @@ #define _CRTDBG_MAP_ALLOC #include #endif +#else + #include #endif #define SRCIO_FILE 1 @@ -122,90 +124,6 @@ static int custom_awk_sprintf ( return n; } -static ase_ssize_t awk_srcio_in_str ( - int cmd, srcio_data_t* siod, ase_char_t* data, ase_size_t size) -{ - return -1; -} - -static ase_ssize_t awk_srcio_in_file ( - int cmd, srcio_data_t* siod, ase_char_t* data, ase_size_t size) -{ - ase_cint_t c; - - if (cmd == ASE_AWK_IO_OPEN) - { - if (siod->data.file.cur == ASE_NULL) return 0; - siod->data.file.handle = ase_fopen (ASE_SLL_DPTR(siod->data.file.cur), ASE_T("r")); - if (siod->data.file.handle == NULL) return -1; - - /* - ase_awk_setsinname (); - */ - - return 1; - } - else if (cmd == ASE_AWK_IO_CLOSE) - { - if (siod->data.file.cur == ASE_NULL) return 0; - fclose (siod->data.file.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; - - retry: - fp = siod->data.file.handle; - while (!ase_feof(fp) && n < size) - { - ase_cint_t c = ase_fgetc (fp); - if (c == ASE_CHAR_EOF) - { - if (ase_ferror(fp)) n = -1; - break; - } - data[n++] = c; - } - - if (n == 0) - { - siod->data.file.cur = ASE_SLL_NEXT(siod->data.file.cur); - if (siod->data.file.cur != ASE_NULL) - { - ase_fclose (fp); - siod->data.file.handle = ase_fopen (ASE_SLL_DPTR(siod->data.file.cur), ASE_T("r")); - if (siod->data.file.handle == NULL) return -1; - goto retry; - } - } - return n; - } - - return -1; -} - -static ase_ssize_t awk_srcio_in ( - int cmd, void* arg, ase_char_t* data, ase_size_t size) -{ - ase_cint_t c; - - if (((srcio_data_t*)arg)->type == SRCIO_STR) - { - return awk_srcio_in_str (cmd, arg, data, size); - } - else - { - return awk_srcio_in_file (cmd, arg, data, size); - } -} - static ase_ssize_t awk_srcio_out ( int cmd, void* arg, ase_char_t* data, ase_size_t size) { @@ -955,11 +873,14 @@ static void out_of_memory (void) struct argout_t { - ase_sll_t* sf; - ase_map_t* vm; + ase_char_t* iss; /* input source string */ + ase_char_t** isf; /* input source files */ + ase_size_t isfl; /* the number of input source filse */ + ase_char_t* osf; /* output source file */ + ase_map_t* vm; }; -static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct argout_t* ao) +static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) { static ase_opt_lng_t lng[] = { @@ -994,17 +915,17 @@ static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct }; ase_cint_t c; - ase_sll_t* sf = ASE_NULL; + ase_size_t isfc = 16; + ase_size_t isfl = 0; + ase_char_t** isf = ASE_NULL; ase_map_t* vm = ASE_NULL; - sf = ase_sll_open (ASE_NULL, 0); - if (sf == ASE_NULL) + isf = (ase_char_t**)malloc (ASE_SIZEOF(*isf) * isfc); + if (isf == ASE_NULL) { out_of_memory (); ABORT (on_error); } - ase_sll_setscale (sf, ASE_SIZEOF(opt.arg[0])); - ase_sll_setcopier (sf, ASE_SLL_COPIER_INLINE); vm = ase_map_open (ASE_NULL, 0, 30, 70); if (vm == ASE_NULL) @@ -1027,19 +948,27 @@ static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct case ASE_T('h'): print_usage (argv[0]); - if (sf != NULL) ase_sll_close (sf); + if (isf != ASE_NULL) free (isf); + if (vm != ASE_NULL) ase_map_close (vm); return 1; case ASE_T('f'): { - ase_size_t sz = ase_strlen(opt.arg) + 1; - - if (ase_sll_pushtail(sf, opt.arg, sz) == ASE_NULL) + if (isfl >= isfc) { - out_of_memory (); - ABORT (on_error); + ase_char_t** tmp; + tmp = (ase_char_t**)realloc (isf, ASE_SIZEOF(*isf)*(isfc+16)); + if (tmp == ASE_NULL) + { + out_of_memory (); + ABORT (on_error); + } + + isf = tmp; + isfc = isfc + 16; } + isf[isfl++] = opt.arg; break; } @@ -1079,8 +1008,7 @@ static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct ase_printf (ASE_T("Error: illegal option - %c\n"), opt.opt); } - if (sf != ASE_NULL) ase_sll_close (sf); - return -1; + ABORT (on_error); } case ASE_T(':'): @@ -1103,7 +1031,7 @@ static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct } - if (ASE_SLL_SIZE(sf) == 0) + if (isfl <= 0) { if (opt.ind >= argc) { @@ -1111,28 +1039,25 @@ static int handle_args (int argc, ase_char_t* argv[], srcio_data_t* siod, struct ABORT (on_error); } - siod->type = SRCIO_STR; - siod->data.str.ptr = argv[opt.ind++]; - siod->data.str.cur = NULL; + ao->iss = argv[opt.ind++]; + ao->isf = ASE_NULL; + ao->isfl = 0; } else { - /* read source code from the file */ - siod->type = SRCIO_FILE; - siod->data.file.sll = sf; - siod->data.file.cur = ase_sll_gethead(sf); - siod->data.file.handle = NULL; + ao->iss = ASE_NULL; + ao->isf = isf; + ao->isfl = isfl; } - /* remaining args are input(console) file names */ + /* TODO; remaining args are input(console) file names */ - ao->sf = sf; ao->vm = vm; + return 0; - on_error: - if (sf != ASE_NULL) ase_sll_close (sf); + if (isf != ASE_NULL) free (isf); if (vm != ASE_NULL) ase_map_close (vm); return -1; } @@ -1146,7 +1071,7 @@ extension_t; static void init_awk_extension (ase_awk_t* awk) { - extension_t* ext = ase_awk_getextension(awk); + extension_t* ext = (extension_t*) ase_awk_getextension(awk); ext->mmgr = *ase_awk_getmmgr(awk); ase_awk_setmmgr (awk, &ext->mmgr); @@ -1227,7 +1152,7 @@ static ase_awk_t* open_awk (void) static void close_awk (ase_awk_t* awk) { - extension_t* ext = ase_awk_getextension(awk); + extension_t* ext = (extension_t*)ase_awk_getextension(awk); #ifdef _WIN32 HANDLE heap = (HANDLE)ext->mmgr->data; @@ -1243,7 +1168,6 @@ static void close_awk (ase_awk_t* awk) static int awk_main (int argc, ase_char_t* argv[]) { ase_awk_t* awk; - srcio_data_t siod; ase_awk_srcios_t srcios; int i, file_count = 0; @@ -1252,10 +1176,11 @@ static int awk_main (int argc, ase_char_t* argv[]) int runarg_count = 0; ase_awk_runarg_t runarg[128]; int deparse = 0; - struct argout_t ao; - i = handle_args (argc, argv, &siod, &ao); + ase_memset (&ao, 0, ASE_SIZEOF(ao)); + + i = handle_args (argc, argv, &ao); if (i == -1) { print_usage (argv[0]); @@ -1272,12 +1197,7 @@ static int awk_main (int argc, ase_char_t* argv[]) app_awk = awk; -///////////////// - srcios.in = awk_srcio_in; - srcios.out = deparse? awk_srcio_out: NULL; - srcios.data = &siod; - - if (ase_awk_parse (awk, &srcios) == -1) + if (ase_awk_parsefiles (awk, ao.isf, ao.isfl, ao.osf) == -1) { ase_printf ( ASE_T("PARSE ERROR: CODE [%d] LINE [%u] %s\n"), @@ -1287,20 +1207,6 @@ static int awk_main (int argc, ase_char_t* argv[]) close_awk (awk); return -1; } -///////////////// - -#if 0 - if (ase_awk_parsefiles (awk, ASE_ARR_PTR(stab), ASE_ARR_LEN(stab)) == -1) - { - ase_printf ( - ASE_T("PARSE ERROR: CODE [%d] LINE [%u] %s\n"), - ase_awk_geterrnum(awk), - (unsigned int)ase_awk_geterrlin(awk), - ase_awk_geterrmsg(awk)); - close_awk (awk); - return -1; - } -#endif #ifdef _WIN32 @@ -1317,8 +1223,10 @@ static int awk_main (int argc, ase_char_t* argv[]) close_awk (awk); - -// TODO: destroy siod.... + if (ao.iss != ASE_NULL) free (ao.iss); + if (ao.isf != ASE_NULL) free (ao.isf); + if (ao.osf != ASE_NULL) free (ao.osf); + if (ao.vm != ASE_NULL) ase_map_close (ao.vm); return 0; } diff --git a/ase/include/ase/awk/awk.h b/ase/include/ase/awk/awk.h index 0a3c1c71..e5f2e851 100644 --- a/ase/include/ase/awk/awk.h +++ b/ase/include/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 404 2008-09-30 11:14:20Z baconevi $ + * $Id: awk.h 417 2008-10-12 15:08:26Z baconevi $ * * {License} */ @@ -639,6 +639,11 @@ ase_mmgr_t* ase_awk_getmmgr ( ); /******/ +void ase_awk_setmmgr ( + ase_awk_t* awk, + ase_mmgr_t* mmgr +); + /****f* ase.awk/ase_awk_getextension * NAME * ase_awk_getextension - get the extension @@ -766,34 +771,55 @@ int ase_awk_setword ( */ int ase_awk_setrexfns (ase_awk_t* awk, ase_awk_rexfns_t* rexfns); -/** - * NAME: add an intrinsic global variable. +/****f* ase.awk/ase_awk_addglobal + * NAME + * ase_awk_addglobal - add an intrinsic global variable. * - * RETURNS: + * RETURN * On success, the ID of the global variable added is returned. * On failure, -1 is returned. - */ -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. + * SYNOPSIS */ -int ase_awk_delglobal (ase_awk_t* awk, const ase_char_t* name, ase_size_t len); +int ase_awk_addglobal ( + ase_awk_t* awk, + const ase_char_t* name, + ase_size_t len +); +/******/ -/** - * Parses the source code +/****f* ase.awk/ase_awk_delglobal + * NAME + * ase_awk_delglobal - delete an instrinsic global variable. * - * @return - * On success, 0 is returned. - * On failure, -1 is returned. + * SYNOPSIS */ -int ase_awk_parse (ase_awk_t* awk, ase_awk_srcios_t* srcios); +int ase_awk_delglobal ( + ase_awk_t* awk, + const ase_char_t* name, + ase_size_t len +); +/******/ -int ase_awk_parsefiles (ase_awk_t* awk, const ase_char_t* files[], ase_size_t count); +/****f* ase.awk/ase_awk_parse + * NAME + * ase_awk_parse - parse source code + * + * SYNOPSIS + */ +int ase_awk_parse ( + ase_awk_t* awk, + ase_awk_srcios_t* srcios +); +/******/ + + +int ase_awk_parsefiles ( + ase_awk_t* awk, + const ase_char_t* isf[] /* input source file names */, + ase_size_t isfl /* the number of input source files */, + const ase_char_t* osf /* an output source file name */ +); /** diff --git a/ase/lib/awk/std.c b/ase/lib/awk/std.c index 61cd3b65..e3a2a6ae 100644 --- a/ase/lib/awk/std.c +++ b/ase/lib/awk/std.c @@ -74,6 +74,12 @@ struct sf_t ase_size_t index; /* current file index */ ASE_FILE* handle; /* the handle to an open file */ } in; + + struct + { + const ase_char_t* file; + ASE_FILE* handle; + } out; }; static ase_ssize_t sf_in (int cmd, void* arg, ase_char_t* data, ase_size_t size) @@ -177,16 +183,18 @@ static ase_ssize_t sf_out ( } #endif -int ase_awk_parsefiles (ase_awk_t* awk, const ase_char_t* files[], ase_size_t count) +int ase_awk_parsefiles (ase_awk_t* awk, const ase_char_t** isf, ase_size_t isfl, const ase_char_t* osf) { sf_t sf; ase_awk_srcios_t sio; - sf.in.files = files; - sf.in.count = count; + sf.in.files = isf; + sf.in.count = isfl; sf.in.index = 0; sf.in.handle = ASE_NULL; + sf.out.file = osf; + sio.in = sf_in; //sio.out = deparse? sf_out: NULL; sio.out = ASE_NULL;