From d859d98608730aaeabd35b87e8eb347715d1cc77 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 6 Jul 2006 13:57:32 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk_i.h | 3 +- ase/awk/makefile.bcc | 2 +- ase/awk/run.c | 140 +++++++++++++++++++++++++++++--------- ase/awk/sa.c | 4 +- ase/awk/val.c | 18 +++-- ase/test/awk/awk.c | 4 +- ase/test/awk/makefile.bcc | 2 +- ase/test/awk/t14.awk | 14 +++- 8 files changed, 139 insertions(+), 48 deletions(-) diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 8c66b716..90420ec2 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.26 2006-07-05 16:20:23 bacon Exp $ + * $Id: awk_i.h,v 1.27 2006-07-06 13:57:31 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -140,7 +140,6 @@ struct xp_awk_chain_t xp_awk_chain_t* next; }; - struct xp_awk_run_t { xp_awk_map_t named; diff --git a/ase/awk/makefile.bcc b/ase/awk/makefile.bcc index 1a86882d..5db1a11d 100644 --- a/ase/awk/makefile.bcc +++ b/ase/awk/makefile.bcc @@ -1,4 +1,4 @@ -SRCS = awk.c err.c tree.c tab.c map.c parse.c run.c sa.c val.c misc.c +SRCS = awk.c err.c tree.c tab.c map.c parse.c run.c sa.c val.c func.c misc.c extio.c OBJS = $(SRCS:.c=.obj) OUT = xpawk.lib diff --git a/ase/awk/run.c b/ase/awk/run.c index 596edbf3..86228caa 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.123 2006-07-05 16:20:23 bacon Exp $ + * $Id: run.c,v 1.124 2006-07-06 13:57:31 bacon Exp $ */ #include @@ -72,9 +72,13 @@ static xp_awk_val_t* __eval_group (xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_assignment ( xp_awk_run_t* run, xp_awk_nde_t* nde); static xp_awk_val_t* __do_assignment ( + xp_awk_run_t* run, xp_awk_nde_t* var, xp_awk_val_t* val); +static xp_awk_val_t* __do_assignment_scalar ( xp_awk_run_t* run, xp_awk_nde_var_t* var, xp_awk_val_t* val); static xp_awk_val_t* __do_assignment_map ( xp_awk_run_t* run, xp_awk_nde_var_t* var, xp_awk_val_t* val); +static xp_awk_val_t* __do_assignment_pos ( + xp_awk_run_t* run, xp_awk_nde_pos_t* pos, xp_awk_val_t* val); static xp_awk_val_t* __eval_binary ( xp_awk_run_t* run, xp_awk_nde_t* nde); @@ -969,7 +973,7 @@ static int __run_for (xp_awk_run_t* run, xp_awk_nde_for_t* nde) struct __foreach_walker_t { xp_awk_run_t* run; - xp_awk_nde_var_t* var; + xp_awk_nde_t* var; xp_awk_nde_t* body; }; @@ -1026,7 +1030,7 @@ static int __run_foreach (xp_awk_run_t* run, xp_awk_nde_foreach_t* nde) map = ((xp_awk_val_map_t*)rv)->map; walker.run = run; - walker.var = (xp_awk_nde_var_t*)test->left; + walker.var = test->left; walker.body = nde->body; n = xp_awk_map_walk (map, __walk_foreach, &walker); @@ -1495,22 +1499,71 @@ static xp_awk_val_t* __eval_assignment (xp_awk_run_t* run, xp_awk_nde_t* nde) xp_awk_refupval (val); } - res = __do_assignment (run, (xp_awk_nde_var_t*)ass->left, val); + res = __do_assignment (run, ass->left, val); xp_awk_refdownval (run, val); return res; } static xp_awk_val_t* __do_assignment ( - xp_awk_run_t* run, xp_awk_nde_var_t* var, xp_awk_val_t* val) + xp_awk_run_t* run, xp_awk_nde_t* var, xp_awk_val_t* val) { - if (val->type == XP_AWK_VAL_MAP) { /* a map cannot be assigned to a variable */ PANIC (run, XP_AWK_ENOTASSIGNABLE); } + if (var->type == XP_AWK_NDE_NAMED || + var->type == XP_AWK_NDE_GLOBAL || + var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_ARG) + { + if (__do_assignment_scalar ( + run, (xp_awk_nde_var_t*)var, val) == XP_NULL) + { + return XP_NULL; + } + } + else if (var->type == XP_AWK_NDE_NAMEDIDX || + var->type == XP_AWK_NDE_GLOBALIDX || + var->type == XP_AWK_NDE_LOCALIDX || + var->type == XP_AWK_NDE_ARGIDX) + { + if (__do_assignment_map ( + run, (xp_awk_nde_var_t*)var, val) == XP_NULL) + { + return XP_NULL; + } + } + else if (var->type == XP_AWK_NDE_POS) + { + if (__do_assignment_pos ( + run, (xp_awk_nde_pos_t*)var, val) == XP_NULL) + { + return XP_NULL; + } + } + else + { + xp_assert (!"should never happen - invalid variable type"); + PANIC (run, XP_AWK_EINTERNAL); + } + + return val; +} + +static xp_awk_val_t* __do_assignment_scalar ( + xp_awk_run_t* run, xp_awk_nde_var_t* var, xp_awk_val_t* val) +{ + xp_assert ( + (var->type == XP_AWK_NDE_NAMED || + var->type == XP_AWK_NDE_GLOBAL || + var->type == XP_AWK_NDE_LOCAL || + var->type == XP_AWK_NDE_ARG) && var->idx == XP_NULL); + + xp_assert (val->type != XP_AWK_VAL_MAP); + if (var->type == XP_AWK_NDE_NAMED) { xp_awk_pair_t* pair; @@ -1559,7 +1612,7 @@ static xp_awk_val_t* __do_assignment ( STACK_LOCAL(run,var->id.idxa) = val; xp_awk_refupval (val); } - else if (var->type == XP_AWK_NDE_ARG) + else /* if (var->type == XP_AWK_NDE_ARG) */ { xp_awk_val_t* old = STACK_ARG(run,var->id.idxa); if (old->type == XP_AWK_VAL_MAP) @@ -1573,25 +1626,6 @@ static xp_awk_val_t* __do_assignment ( STACK_ARG(run,var->id.idxa) = val; xp_awk_refupval (val); } - else if (var->type == XP_AWK_NDE_NAMEDIDX || - var->type == XP_AWK_NDE_GLOBALIDX || - var->type == XP_AWK_NDE_LOCALIDX || - var->type == XP_AWK_NDE_ARGIDX) - { - if (__do_assignment_map(run,var,val) == XP_NULL) - return XP_NULL; - } - else if (var->type == XP_AWK_NDE_POS) - { - /* TODO: */ - xp_printf (XP_T("XP_AWK_NDE_POS not implemented\n")); - PANIC (run, XP_AWK_EINTERNAL); - } - else - { - xp_assert (!"should never happen - invalid variable type"); - PANIC (run, XP_AWK_EINTERNAL); - } return val; } @@ -1608,6 +1642,7 @@ static xp_awk_val_t* __do_assignment_map ( var->type == XP_AWK_NDE_GLOBALIDX || var->type == XP_AWK_NDE_LOCALIDX || var->type == XP_AWK_NDE_ARGIDX) && var->idx != XP_NULL); + xp_assert (val->type != XP_AWK_VAL_MAP); if (var->type == XP_AWK_NDE_NAMEDIDX) { @@ -1660,7 +1695,7 @@ static xp_awk_val_t* __do_assignment_map ( xp_awk_refdownval (run, (xp_awk_val_t*)map); STACK_LOCAL(run,var->id.idxa) = tmp; } - else + else /* if (var->type == XP_AWK_NDE_ARGIDX) */ { xp_awk_refdownval (run, (xp_awk_val_t*)map); STACK_ARG(run,var->id.idxa) = tmp; @@ -1692,6 +1727,43 @@ xp_printf (XP_T("**** index str=>%s, map->ref=%d, map->type=%d\n"), str, map->re return val; } +static xp_awk_val_t* __do_assignment_pos ( + xp_awk_run_t* run, xp_awk_nde_pos_t* pos, xp_awk_val_t* val) +{ + xp_awk_val_t* v; + xp_long_t lv; + xp_real_t rv; + int n, errnum; + + v = __eval_expression (run, pos->val); + if (v == XP_NULL) return XP_NULL; + + xp_awk_refupval (v); + n = __val_to_num (v, &lv, &rv); + xp_awk_refdownval (run, v); + + if (n == -1) PANIC (run, XP_AWK_EPOSIDX); + if (n == 1) lv = (xp_long_t)rv; + + if (lv == 0) + { + if (xp_awk_valtostr ( + val, &errnum, &run->inrec.line) == XP_NULL) + { + PANIC (run, errnum); + } + + if (__split_record (run) == -1) return XP_NULL; + } + else + { +xp_printf (XP_T("$X assignemtn NOT IMPLEMENTED\n")); + } + +//xp_awk_refupval (val); + return val; +} + static xp_awk_val_t* __eval_binary (xp_awk_run_t* run, xp_awk_nde_t* nde) { static binop_func_t __binop_func[] = @@ -2797,7 +2869,7 @@ static xp_awk_val_t* __eval_incpre (xp_awk_run_t* run, xp_awk_nde_t* nde) PANIC (run, XP_AWK_EINTERNAL); } - if (__do_assignment(run, (xp_awk_nde_var_t*)exp->left, res) == XP_NULL) + if (__do_assignment (run, exp->left, res) == XP_NULL) { xp_awk_refdownval (run, left); return XP_NULL; @@ -2911,7 +2983,7 @@ static xp_awk_val_t* __eval_incpst (xp_awk_run_t* run, xp_awk_nde_t* nde) PANIC (run, XP_AWK_EINTERNAL); } - if (__do_assignment(run, (xp_awk_nde_var_t*)exp->left, res2) == XP_NULL) + if (__do_assignment (run, exp->left, res2) == XP_NULL) { xp_awk_refdownval (run, left); return XP_NULL; @@ -3424,8 +3496,7 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde) if (v == XP_NULL) PANIC (run, XP_AWK_ENOMEM); xp_awk_refupval (v); - if (__do_assignment(run, - (xp_awk_nde_var_t*)p->var, v) == XP_NULL) + if (__do_assignment(run, p->var, v) == XP_NULL) { xp_awk_refdownval (run, v); return XP_NULL; @@ -3546,7 +3617,8 @@ static int __split_record (xp_awk_run_t* run) nflds = 0; while (p != XP_NULL) { - p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len); + //p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len); + p = xp_strtok (p, XP_T(" \t"), &tok, &tok_len); nflds++; len = len - tok_len; } @@ -3561,7 +3633,9 @@ static int __split_record (xp_awk_run_t* run) while (p != XP_NULL) { - p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len); +// TODO: fix the problem in in xp_strxtok... + //p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len); + p = xp_strtok (p, XP_T(" \t"), &tok, &tok_len); run->inrec.flds[run->inrec.nflds].ptr = tok; run->inrec.flds[run->inrec.nflds].len = tok_len; diff --git a/ase/awk/sa.c b/ase/awk/sa.c index ec8c3abb..8525bb9d 100644 --- a/ase/awk/sa.c +++ b/ase/awk/sa.c @@ -1,5 +1,5 @@ /* - * $Id: sa.c,v 1.24 2006-07-05 16:20:23 bacon Exp $ + * $Id: sa.c,v 1.25 2006-07-06 13:57:31 bacon Exp $ */ #include @@ -295,7 +295,7 @@ xp_str_t* xp_str_open (xp_str_t* str, xp_size_t capa) { if (str == XP_NULL) { - str = (xp_str_t*)xp_malloc (sizeof(xp_str_t)); + str = (xp_str_t*) xp_malloc (sizeof(xp_str_t)); if (str == XP_NULL) return XP_NULL; str->__dynamic = xp_true; } diff --git a/ase/awk/val.c b/ase/awk/val.c index 8952c6f4..db7f1e17 100644 --- a/ase/awk/val.c +++ b/ase/awk/val.c @@ -1,5 +1,5 @@ /* - * $Id: val.c,v 1.35 2006-07-01 16:07:06 bacon Exp $ + * $Id: val.c,v 1.36 2006-07-06 13:57:31 bacon Exp $ */ #include @@ -100,6 +100,7 @@ xp_awk_val_t* xp_awk_makestrval (const xp_char_t* str, xp_size_t len) return XP_NULL; } +xp_printf (XP_T("makestrval => %p\n"), val); return (xp_awk_val_t*)val; } @@ -190,6 +191,7 @@ void xp_awk_freeval (xp_awk_run_t* run, xp_awk_val_t* val, xp_bool_t cache) /*xp_printf (XP_T("freeing [cache=%d] ... "), cache); xp_awk_printval (val); xp_printf (XP_T("\n"));*/ +xp_printf (XP_TEXT("freeing VAL[%p]\n"), val); switch (val->type) { case XP_AWK_VAL_NIL: @@ -217,6 +219,9 @@ xp_printf (XP_T("\n"));*/ return; case XP_AWK_VAL_STR: +xp_printf (XP_TEXT("freeing STR[%p/%s]\n"), + ((xp_awk_val_str_t*)val)->buf, + ((xp_awk_val_str_t*)val)->buf); xp_free (((xp_awk_val_str_t*)val)->buf); xp_free (val); return; @@ -262,11 +267,9 @@ xp_printf (XP_T("\n")); val->ref--; if (val->ref <= 0) { -/* -xp_printf (XP_T("**FREEING ")); +xp_printf (XP_T("**FREEING [")); xp_awk_printval (val); -xp_printf (XP_T("\n")); -*/ +xp_printf (XP_T("]\n")); xp_awk_freeval(run, val, xp_true); } } @@ -344,6 +347,7 @@ xp_char_t* xp_awk_valtostr (xp_awk_val_t* v, int* errnum, xp_str_t* buf) } else { + //xp_str_clear (buf); if (xp_str_cat (buf, XP_T("0")) == (xp_size_t)-1) { *errnum = XP_AWK_ENOMEM; @@ -371,6 +375,8 @@ xp_char_t* xp_awk_valtostr (xp_awk_val_t* v, int* errnum, xp_str_t* buf) } else { + //xp_str_clear (buf); + /* get the current end of the buffer */ tmp = XP_STR_BUF(buf) + XP_STR_LEN(buf); @@ -412,6 +418,7 @@ xp_char_t* xp_awk_valtostr (xp_awk_val_t* v, int* errnum, xp_str_t* buf) } else { + //xp_str_clear (buf); tmp = XP_STR_BUF(buf) + XP_STR_LEN(buf); if (xp_str_ncat (buf, @@ -428,6 +435,7 @@ xp_char_t* xp_awk_valtostr (xp_awk_val_t* v, int* errnum, xp_str_t* buf) /* TODO: process more value types */ +xp_printf (XP_TEXT("*** ERROR: WRONG VALUE TYPE [%d] in xp_awk_valtostr v=> %p***\n"), v->type, v); *errnum = XP_AWK_EVALTYPE; return XP_NULL; } diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index f061020d..ed1c56cd 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.51 2006-07-02 12:16:24 bacon Exp $ + * $Id: awk.c,v 1.52 2006-07-06 13:57:31 bacon Exp $ */ #include @@ -392,7 +392,7 @@ xp_printf (XP_TEXT("closing [%s] of type %d (console)\n"), epa->name, epa->type /* TODO: how to return error or 0 */ fputs_t (data, /*size,*/ (FILE*)epa->handle); /*fputs_t (data, stdout);*/ - MessageBox (NULL, data, data, MB_OK); + /*MessageBox (NULL, data, data, MB_OK);*/ return size; } diff --git a/ase/test/awk/makefile.bcc b/ase/test/awk/makefile.bcc index 4f714890..d2c33ebf 100644 --- a/ase/test/awk/makefile.bcc +++ b/ase/test/awk/makefile.bcc @@ -1,7 +1,7 @@ CC = bcc32 CFLAGS = -I..\..\.. -D__STAND_ALONE LDFLAGS = -L..\..\..\xp\bas -L..\..\..\xp\awk -LIBS = import32.lib cw32mt.lib xpbas.lib xpawk.lib +LIBS = import32.lib cw32mt.lib xpawk.lib STARTUP = c0x32w.obj all: awk diff --git a/ase/test/awk/t14.awk b/ase/test/awk/t14.awk index f29859de..6b8a6ade 100644 --- a/ase/test/awk/t14.awk +++ b/ase/test/awk/t14.awk @@ -18,6 +18,16 @@ END } */ { - $3 = "10"; - print $0, $2, $5; + //$3 = "10"; + //print $0, $2, $5; + $0 = "wow this is just a test"; +print "step 1--------------------"; + //print $0; + a = $6; +print "step 2--------------------"; + print a; + /* + print $6; + */ + print "step 3--------------------"; }