diff --git a/ase/awk/awk.c b/ase/awk/awk.c index c757ce94..f1f7d83f 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.61 2006-07-28 10:34:21 bacon Exp $ + * $Id: awk.c,v 1.62 2006-07-30 15:53:42 bacon Exp $ */ #include @@ -229,7 +229,6 @@ xp_size_t xp_awk_getsrcline (xp_awk_t* awk) return awk->token.line; } - /* TODO: imrove this... should it close io when it is overridden with a new handler??? */ int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg) { diff --git a/ase/awk/awk.h b/ase/awk/awk.h index b74c2a86..59dfb818 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.83 2006-07-28 10:34:21 bacon Exp $ + * $Id: awk.h,v 1.84 2006-07-30 15:53:42 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -61,16 +61,37 @@ enum /* parse options */ enum -{ - XP_AWK_IMPLICIT = (1 << 0), /* allow undeclared variables */ - XP_AWK_EXPLICIT = (1 << 1), /* variable requires explicit declaration */ - XP_AWK_UNIQUE = (1 << 2), /* a function name should not coincide to be a variable name */ - XP_AWK_SHADING = (1 << 3), /* allow variable shading */ - XP_AWK_SHIFT = (1 << 4), /* support shift operators */ - XP_AWK_HASHSIGN = (1 << 5), /* support comments by a hash sign */ - XP_AWK_DBLSLASHES = (1 << 6), /* support comments by double slashes */ +{ + /* allow undeclared variables */ + XP_AWK_IMPLICIT = (1 << 0), - XP_AWK_EXTIO = (1 << 7) /* support getline and print */ + /* variable requires explicit declaration */ + XP_AWK_EXPLICIT = (1 << 1), + + /* a function name should not coincide to be a variable name */ + XP_AWK_UNIQUE = (1 << 2), + + /* allow variable shading */ + XP_AWK_SHADING = (1 << 3), + + /* support shift operators */ + XP_AWK_SHIFT = (1 << 4), + + /* support comments by a hash sign */ + XP_AWK_HASHSIGN = (1 << 5), + + /* support comments by double slashes */ + XP_AWK_DBLSLASHES = (1 << 6), + + /* support string concatenation in tokenization. + * this option can change the behavior of a certain construct. + * getline < "abc" ".def" is treated as if it is getline < "abc.def" + * when this option is on. If this option is off, the same expression + * is treated as if it is (getline < "abc") ".def". */ + XP_AWK_STRCONCAT = (1 << 7), + + /* support getline and print */ + XP_AWK_EXTIO = (1 << 8) }; /* run options */ @@ -177,10 +198,9 @@ void xp_awk_setrunopt (xp_awk_t* awk, int opt); int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t src, void* arg); int xp_awk_detsrc (xp_awk_t* awk); +xp_size_t xp_awk_getsrcline (xp_awk_t* awk); int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg); - -xp_size_t xp_awk_getsrcline (xp_awk_t* awk); int xp_awk_parse (xp_awk_t* awk); int xp_awk_run (xp_awk_t* awk); diff --git a/ase/awk/extio.c b/ase/awk/extio.c index 6eb710a8..15cb88a9 100644 --- a/ase/awk/extio.c +++ b/ase/awk/extio.c @@ -1,5 +1,5 @@ /* - * $Id: extio.c,v 1.21 2006-07-28 10:34:21 bacon Exp $ + * $Id: extio.c,v 1.22 2006-07-30 15:53:42 bacon Exp $ */ #include @@ -144,7 +144,10 @@ int xp_awk_readextio ( xp_free (p->name); xp_free (p); - /* TODO: set ERRNO */ + /* TODO: use meaningful error code */ + xp_awk_setglobal (run, + XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); + *errnum = XP_AWK_ENOERR; return -1; } @@ -183,7 +186,10 @@ int xp_awk_readextio ( if (n == -1) { /* handler error. getline should return -1 */ - /* TODO: set ERRNO */ + /* TODO: use meaningful error code */ + xp_awk_setglobal (run, + XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); + *errnum = XP_AWK_ENOERR; return -1; } @@ -238,19 +244,22 @@ int xp_awk_writeextio ( return -1; } - /* TODO: optimize the buffer management. - * each xp_awk_run_t may have a buffer for this. */ - if (xp_str_open (&buf, 256) == XP_NULL) + if (v->type != XP_AWK_VAL_STR) { - *errnum = XP_AWK_ENOMEM; - return -1; - } + /* TODO: optimize the buffer management. + * each xp_awk_run_t may have a buffer for this. */ + if (xp_str_open (&buf, 256) == XP_NULL) + { + *errnum = XP_AWK_ENOMEM; + return -1; + } - /* convert the value to string representation first */ - if (xp_awk_valtostr(v, errnum, &buf, XP_NULL) == XP_NULL) - { - xp_str_close (&buf); - return -1; + /* convert the value to string representation first */ + if (xp_awk_valtostr(v, errnum, &buf, XP_NULL) == XP_NULL) + { + xp_str_close (&buf); + return -1; + } } /* look for the corresponding extio for name */ @@ -278,7 +287,7 @@ int xp_awk_writeextio ( p = (xp_awk_extio_t*) xp_malloc (xp_sizeof(xp_awk_extio_t)); if (p == XP_NULL) { - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); *errnum = XP_AWK_ENOMEM; return -1; } @@ -287,7 +296,7 @@ int xp_awk_writeextio ( if (p->name == XP_NULL) { xp_free (p); - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); *errnum = XP_AWK_ENOMEM; return -1; } @@ -302,9 +311,12 @@ int xp_awk_writeextio ( { xp_free (p->name); xp_free (p); - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); - /* TODO: set ERRNO */ + /* TODO: use meaningful error code */ + xp_awk_setglobal (run, + XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); + *errnum = XP_AWK_ENOERR; return -1; } @@ -322,21 +334,35 @@ int xp_awk_writeextio ( /* TODO: if write handler returns less than the request, loop */ /* TODO: */ /* TODO: */ - n = handler (XP_AWK_IO_WRITE, p, - XP_STR_BUF(&buf), XP_STR_LEN(&buf)); + if (v->type != XP_AWK_VAL_STR) + { + n = handler (XP_AWK_IO_WRITE, p, + XP_STR_BUF(&buf), XP_STR_LEN(&buf)); + } + else + { + n = handler (XP_AWK_IO_WRITE, p, + ((xp_awk_val_str_t*)v)->buf, + ((xp_awk_val_str_t*)v)->len); + } if (n == -1) { - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); + + /* TODO: use meaningful error code */ + xp_awk_setglobal (run, + XP_AWK_GLOBAL_ERRNO, xp_awk_val_one); + *errnum = XP_AWK_ENOERR; return -1; } if (n == 0) { - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); return 0; } - xp_str_close (&buf); + if (v->type != XP_AWK_VAL_STR) xp_str_close (&buf); return 1; } diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 3f3db025..7e826c56 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.144 2006-07-28 10:36:30 bacon Exp $ + * $Id: parse.c,v 1.145 2006-07-30 15:53:42 bacon Exp $ */ #include @@ -2084,7 +2084,9 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) return XP_NULL; } - in = __parse_expression (awk); + /* TODO: is this correct? */ + /*in = __parse_expression (awk);*/ + in = __parse_primary (awk); if (in == XP_NULL) { if (var != XP_NULL) xp_awk_clrpt (var); @@ -3109,7 +3111,8 @@ static int __get_token (xp_awk_t* awk) SET_TOKEN_TYPE (awk, TOKEN_STR); if (__get_string(awk) == -1) return -1; - while (1) + + while (awk->opt.parse & XP_AWK_STRCONCAT) { do { @@ -3123,6 +3126,7 @@ static int __get_token (xp_awk_t* awk) if (__get_string(awk) == -1) return -1; } + } else if (c == XP_T('=')) { diff --git a/ase/awk/run.c b/ase/awk/run.c index 533129db..fd553980 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.143 2006-07-28 10:36:30 bacon Exp $ + * $Id: run.c,v 1.144 2006-07-30 15:53:42 bacon Exp $ */ #include @@ -460,7 +460,7 @@ static int __run_main (xp_awk_run_t* run) if (__run_block (run, blk) == -1) n = -1; } - if (n == 0) + if (n == 0 && run->awk->tree.chain != XP_NULL) { if (__run_pattern_blocks (run) == -1) n = -1; } @@ -626,7 +626,9 @@ static int __run_pattern_block_chain (xp_awk_run_t* run, xp_awk_chain_t* chain) } else { + /* pattern, pattern { ... } */ xp_assert (ptn->next->next == XP_NULL); + /* TODO: implement this */ xp_awk_refdownval (run, v1); xp_printf (XP_T("ERROR: pattern, pattern NOT OMPLEMENTED\n")); @@ -1388,14 +1390,7 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde) if (p->args == XP_NULL) { - /* TODO: get $0 ans use it for v */ - v = xp_awk_makestrval0 ( - XP_T("\n")); - if (v == XP_NULL) - { - if (out != XP_NULL) xp_free (out); - PANIC_I (run, XP_AWK_ENOMEM); - } + v = run->inrec.d0; xp_awk_refupval (v); n = xp_awk_writeextio (run, p->out_type, dst, v, &errnum); @@ -1434,30 +1429,30 @@ static int __run_print (xp_awk_run_t* run, xp_awk_nde_print_t* nde) /* TODO: print proper field separator */ } - - /* TODO: predefine the new line string - * for performance improvement*/ - v = xp_awk_makestrval (XP_T("\n"), 1); - if (v == XP_NULL) - { - if (out != XP_NULL) xp_free (out); - PANIC_I (run, XP_AWK_ENOMEM); - } - xp_awk_refupval (v); - - n = xp_awk_writeextio ( - run, p->out_type, dst, v, &errnum); - if (n < 0 && errnum != XP_AWK_ENOERR) - { - if (out != XP_NULL) xp_free (out); - xp_awk_refdownval (run, v); - PANIC_I (run, errnum); - } - xp_awk_refdownval (run, v); - - /* TODO: how to handle n == -1 && errnum == XP_AWK_ENOERR. that is the user handler returned an error... */ } + /* TODO: predefine the new line string + * for performance improvement*/ + v = xp_awk_makestrval (XP_T("\n"), 1); + if (v == XP_NULL) + { + if (out != XP_NULL) xp_free (out); + PANIC_I (run, XP_AWK_ENOMEM); + } + xp_awk_refupval (v); + + n = xp_awk_writeextio ( + run, p->out_type, dst, v, &errnum); + if (n < 0 && errnum != XP_AWK_ENOERR) + { + if (out != XP_NULL) xp_free (out); + xp_awk_refdownval (run, v); + PANIC_I (run, errnum); + } + xp_awk_refdownval (run, v); + + /* TODO: how to handle n == -1 && errnum == XP_AWK_ENOERR. that is the user handler returned an error... */ + if (out != XP_NULL) xp_free (out); return 0; } @@ -1661,6 +1656,7 @@ static xp_awk_val_t* __do_assignment_scalar ( PANIC (run, XP_AWK_ENOTSCALARIZABLE); } +/* TODO: if var->id.idxa == XP_AWK_GLOBAL_NF recompute $0, etc */ xp_awk_refdownval (run, old); STACK_GLOBAL(run,var->id.idxa) = val; xp_awk_refupval (val); diff --git a/ase/test/awk/t12.awk b/ase/test/awk/t12.awk index 2acfa865..7af3b8fd 100644 --- a/ase/test/awk/t12.awk +++ b/ase/test/awk/t12.awk @@ -17,7 +17,6 @@ BEGIN getline x < "abc"; if (x == "a") print "xxxxxxxxxxxxxxxx"; else print x; - */ /* @@ -26,9 +25,13 @@ BEGIN print "--------------"; */ - getline x < "abc"; - print x > "abc"; + if (getline x < "abc" == -1) + { + print "ERRNO = ", ERRNO; + } - print (1 (2 getline j) j); - print "abc" 1 + 2 3 + 49 2 / 3; + print x > "def"; + +// print (1 (2 getline j) j); +// print "abc" 1 + 2 3 + 49 2 / 3; } diff --git a/ase/test/awk/t18.awk b/ase/test/awk/t18.awk index a013933b..a18cd23e 100644 --- a/ase/test/awk/t18.awk +++ b/ase/test/awk/t18.awk @@ -1,7 +1,7 @@ /hello/ { //print FILENAME; - print "**1**" $0; + print "**1**" $0; //nextfile; print "----------------"; } diff --git a/ase/test/awk/t6.awk b/ase/test/awk/t6.awk index 79f2455f..7f234684 100644 --- a/ase/test/awk/t6.awk +++ b/ase/test/awk/t6.awk @@ -1,13 +1,14 @@ BEGIN { + j = -20; for (i = -10; i < 10; i++) { - if (i == 5) exit; /*break;*/ + if (i == 5) exit; + //if (i == 5) break; } - j = -10; while (j < 10) { if (j == 5) break; @@ -15,3 +16,8 @@ BEGIN } } +END +{ + print "i = ", i; + print "j = ", j; +} diff --git a/ase/types.h b/ase/types.h index f913b85d..565d36d7 100644 --- a/ase/types.h +++ b/ase/types.h @@ -1,5 +1,5 @@ /* - * $Id: types.h,v 1.51 2006-07-28 17:20:27 bacon Exp $ + * $Id: types.h,v 1.52 2006-07-30 15:53:42 bacon Exp $ */ #ifndef _XP_TYPES_H_ @@ -213,7 +213,7 @@ typedef int xp_mcint_t; #if defined(vms) || defined(__vms) typedef unsigned int xp_wchar_t; typedef int xp_wcint_t; - #if XP_SIZEOF_LONG == 4 + #elif XP_SIZEOF_LONG == 4 typedef long xp_wchar_t; typedef long xp_wcint_t; #else