diff --git a/ase/awk/awk.c b/ase/awk/awk.c index deedfa9a..7c16c7e4 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.27 2006-03-05 17:07:32 bacon Exp $ + * $Id: awk.c,v 1.28 2006-03-07 15:55:14 bacon Exp $ */ #include @@ -75,12 +75,19 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk) awk->src_arg = XP_NULL; awk->in_arg = XP_NULL; awk->out_arg = XP_NULL; + awk->parse.nlocals_max = 0; + awk->tree.nglobals = 0; awk->tree.begin = XP_NULL; awk->tree.end = XP_NULL; awk->tree.chain = XP_NULL; awk->tree.chain_tail = XP_NULL; + + awk->run.stack = XP_NULL; + awk->run.stack_top = 0; + awk->run.stack_limit = 0; + awk->lex.curc = XP_CHAR_EOF; awk->lex.ungotc_count = 0; diff --git a/ase/awk/awk.h b/ase/awk/awk.h index d691473a..5b47240c 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.32 2006-03-04 10:06:49 bacon Exp $ + * $Id: awk.h,v 1.33 2006-03-07 15:55:14 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -18,6 +18,7 @@ #include #include #include +#include /* * TYPE: xp_awk_t @@ -91,6 +92,10 @@ struct xp_awk_t struct { xp_awk_map_t named; + + void* stack; + xp_size_t stack_top; + xp_size_t stack_limit; } run; /* source buffer management */ diff --git a/ase/awk/map.c b/ase/awk/map.c index 285a6b7a..ea73f511 100644 --- a/ase/awk/map.c +++ b/ase/awk/map.c @@ -1,5 +1,5 @@ /* - * $Id: map.c,v 1.5 2006-03-06 04:04:47 bacon Exp $ + * $Id: map.c,v 1.6 2006-03-07 15:55:14 bacon Exp $ */ #include @@ -16,7 +16,8 @@ static xp_size_t __hash (const xp_char_t* key); #define FREE_PAIR(map,pair) \ - do { \ + do \ + { \ xp_free ((xp_char_t*)(pair)->key); \ if ((map)->freeval != XP_NULL) \ (map)->freeval ((pair)->val); \ @@ -26,7 +27,8 @@ static xp_size_t __hash (const xp_char_t* key); xp_awk_map_t* xp_awk_map_open ( xp_awk_map_t* map, xp_size_t capa, void (*freeval) (void*)) { - if (map == XP_NULL) { + if (map == XP_NULL) + { map = (xp_awk_map_t*) xp_malloc (xp_sizeof(xp_awk_map_t)); if (map == XP_NULL) return XP_NULL; map->__dynamic = xp_true; @@ -35,7 +37,8 @@ xp_awk_map_t* xp_awk_map_open ( map->buck = (xp_awk_pair_t**) xp_malloc (xp_sizeof(xp_awk_pair_t*) * capa); - if (map->buck == XP_NULL) { + if (map->buck == XP_NULL) + { if (map->__dynamic) xp_free (map); return XP_NULL; } @@ -60,10 +63,12 @@ void xp_awk_map_clear (xp_awk_map_t* map) xp_size_t i; xp_awk_pair_t* pair, * next; - for (i = 0; i < map->capa; i++) { + for (i = 0; i < map->capa; i++) + { pair = map->buck[i]; - while (pair != XP_NULL) { + while (pair != XP_NULL) + { next = pair->next; FREE_PAIR (map, pair); @@ -86,7 +91,8 @@ xp_awk_pair_t* xp_awk_map_get (xp_awk_map_t* map, xp_char_t* key) hc = __hash(key) % map->capa; pair = map->buck[hc]; - while (pair != XP_NULL) { + while (pair != XP_NULL) + { if (xp_strcmp(pair->key,key) == 0) return pair; pair = pair->next; } @@ -94,7 +100,7 @@ xp_awk_pair_t* xp_awk_map_get (xp_awk_map_t* map, xp_char_t* key) return XP_NULL; } -xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* value) +xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* val) { xp_awk_pair_t* pair; xp_size_t hc; @@ -102,15 +108,17 @@ xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* value) hc = __hash(key) % map->capa; pair = map->buck[hc]; - while (pair != XP_NULL) { - if (xp_strcmp(pair->key,key) == 0) { - - if (pair->key != key) { + while (pair != XP_NULL) + { + if (xp_strcmp(pair->key,key) == 0) + { + if (pair->key != key) + { xp_free ((xp_char_t*)pair->key); pair->key = key; } - return xp_awk_map_setpair (map, pair, value); + return xp_awk_map_setpair (map, pair, val); } pair = pair->next; } @@ -119,7 +127,7 @@ xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* value) if (pair == XP_NULL) return XP_NULL; pair->key = key; - pair->val = value; + pair->val = val; pair->next = map->buck[hc]; map->buck[hc] = pair; map->size++; @@ -127,7 +135,7 @@ xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* value) return pair; } -xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* value) +xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* val) { xp_awk_pair_t* pair; xp_size_t hc; @@ -135,14 +143,17 @@ xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* value) hc = __hash(key) % map->capa; pair = map->buck[hc]; - while (pair != XP_NULL) { - if (xp_strcmp(pair->key,key) == 0) { - if (pair->key != key) { + while (pair != XP_NULL) + { + if (xp_strcmp(pair->key,key) == 0) + { + if (pair->key != key) + { xp_free ((xp_char_t*)pair->key); pair->key = key; } - return xp_awk_map_setpair (map, pair, value); + return xp_awk_map_setpair (map, pair, val); } pair = pair->next; } @@ -151,25 +162,27 @@ xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* value) } xp_awk_pair_t* xp_awk_map_getpair ( - xp_awk_map_t* map, xp_char_t* key, const void** value) + xp_awk_map_t* map, xp_char_t* key, const void** val) { xp_awk_pair_t* pair; pair = xp_awk_map_get (map, key); if (pair == XP_NULL) return XP_NULL; - *value = pair->val; + *val = pair->val; return pair; } xp_awk_pair_t* xp_awk_map_setpair ( - xp_awk_map_t* map, xp_awk_pair_t* pair, void* value) + xp_awk_map_t* map, xp_awk_pair_t* pair, void* val) { /* use this function with care */ - if (pair->val != value) { - if (map->freeval != XP_NULL) { + if (pair->val != val) + { + if (map->freeval != XP_NULL) + { map->freeval (pair->val); } - pair->val = value; + pair->val = val; } return pair; @@ -184,8 +197,10 @@ int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key) pair = map->buck[hc]; prev = XP_NULL; - while (pair != XP_NULL) { - if (xp_strcmp(pair->key,key) == 0) { + while (pair != XP_NULL) + { + if (xp_strcmp(pair->key,key) == 0) + { if (prev == XP_NULL) map->buck[hc] = pair->next; else prev->next = pair->next; @@ -208,10 +223,12 @@ int xp_awk_map_walk (xp_awk_map_t* map, int (*walker) (xp_awk_pair_t*)) xp_size_t i; xp_awk_pair_t* pair, * next; - for (i = 0; i < map->capa; i++) { + for (i = 0; i < map->capa; i++) + { pair = map->buck[i]; - while (pair != XP_NULL) { + while (pair != XP_NULL) + { next = pair->next; if (walker(pair) == -1) return -1; pair = next; @@ -225,7 +242,8 @@ static xp_size_t __hash (const xp_char_t* key) { xp_size_t n = 0, i; - while (*key != XP_CHAR('\0')) { + while (*key != XP_CHAR('\0')) + { xp_byte_t* bp = (xp_byte_t*)key; for (i = 0; i < xp_sizeof(*key); i++) n = n * 31 + *bp++; key++; diff --git a/ase/awk/map.h b/ase/awk/map.h index 5f447a28..eec2340d 100644 --- a/ase/awk/map.h +++ b/ase/awk/map.h @@ -1,5 +1,5 @@ /* - * $Id: map.h,v 1.4 2006-03-06 04:04:47 bacon Exp $ + * $Id: map.h,v 1.5 2006-03-07 15:55:14 bacon Exp $ */ #ifndef _XP_AWK_MAP_H_ @@ -50,9 +50,9 @@ xp_awk_pair_t* xp_awk_map_put (xp_awk_map_t* map, xp_char_t* key, void* val); xp_awk_pair_t* xp_awk_map_set (xp_awk_map_t* map, xp_char_t* key, void* val); xp_awk_pair_t* xp_awk_map_getpair ( - xp_awk_map_t* map, xp_char_t* key, void** value); + xp_awk_map_t* map, xp_char_t* key, void** val); xp_awk_pair_t* xp_awk_map_setpair ( - xp_awk_map_t* map, xp_awk_pair_t* pair, void* value); + xp_awk_map_t* map, xp_awk_pair_t* pair, void* val); int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key); int xp_awk_map_walk (xp_awk_map_t* map, int (*walker) (xp_awk_pair_t*)); diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 1d1eeb03..d49e5bc0 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.58 2006-03-05 17:07:32 bacon Exp $ + * $Id: parse.c,v 1.59 2006-03-07 15:55:14 bacon Exp $ */ #include @@ -73,22 +73,6 @@ enum __TOKEN_COUNT__ }; -enum { - BINOP_PLUS, - BINOP_MINUS, - BINOP_MUL, - BINOP_DIV, - BINOP_MOD, - BINOP_RSHIFT, - BINOP_LSHIFT, - BINOP_EQ, - BINOP_NE, - BINOP_GT, - BINOP_GE, - BINOP_LT, - BINOP_LE -}; - #if defined(__BORLANDC__) || defined(_MSC_VER) #define INLINE #else @@ -311,7 +295,7 @@ static xp_awk_t* __parse_progunit (xp_awk_t* awk) nglobals = xp_awk_tab_getsize(&awk->parse.globals); if (__collect_globals(awk) == XP_NULL) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.globals, nglobals, xp_awk_tab_getsize(&awk->parse.globals) - nglobals); return XP_NULL; @@ -462,7 +446,7 @@ static xp_awk_nde_t* __parse_function (xp_awk_t* awk) } /* push the parameter to the parameter list */ - if (xp_awk_tab_adddatum(&awk->parse.params, param) == (xp_size_t)-1) + if (xp_awk_tab_add(&awk->parse.params, param) == (xp_size_t)-1) { xp_free (name_dup); xp_awk_tab_clear (&awk->parse.params); @@ -639,7 +623,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) if (__get_token(awk) == -1) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); return XP_NULL; @@ -647,7 +631,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) if (__collect_locals(awk, nlocals) == XP_NULL) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); return XP_NULL; @@ -662,7 +646,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) { if (MATCH(awk,TOKEN_EOF)) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); if (head != XP_NULL) xp_awk_clrpt (head); @@ -673,7 +657,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) { if (__get_token(awk) == -1) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); if (head != XP_NULL) xp_awk_clrpt (head); @@ -685,7 +669,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) nde = __parse_statement (awk); if (nde == XP_NULL) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); if (head != XP_NULL) xp_awk_clrpt (head); @@ -705,7 +689,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) block = (xp_awk_nde_blk_t*)xp_malloc(xp_sizeof(xp_awk_nde_blk_t)); if (block == XP_NULL) { - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_clrpt (head); @@ -715,7 +699,7 @@ static xp_awk_nde_t* __parse_block (xp_awk_t* awk, xp_bool_t is_top) tmp = xp_awk_tab_getsize(&awk->parse.locals); if (tmp > awk->parse.nlocals_max) awk->parse.nlocals_max = tmp; - xp_awk_tab_remrange ( + xp_awk_tab_remove ( &awk->parse.locals, nlocals, tmp - nlocals); /* adjust number of locals for a block without any statements */ @@ -772,7 +756,7 @@ static xp_awk_t* __collect_globals (xp_awk_t* awk) PANIC (awk, XP_AWK_EDUPVAR); } - if (xp_awk_tab_adddatum(&awk->parse.globals, global) == (xp_size_t)-1) + if (xp_awk_tab_add(&awk->parse.globals, global) == (xp_size_t)-1) { PANIC (awk, XP_AWK_ENOMEM); } @@ -831,7 +815,7 @@ static xp_awk_t* __collect_locals (xp_awk_t* awk, xp_size_t nlocals) PANIC (awk, XP_AWK_EDUPVAR); } - if (xp_awk_tab_adddatum(&awk->parse.locals, local) == (xp_size_t)-1) + if (xp_awk_tab_add(&awk->parse.locals, local) == (xp_size_t)-1) { PANIC (awk, XP_AWK_ENOMEM); } @@ -1061,8 +1045,8 @@ static xp_awk_nde_t* __parse_equality (xp_awk_t* awk) while (1) { - if (MATCH(awk,TOKEN_EQ)) opcode = BINOP_EQ; - else if (MATCH(awk,TOKEN_NE)) opcode = BINOP_NE; + if (MATCH(awk,TOKEN_EQ)) opcode = XP_AWK_BINOP_EQ; + else if (MATCH(awk,TOKEN_NE)) opcode = XP_AWK_BINOP_NE; else break; if (__get_token(awk) == -1) @@ -1111,10 +1095,10 @@ static xp_awk_nde_t* __parse_relational (xp_awk_t* awk) while (1) { - if (MATCH(awk,TOKEN_GT)) opcode = BINOP_GT; - else if (MATCH(awk,TOKEN_GE)) opcode = BINOP_GE; - else if (MATCH(awk,TOKEN_LT)) opcode = BINOP_LT; - else if (MATCH(awk,TOKEN_LE)) opcode = BINOP_LE; + if (MATCH(awk,TOKEN_GT)) opcode = XP_AWK_BINOP_GT; + else if (MATCH(awk,TOKEN_GE)) opcode = XP_AWK_BINOP_GE; + else if (MATCH(awk,TOKEN_LT)) opcode = XP_AWK_BINOP_LT; + else if (MATCH(awk,TOKEN_LE)) opcode = XP_AWK_BINOP_LE; else break; if (__get_token(awk) == -1) @@ -1163,8 +1147,8 @@ static xp_awk_nde_t* __parse_shift (xp_awk_t* awk) while (1) { - if (MATCH(awk,TOKEN_RSHIFT)) opcode = BINOP_RSHIFT; - else if (MATCH(awk,TOKEN_LSHIFT)) opcode = BINOP_LSHIFT; + if (MATCH(awk,TOKEN_RSHIFT)) opcode = XP_AWK_BINOP_RSHIFT; + else if (MATCH(awk,TOKEN_LSHIFT)) opcode = XP_AWK_BINOP_LSHIFT; else break; if (__get_token(awk) == -1) @@ -1213,8 +1197,8 @@ static xp_awk_nde_t* __parse_additive (xp_awk_t* awk) while (1) { - if (MATCH(awk,TOKEN_PLUS)) opcode = BINOP_PLUS; - else if (MATCH(awk,TOKEN_MINUS)) opcode = BINOP_MINUS; + if (MATCH(awk,TOKEN_PLUS)) opcode = XP_AWK_BINOP_PLUS; + else if (MATCH(awk,TOKEN_MINUS)) opcode = XP_AWK_BINOP_MINUS; else break; if (__get_token(awk) == -1) @@ -1263,9 +1247,9 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) while (1) { - if (MATCH(awk,TOKEN_MUL)) opcode = BINOP_MUL; - else if (MATCH(awk,TOKEN_DIV)) opcode = BINOP_DIV; - else if (MATCH(awk,TOKEN_MOD)) opcode = BINOP_MOD; + if (MATCH(awk,TOKEN_MUL)) opcode = XP_AWK_BINOP_MUL; + else if (MATCH(awk,TOKEN_DIV)) opcode = XP_AWK_BINOP_DIV; + else if (MATCH(awk,TOKEN_MOD)) opcode = XP_AWK_BINOP_MOD; else break; if (__get_token(awk) == -1) @@ -1293,9 +1277,9 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) xp_awk_clrpt (right); - if (opcode == BINOP_MUL) l *= r; - else if (opcode == BINOP_DIV) l /= r; - else if (opcode == BINOP_MOD) l %= r; + if (opcode == XP_AWK_BINOP_MUL) l *= r; + else if (opcode == XP_AWK_BINOP_DIV) l /= r; + else if (opcode == XP_AWK_BINOP_MOD) l %= r; ((xp_awk_nde_int_t*)left)->val = l; continue; diff --git a/ase/awk/run.c b/ase/awk/run.c index ef9e4241..373de18b 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.8 2006-03-06 04:04:47 bacon Exp $ + * $Id: run.c,v 1.9 2006-03-07 15:55:14 bacon Exp $ */ #include @@ -14,6 +14,7 @@ static int __run_statement (xp_awk_t* awk, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde); +static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde); int __printval (xp_awk_pair_t* pair) { @@ -28,13 +29,15 @@ int xp_awk_run (xp_awk_t* awk) if (awk->tree.begin != XP_NULL) { xp_assert (awk->tree.begin->type == XP_AWK_NDE_BLK); - if (__run_block(awk, (xp_awk_nde_blk_t*)awk->tree.begin) == -1) return -1; + if (__run_block (awk, + (xp_awk_nde_blk_t*)awk->tree.begin) == -1) return -1; } if (awk->tree.end != XP_NULL) { xp_assert (awk->tree.end->type == XP_AWK_NDE_BLK); - if (__run_block(awk, (xp_awk_nde_blk_t*)awk->tree.end) == -1) return -1; + if (__run_block (awk, + (xp_awk_nde_blk_t*)awk->tree.end) == -1) return -1; } xp_awk_map_walk (&awk->run.named, __printval); @@ -124,6 +127,8 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde) break; case XP_AWK_NDE_EXP_BIN: + val = __eval_binary(awk,(xp_awk_nde_exp_t*)nde); + break; case XP_AWK_NDE_EXP_UNR: @@ -148,6 +153,15 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde) case XP_AWK_NDE_ARGIDX: case XP_AWK_NDE_NAMED: + { + xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde; + xp_awk_pair_t* pair; + + pair = xp_awk_map_get(&awk->run.named,tgt->id.name); + if (pair == XP_NULL) val = xp_awk_val_nil; + else val = xp_awk_cloneval (pair->val); + } + break; case XP_AWK_NDE_NAMEDIDX: @@ -191,21 +205,6 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde) xp_assert (tgt != XP_NULL); if (new == XP_NULL) return XP_NULL; - /* - name = tgt->id.name; - old = (xp_awk_val_t*)xp_awk_map_getval(&awk->run.named, name); - if (old == XP_NULL) - { - name = xp_strdup (tgt->id.name); - if (name == XP_NULL) - { - xp_awk_freeval(new); - awk->errnum = XP_AWK_ENOMEM; - return XP_NULL; - } - } - */ - pair = xp_awk_map_get(&awk->run.named, tgt->id.name); if (pair == XP_NULL) { @@ -260,3 +259,34 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde) return v; } + +static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde) +{ + xp_awk_val_t* left, * right; + + xp_assert (nde->type == XP_AWK_NDE_EXP_BIN); + + left = __eval_expression (awk, nde->left); + if (left == XP_NULL) return XP_NULL; + + right = __eval_expression (awk, nde->right); + if (right == XP_NULL) + { + xp_awk_freeval(left); + return XP_NULL; + } + +// TODO: a lot of things to do.... + if (nde->opcode == XP_AWK_BINOP_PLUS) + { + if (left->type == XP_AWK_VAL_INT && + right->type == XP_AWK_VAL_INT) + { + ((xp_awk_val_int_t*)left)->val += + ((xp_awk_val_int_t*)right)->val; + } + } + + xp_awk_freeval(right); + return left; +} diff --git a/ase/awk/tab.c b/ase/awk/tab.c index ed9fe4d5..19092969 100644 --- a/ase/awk/tab.c +++ b/ase/awk/tab.c @@ -1,5 +1,5 @@ /* - * $Id: tab.c,v 1.5 2006-03-03 11:51:48 bacon Exp $ + * $Id: tab.c,v 1.6 2006-03-07 15:55:14 bacon Exp $ */ #include @@ -12,7 +12,8 @@ xp_awk_tab_t* xp_awk_tab_open (xp_awk_tab_t* tab) { - if (tab == XP_NULL) { + if (tab == XP_NULL) + { tab = (xp_awk_tab_t*) xp_malloc (xp_sizeof(xp_awk_tab_t)); if (tab == XP_NULL) return XP_NULL; tab->__dynamic = xp_true; @@ -29,7 +30,8 @@ xp_awk_tab_t* xp_awk_tab_open (xp_awk_tab_t* tab) void xp_awk_tab_close (xp_awk_tab_t* tab) { xp_awk_tab_clear (tab); - if (tab->buf != XP_NULL) { + if (tab->buf != XP_NULL) + { xp_free (tab->buf); tab->buf = XP_NULL; tab->capa = 0; @@ -52,17 +54,20 @@ xp_awk_tab_t* xp_awk_tab_setcapa (xp_awk_tab_t* tab, xp_size_t capa) { xp_char_t** tmp; - if (tab->size > capa) { - xp_awk_tab_remrange (tab, capa, tab->size - capa); + if (tab->size > capa) + { + xp_awk_tab_remove (tab, capa, tab->size - capa); xp_assert (tab->size <= capa); } - if (capa > 0) { + if (capa > 0) + { tmp = (xp_char_t**)xp_realloc ( tab->buf, xp_sizeof(xp_char_t*) * capa); if (tmp == XP_NULL) return XP_NULL; } - else { + else + { if (tab->buf != XP_NULL) xp_free (tab->buf); tmp = XP_NULL; } @@ -79,7 +84,8 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab) xp_assert (tab != XP_NULL); - for (i = 0; i < tab->size; i++) { + for (i = 0; i < tab->size; i++) + { xp_free (tab->buf[i]); tab->buf[i] = XP_NULL; } @@ -88,7 +94,7 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab) } -xp_size_t xp_awk_tab_insdatum ( +xp_size_t xp_awk_tab_insert ( xp_awk_tab_t* tab, xp_size_t index, const xp_char_t* value) { xp_size_t i; @@ -97,15 +103,18 @@ xp_size_t xp_awk_tab_insdatum ( value_dup = xp_strdup(value); if (value_dup == XP_NULL) return (xp_size_t)-1; - if (index >= tab->capa) { + if (index >= tab->capa) + { xp_size_t capa; if (tab->capa <= 0) capa = (index + 1); - else { + else + { do { capa = tab->capa * 2; } while (index >= capa); } - if (xp_awk_tab_setcapa(tab,capa) == XP_NULL) { + if (xp_awk_tab_setcapa(tab,capa) == XP_NULL) + { xp_free (value_dup); return (xp_size_t)-1; } @@ -120,7 +129,7 @@ xp_size_t xp_awk_tab_insdatum ( return index; } -xp_size_t xp_awk_tab_remrange ( +xp_size_t xp_awk_tab_remove ( xp_awk_tab_t* tab, xp_size_t index, xp_size_t count) { xp_size_t i, j, k; @@ -132,20 +141,29 @@ xp_size_t xp_awk_tab_remrange ( j = index + count; k = index + count; - while (i < k) { + while (i < k) + { xp_free (tab->buf[i]); + if (j >= tab->size) - tab->buf[i] = (j >= tab->size)? XP_NULL: tab->buf[j]; - i++; j++; + { + tab->buf[i] = XP_NULL; + i++; + } + else + { + tab->buf[i] = tab->buf[j]; + i++; j++; + } } tab->size -= count; return count; } -xp_size_t xp_awk_tab_adddatum (xp_awk_tab_t* tab, const xp_char_t* value) +xp_size_t xp_awk_tab_add (xp_awk_tab_t* tab, const xp_char_t* value) { - return xp_awk_tab_insdatum (tab, tab->size, value); + return xp_awk_tab_insert (tab, tab->size, value); } diff --git a/ase/awk/tab.h b/ase/awk/tab.h index 3306cc84..5c982306 100644 --- a/ase/awk/tab.h +++ b/ase/awk/tab.h @@ -1,5 +1,5 @@ /* - * $Id: tab.h,v 1.4 2006-03-03 11:51:48 bacon Exp $ + * $Id: tab.h,v 1.5 2006-03-07 15:55:14 bacon Exp $ */ #ifndef _XP_AWK_TAB_H_ @@ -42,12 +42,13 @@ xp_awk_tab_t* xp_awk_tab_setcapa (xp_awk_tab_t* tab, xp_size_t capa); void xp_awk_tab_clear (xp_awk_tab_t* tab); -xp_size_t xp_awk_tab_insdatum ( +xp_size_t xp_awk_tab_insert ( xp_awk_tab_t* tab, xp_size_t index, const xp_char_t* value); -xp_size_t xp_awk_tab_remrange ( +xp_size_t xp_awk_tab_remove ( xp_awk_tab_t* tab, xp_size_t index, xp_size_t count); -xp_size_t xp_awk_tab_adddatum (xp_awk_tab_t* tab, const xp_char_t* value); +xp_size_t xp_awk_tab_add (xp_awk_tab_t* tab, const xp_char_t* value); + xp_size_t xp_awk_tab_find ( xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index); xp_size_t xp_awk_tab_rfind ( diff --git a/ase/awk/val.c b/ase/awk/val.c index 96f7acbf..1a0a1590 100644 --- a/ase/awk/val.c +++ b/ase/awk/val.c @@ -1,9 +1,12 @@ /* - * $Id: val.c,v 1.2 2006-03-05 17:07:33 bacon Exp $ + * $Id: val.c,v 1.3 2006-03-07 15:55:14 bacon Exp $ */ #include +static xp_awk_val_nil_t __awk_nil = { XP_AWK_VAL_NIL }; +xp_awk_val_t* xp_awk_val_nil = (xp_awk_val_t*)&__awk_nil; + xp_awk_val_t* xp_awk_makeintval (xp_long_t v) { xp_awk_val_int_t* val; @@ -59,11 +62,36 @@ void xp_awk_freeval (xp_awk_val_t* val) } } +xp_awk_val_t* xp_awk_cloneval (xp_awk_val_t* val) +{ + if (val == XP_NULL) return xp_awk_val_nil; + + switch (val->type) + { + case XP_AWK_VAL_NIL: + return xp_awk_val_nil; + case XP_AWK_VAL_INT: + return xp_awk_makeintval (((xp_awk_val_int_t*)val)->val); + case XP_AWK_VAL_REAL: + return xp_awk_makerealval (((xp_awk_val_real_t*)val)->val); + case XP_AWK_VAL_STR: + return xp_awk_makestrval ( + ((xp_awk_val_str_t*)val)->buf, + ((xp_awk_val_str_t*)val)->len); + } + + return XP_NULL; +} + void xp_awk_printval (xp_awk_val_t* val) { // TODO: better value printing...................... switch (val->type) { + case XP_AWK_VAL_NIL: + xp_printf (XP_TEXT("nil")); + break; + case XP_AWK_VAL_INT: xp_printf (XP_TEXT("%lld"), (long long)((xp_awk_val_int_t*)val)->val); diff --git a/ase/awk/val.h b/ase/awk/val.h index 4194d1dc..83e6a60e 100644 --- a/ase/awk/val.h +++ b/ase/awk/val.h @@ -1,5 +1,5 @@ /* - * $Id: val.h,v 1.3 2006-03-05 17:07:33 bacon Exp $ + * $Id: val.h,v 1.4 2006-03-07 15:55:14 bacon Exp $ */ #ifndef _XP_AWK_VAL_H_ @@ -11,12 +11,14 @@ enum { + XP_AWK_VAL_NIL, XP_AWK_VAL_INT, XP_AWK_VAL_REAL, XP_AWK_VAL_STR }; typedef struct xp_awk_val_t xp_awk_val_t; +typedef struct xp_awk_val_nil_t xp_awk_val_nil_t; typedef struct xp_awk_val_int_t xp_awk_val_int_t; typedef struct xp_awk_val_real_t xp_awk_val_real_t; typedef struct xp_awk_val_str_t xp_awk_val_str_t; @@ -29,6 +31,12 @@ struct xp_awk_val_t XP_AWK_VAL_HDR; }; +/* XP_AWK_VAL_NIL */ +struct xp_awk_val_nil_t +{ + XP_AWK_VAL_HDR; +}; + /* XP_AWK_VAL_INT */ struct xp_awk_val_int_t { @@ -55,10 +63,13 @@ struct xp_awk_val_str_t extern "C" { #endif +extern xp_awk_val_t* xp_awk_val_nil; + xp_awk_val_t* xp_awk_makeintval (xp_long_t v); xp_awk_val_t* xp_awk_makestrval (const xp_char_t* str, xp_size_t len); void xp_awk_freeval (xp_awk_val_t* val); +xp_awk_val_t* xp_awk_cloneval (xp_awk_val_t* val); void xp_awk_printval (xp_awk_val_t* val); #ifdef __cplusplus