From 2aa9f8321b85dcfb86d95a6054c7c9ecf1edab32 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 13 Dec 2008 03:42:32 +0000 Subject: [PATCH] added support for source string --- ase/cmd/awk/awk.c | 30 +++---- ase/include/ase/awk/awk.h | 11 ++- ase/lib/awk/std.c | 182 ++++++++++++++++++++------------------ 3 files changed, 116 insertions(+), 107 deletions(-) diff --git a/ase/cmd/awk/awk.c b/ase/cmd/awk/awk.c index c84c7090..6a083f3f 100644 --- a/ase/cmd/awk/awk.c +++ b/ase/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 469 2008-12-11 10:05:28Z baconevi $ + * $Id: awk.c 478 2008-12-12 09:42:32Z baconevi $ */ #include @@ -304,9 +304,9 @@ static void out_of_memory (void) struct argout_t { - ase_char_t* iss; /* input source string */ - ase_char_t** isf; /* input source files */ - ase_size_t isfl; /* the number of input source filse */ + void* isp; /* input source files or string */ + int ist; /* input source type */ + ase_size_t isfl; /* the number of input source files */ ase_char_t* osf; /* output source file */ ase_char_t** icf; /* input console files */ ase_size_t icfl; /* the number of input console files */ @@ -396,10 +396,10 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) case ASE_T('f'): { - if (isfl >= isfc) + if (isfl >= isfc-1) /* -1 for last ASE_NULL */ { ase_char_t** tmp; - tmp = (ase_char_t**)realloc (isf, ASE_SIZEOF(*isf)*(isfc+16)); + tmp = (ase_char_t**) realloc (isf, ASE_SIZEOF(*isf)*(isfc+16)); if (tmp == ASE_NULL) { out_of_memory (); @@ -478,6 +478,7 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) } } + isf[isfl] = ASE_NULL; if (isfl <= 0) { @@ -488,15 +489,13 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) } /* the source code is the string, not from the file */ - ao->iss = argv[opt.ind++]; /* source string */ - ao->isf = ASE_NULL; /* no source file */ - ao->isfl = 0; + ao->ist = ASE_AWK_PARSE_STRING; + ao->isp = argv[opt.ind++]; } else { - ao->iss = ASE_NULL; - ao->isf = isf; - ao->isfl = isfl; + ao->ist = ASE_AWK_PARSE_FILES; + ao->isp = isf; } /* the remaining arguments are input console file names */ @@ -552,6 +551,7 @@ static void init_awk_extension (ase_awk_t* awk) ext->prmfns.pow = custom_awk_pow; ext->prmfns.sprintf = custom_awk_sprintf; ext->prmfns.data = ASE_NULL; + ase_awk_setprmfns (awk, &ext->prmfns); } @@ -667,8 +667,7 @@ static int awk_main (int argc, ase_char_t* argv[]) app_awk = awk; - if (ase_awk_parsesimple ( - awk, ao.isf, ao.isfl, ao.osf, ASE_AWK_PARSE_FILES) == -1) + if (ase_awk_parsesimple (awk, ao.isp, ao.ist, ao.osf) == -1) { ase_printf ( ASE_T("PARSE ERROR: CODE [%d] LINE [%u] %s\n"), @@ -703,8 +702,7 @@ static int awk_main (int argc, ase_char_t* argv[]) close_awk (awk); - if (ao.iss != ASE_NULL) free (ao.iss); - if (ao.isf != ASE_NULL) free (ao.isf); + if (ao.ist == ASE_AWK_PARSE_FILES && ao.isp != ASE_NULL) free (ao.isp); if (ao.osf != ASE_NULL) free (ao.osf); if (ao.icf != ASE_NULL) free (ao.icf); if (ao.vm != ASE_NULL) ase_map_close (ao.vm); diff --git a/ase/include/ase/awk/awk.h b/ase/include/ase/awk/awk.h index 83d63c20..8ef47949 100644 --- a/ase/include/ase/awk/awk.h +++ b/ase/include/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 470 2008-12-11 13:43:05Z baconevi $ + * $Id: awk.h 478 2008-12-12 09:42:32Z baconevi $ * * {License} */ @@ -474,7 +474,7 @@ enum ase_awk_valtostr_opt_t ASE_AWK_VALTOSTR_PRINT = (1 << 2) }; -enum ase_awk_parse_opt_t +enum ase_awk_parse_ist_t { ASE_AWK_PARSE_FILES = 0, ASE_AWK_PARSE_STRING = 1 @@ -843,10 +843,9 @@ ase_awk_t* ase_awk_opensimple (void); */ int ase_awk_parsesimple ( ase_awk_t* awk, - const void* is /* source file names or source string */, - ase_size_t isl /* source file count or source string length */, - const ase_char_t* osf /* an output source file name */, - int opt /* ASE_AWK_PARSE_FILES, ASE_AWK_PARSE_STRING */ + const void* isp /* source file names or source string */, + int ist /* ASE_AWK_PARSE_FILES, ASE_AWK_PARSE_STRING */, + 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 dba513ae..eb487f27 100644 --- a/ase/lib/awk/std.c +++ b/ase/lib/awk/std.c @@ -64,8 +64,12 @@ struct sf_t { struct { - const ase_char_t*const* files; - ase_size_t count; /* the number of files */ + int type; + union + { + const ase_char_t*const* files; + const ase_char_t* str; + } p; ase_size_t index; /* current file index */ ase_sio_t* handle; /* the handle to an open file */ } in; @@ -86,29 +90,29 @@ static ase_ssize_t sf_in (int cmd, void* arg, ase_char_t* data, ase_size_t size) if (cmd == ASE_AWK_IO_OPEN) { - if (sf->in.index >= sf->in.count) return 0; - /* - if (sf->in.files[sf->in.index] == ASE_NULL) return 0; - */ - - if (sf->in.files[sf->in.index][0] == ASE_T('\0')) + if (sf->in.type == ASE_AWK_PARSE_FILES) { - sf->in.handle = ase_sio_in; - } - else - { - sf->in.handle = ase_sio_open ( - ase_awk_getmmgr(sf->awk), - 0, - sf->in.files[sf->in.index], - ASE_SIO_READ - ); - if (sf->in.handle == ASE_NULL) return -1; - } + if (sf->in.p.files[sf->in.index] == ASE_NULL) return 0; - /* - ase_awk_setsinname (); - */ + if (sf->in.p.files[sf->in.index][0] == ASE_T('\0')) + { + sf->in.handle = ase_sio_in; + } + else + { + sf->in.handle = ase_sio_open ( + ase_awk_getmmgr(sf->awk), + 0, + sf->in.p.files[sf->in.index], + ASE_SIO_READ + ); + if (sf->in.handle == ASE_NULL) return -1; + } + + /* + ase_awk_setsinname (); + */ + } return 1; } @@ -127,36 +131,47 @@ static ase_ssize_t sf_in (int cmd, void* arg, ase_char_t* data, ase_size_t size) else if (cmd == ASE_AWK_IO_READ) { ase_ssize_t n = 0; - ase_sio_t* fp; - retry: - fp = sf->in.handle; - - n = ase_sio_getsx (fp, data, size); - if (n == 0 && ++sf->in.index < sf->in.count) + if (sf->in.type == ASE_AWK_PARSE_FILES) { - if (fp != ase_sio_in) ase_sio_close (fp); - if (sf->in.files[sf->in.index][0] == ASE_T('\0')) - { - sf->in.handle = ase_sio_in; - } - else - { - sf->in.handle = ase_sio_open ( - ase_awk_getmmgr(sf->awk), - 0, - sf->in.files[sf->in.index], - ASE_SIO_READ - ); - if (sf->in.handle == ASE_NULL) return -1; - } + ase_sio_t* sio; - /* TODO: reset internal line counters... - set new source name.... - ase_awk_setsinname (); - */ + retry: + sio = sf->in.handle; - goto retry; + n = ase_sio_getsx (sio, data, size); + if (n == 0 && sf->in.p.files[++sf->in.index] != ASE_NULL) + { + if (sio != ase_sio_in) ase_sio_close (sio); + if (sf->in.p.files[sf->in.index][0] == ASE_T('\0')) + { + sf->in.handle = ase_sio_in; + } + else + { + sf->in.handle = ase_sio_open ( + ase_awk_getmmgr(sf->awk), + 0, + sf->in.p.files[sf->in.index], + ASE_SIO_READ + ); + if (sf->in.handle == ASE_NULL) return -1; + } + + /* TODO: reset internal line counters... + set new source name.... + ase_awk_setsinname (); + */ + + goto retry; + } + } + else + { + while (n < size && sf->in.p.str[sf->in.index] != ASE_T('\0')) + { + data[n++] = sf->in.p.str[sf->in.index++]; + } } return n; @@ -233,35 +248,29 @@ static ase_ssize_t sf_out (int cmd, void* arg, ase_char_t* data, ase_size_t size } int ase_awk_parsesimple ( - ase_awk_t* awk, const void* is, ase_size_t isl, - const ase_char_t* osf, int opt) + ase_awk_t* awk, const void* isp, int ist, const ase_char_t* osf) { sf_t sf; ase_awk_srcios_t sio; - if (is == ASE_NULL || isl == 0) + if (isp == ASE_NULL) { ase_awk_seterrnum (awk, ASE_AWK_EINVAL); return -1; } - if (opt == ASE_AWK_PARSE_FILES) - { - sf.in.files = is; - sf.in.count = isl; - sf.in.index = 0; - sf.in.handle = ASE_NULL; - } - else if (opt == ASE_AWK_PARSE_STRING) - { - /* TODO */ - } + if (ist == ASE_AWK_PARSE_FILES) sf.in.p.files = isp; + else if (ist == ASE_AWK_PARSE_STRING) sf.in.p.str = isp; else { ase_awk_seterrnum (awk, ASE_AWK_EINVAL); return -1; } + sf.in.type = ist; + sf.in.index = 0; + sf.in.handle = ASE_NULL; + sf.out.file = osf; sf.out.handle = ASE_NULL; sf.awk = awk; @@ -277,8 +286,11 @@ int ase_awk_parsesimple ( typedef struct runio_data_t { - ase_char_t** icf; /* input console files */ - ase_size_t icf_cur; + struct + { + ase_char_t** files; + ase_size_t index; + } ic; /* input console */ } runio_data_t; static ase_ssize_t awk_extio_pipe ( @@ -456,14 +468,14 @@ static int open_extio_console (ase_awk_extio_t* epa) if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ) { - if (rd->icf[rd->icf_cur] == ASE_NULL) + if (rd->ic.files[rd->ic.index] == ASE_NULL) { /* no more input file */ //dprint (ASE_T("console - no more file\n"));; return 0; } - if (rd->icf[rd->icf_cur][0] == ASE_T('\0')) + if (rd->ic.files[rd->ic.index][0] == ASE_T('\0')) { //dprint (ASE_T(" console(r) - \n")); epa->handle = ase_sio_in; @@ -477,24 +489,24 @@ static int open_extio_console (ase_awk_extio_t* epa) fp = ase_sio_open ( ase_awk_getrunmmgr(epa->run), 0, - rd->icf[rd->icf_cur], + rd->ic.files[rd->ic.index], ASE_SIO_READ ); if (fp == ASE_NULL) { ase_cstr_t errarg; - errarg.ptr = rd->icf[rd->icf_cur]; - errarg.len = ase_strlen(rd->icf[rd->icf_cur]); + errarg.ptr = rd->ic.files[rd->ic.index]; + errarg.len = ase_strlen(rd->ic.files[rd->ic.index]); ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1); return -1; } - //dprint (ASE_T(" console(r) - %s\n"), rd->icf[rd->icf_cur]); + //dprint (ASE_T(" console(r) - %s\n"), rd->ic.files[rd->ic.index]); if (ase_awk_setfilename ( - epa->run, rd->icf[rd->icf_cur], - ase_strlen(rd->icf[rd->icf_cur])) == -1) + epa->run, rd->ic.files[rd->ic.index], + ase_strlen(rd->ic.files[rd->ic.index])) == -1) { ase_sio_close (fp); return -1; @@ -503,7 +515,7 @@ static int open_extio_console (ase_awk_extio_t* epa) epa->handle = fp; } - rd->icf_cur++; + rd->ic.index++; return 1; } else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE) @@ -554,13 +566,13 @@ static ase_ssize_t awk_extio_console ( { /* it has reached the end of the current file. * open the next file if available */ - if (rd->icf[rd->icf_cur] == ASE_NULL) + if (rd->ic.files[rd->ic.index] == ASE_NULL) { /* no more input console */ return 0; } - if (rd->icf[rd->icf_cur][0] == ASE_T('\0')) + if (rd->ic.files[rd->ic.index][0] == ASE_T('\0')) { if (epa->handle != ASE_NULL && epa->handle != ase_sio_in && @@ -579,7 +591,7 @@ static ase_ssize_t awk_extio_console ( fp = ase_sio_open ( ase_awk_getrunmmgr(epa->run), 0, - rd->icf[rd->icf_cur], + rd->ic.files[rd->ic.index], ASE_SIO_READ ); @@ -587,16 +599,16 @@ static ase_ssize_t awk_extio_console ( { ase_cstr_t errarg; - errarg.ptr = rd->icf[rd->icf_cur]; - errarg.len = ase_strlen(rd->icf[rd->icf_cur]); + errarg.ptr = rd->ic.files[rd->ic.index]; + errarg.len = ase_strlen(rd->ic.files[rd->ic.index]); ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1); return -1; } if (ase_awk_setfilename ( - epa->run, rd->icf[rd->icf_cur], - ase_strlen(rd->icf[rd->icf_cur])) == -1) + epa->run, rd->ic.files[rd->ic.index], + ase_strlen(rd->ic.files[rd->ic.index])) == -1) { ase_sio_close (fp); return -1; @@ -618,11 +630,11 @@ static ase_ssize_t awk_extio_console ( ase_sio_close ((ase_sio_t*)epa->handle); } - //dprint (ASE_T("open the next console [%s]\n"), rd->icf[rd->icf_cur]); + //dprint (ASE_T("open the next console [%s]\n"), rd->ic.files[rd->ic.index]); epa->handle = fp; } - rd->icf_cur++; + rd->ic.index++; } return n; @@ -675,8 +687,8 @@ int ase_awk_runsimple (ase_awk_t* awk, ase_char_t** icf) ase_awk_runios_t runios; runio_data_t rd; - rd.icf = icf; - rd.icf_cur = 0; + rd.ic.files = icf; + rd.ic.index = 0; runios.pipe = awk_extio_pipe; runios.file = awk_extio_file;