*** empty log message ***

This commit is contained in:
hyung-hwan 2006-03-07 15:55:14 +00:00
parent 7c6f19d0bf
commit 7e22a65fd0
10 changed files with 223 additions and 121 deletions

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -75,12 +75,19 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk)
awk->src_arg = XP_NULL; awk->src_arg = XP_NULL;
awk->in_arg = XP_NULL; awk->in_arg = XP_NULL;
awk->out_arg = XP_NULL; awk->out_arg = XP_NULL;
awk->parse.nlocals_max = 0; awk->parse.nlocals_max = 0;
awk->tree.nglobals = 0; awk->tree.nglobals = 0;
awk->tree.begin = XP_NULL; awk->tree.begin = XP_NULL;
awk->tree.end = XP_NULL; awk->tree.end = XP_NULL;
awk->tree.chain = XP_NULL; awk->tree.chain = XP_NULL;
awk->tree.chain_tail = 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.curc = XP_CHAR_EOF;
awk->lex.ungotc_count = 0; awk->lex.ungotc_count = 0;

View File

@ -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_ #ifndef _XP_AWK_AWK_H_
@ -18,6 +18,7 @@
#include <xp/awk/tab.h> #include <xp/awk/tab.h>
#include <xp/awk/map.h> #include <xp/awk/map.h>
#include <xp/awk/val.h> #include <xp/awk/val.h>
#include <xp/awk/run.h>
/* /*
* TYPE: xp_awk_t * TYPE: xp_awk_t
@ -91,6 +92,10 @@ struct xp_awk_t
struct struct
{ {
xp_awk_map_t named; xp_awk_map_t named;
void* stack;
xp_size_t stack_top;
xp_size_t stack_limit;
} run; } run;
/* source buffer management */ /* source buffer management */

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -16,7 +16,8 @@
static xp_size_t __hash (const xp_char_t* key); static xp_size_t __hash (const xp_char_t* key);
#define FREE_PAIR(map,pair) \ #define FREE_PAIR(map,pair) \
do { \ do \
{ \
xp_free ((xp_char_t*)(pair)->key); \ xp_free ((xp_char_t*)(pair)->key); \
if ((map)->freeval != XP_NULL) \ if ((map)->freeval != XP_NULL) \
(map)->freeval ((pair)->val); \ (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* xp_awk_map_open (
xp_awk_map_t* map, xp_size_t capa, void (*freeval) (void*)) 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)); map = (xp_awk_map_t*) xp_malloc (xp_sizeof(xp_awk_map_t));
if (map == XP_NULL) return XP_NULL; if (map == XP_NULL) return XP_NULL;
map->__dynamic = xp_true; map->__dynamic = xp_true;
@ -35,7 +37,8 @@ xp_awk_map_t* xp_awk_map_open (
map->buck = (xp_awk_pair_t**) map->buck = (xp_awk_pair_t**)
xp_malloc (xp_sizeof(xp_awk_pair_t*) * capa); 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); if (map->__dynamic) xp_free (map);
return XP_NULL; return XP_NULL;
} }
@ -60,10 +63,12 @@ void xp_awk_map_clear (xp_awk_map_t* map)
xp_size_t i; xp_size_t i;
xp_awk_pair_t* pair, * next; xp_awk_pair_t* pair, * next;
for (i = 0; i < map->capa; i++) { for (i = 0; i < map->capa; i++)
{
pair = map->buck[i]; pair = map->buck[i];
while (pair != XP_NULL) { while (pair != XP_NULL)
{
next = pair->next; next = pair->next;
FREE_PAIR (map, pair); 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; hc = __hash(key) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) { while (pair != XP_NULL)
{
if (xp_strcmp(pair->key,key) == 0) return pair; if (xp_strcmp(pair->key,key) == 0) return pair;
pair = pair->next; 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; 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_awk_pair_t* pair;
xp_size_t hc; 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; hc = __hash(key) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) { while (pair != XP_NULL)
if (xp_strcmp(pair->key,key) == 0) { {
if (xp_strcmp(pair->key,key) == 0)
if (pair->key != key) { {
if (pair->key != key)
{
xp_free ((xp_char_t*)pair->key); xp_free ((xp_char_t*)pair->key);
pair->key = key; pair->key = key;
} }
return xp_awk_map_setpair (map, pair, value); return xp_awk_map_setpair (map, pair, val);
} }
pair = pair->next; 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; if (pair == XP_NULL) return XP_NULL;
pair->key = key; pair->key = key;
pair->val = value; pair->val = val;
pair->next = map->buck[hc]; pair->next = map->buck[hc];
map->buck[hc] = pair; map->buck[hc] = pair;
map->size++; 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; 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_awk_pair_t* pair;
xp_size_t hc; 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; hc = __hash(key) % map->capa;
pair = map->buck[hc]; pair = map->buck[hc];
while (pair != XP_NULL) { while (pair != XP_NULL)
if (xp_strcmp(pair->key,key) == 0) { {
if (pair->key != key) { if (xp_strcmp(pair->key,key) == 0)
{
if (pair->key != key)
{
xp_free ((xp_char_t*)pair->key); xp_free ((xp_char_t*)pair->key);
pair->key = key; pair->key = key;
} }
return xp_awk_map_setpair (map, pair, value); return xp_awk_map_setpair (map, pair, val);
} }
pair = pair->next; 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_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; xp_awk_pair_t* pair;
pair = xp_awk_map_get (map, key); pair = xp_awk_map_get (map, key);
if (pair == XP_NULL) return XP_NULL; if (pair == XP_NULL) return XP_NULL;
*value = pair->val; *val = pair->val;
return pair; return pair;
} }
xp_awk_pair_t* xp_awk_map_setpair ( 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 */ /* use this function with care */
if (pair->val != value) { if (pair->val != val)
if (map->freeval != XP_NULL) { {
if (map->freeval != XP_NULL)
{
map->freeval (pair->val); map->freeval (pair->val);
} }
pair->val = value; pair->val = val;
} }
return pair; return pair;
@ -184,8 +197,10 @@ int xp_awk_map_remove (xp_awk_map_t* map, xp_char_t* key)
pair = map->buck[hc]; pair = map->buck[hc];
prev = XP_NULL; prev = XP_NULL;
while (pair != XP_NULL) { while (pair != XP_NULL)
if (xp_strcmp(pair->key,key) == 0) { {
if (xp_strcmp(pair->key,key) == 0)
{
if (prev == XP_NULL) if (prev == XP_NULL)
map->buck[hc] = pair->next; map->buck[hc] = pair->next;
else prev->next = 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_size_t i;
xp_awk_pair_t* pair, * next; xp_awk_pair_t* pair, * next;
for (i = 0; i < map->capa; i++) { for (i = 0; i < map->capa; i++)
{
pair = map->buck[i]; pair = map->buck[i];
while (pair != XP_NULL) { while (pair != XP_NULL)
{
next = pair->next; next = pair->next;
if (walker(pair) == -1) return -1; if (walker(pair) == -1) return -1;
pair = next; pair = next;
@ -225,7 +242,8 @@ static xp_size_t __hash (const xp_char_t* key)
{ {
xp_size_t n = 0, i; xp_size_t n = 0, i;
while (*key != XP_CHAR('\0')) { while (*key != XP_CHAR('\0'))
{
xp_byte_t* bp = (xp_byte_t*)key; xp_byte_t* bp = (xp_byte_t*)key;
for (i = 0; i < xp_sizeof(*key); i++) n = n * 31 + *bp++; for (i = 0; i < xp_sizeof(*key); i++) n = n * 31 + *bp++;
key++; key++;

View File

@ -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_ #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_set (xp_awk_map_t* map, xp_char_t* key, void* val);
xp_awk_pair_t* xp_awk_map_getpair ( 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_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_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*)); int xp_awk_map_walk (xp_awk_map_t* map, int (*walker) (xp_awk_pair_t*));

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -73,22 +73,6 @@ enum
__TOKEN_COUNT__ __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) #if defined(__BORLANDC__) || defined(_MSC_VER)
#define INLINE #define INLINE
#else #else
@ -311,7 +295,7 @@ static xp_awk_t* __parse_progunit (xp_awk_t* awk)
nglobals = xp_awk_tab_getsize(&awk->parse.globals); nglobals = xp_awk_tab_getsize(&awk->parse.globals);
if (__collect_globals(awk) == XP_NULL) if (__collect_globals(awk) == XP_NULL)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.globals, nglobals, &awk->parse.globals, nglobals,
xp_awk_tab_getsize(&awk->parse.globals) - nglobals); xp_awk_tab_getsize(&awk->parse.globals) - nglobals);
return XP_NULL; 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 */ /* 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_free (name_dup);
xp_awk_tab_clear (&awk->parse.params); 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) if (__get_token(awk) == -1)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
return XP_NULL; 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) if (__collect_locals(awk, nlocals) == XP_NULL)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
return XP_NULL; 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)) if (MATCH(awk,TOKEN_EOF))
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
if (head != XP_NULL) xp_awk_clrpt (head); 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) if (__get_token(awk) == -1)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
if (head != XP_NULL) xp_awk_clrpt (head); 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); nde = __parse_statement (awk);
if (nde == XP_NULL) if (nde == XP_NULL)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
if (head != XP_NULL) xp_awk_clrpt (head); 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)); block = (xp_awk_nde_blk_t*)xp_malloc(xp_sizeof(xp_awk_nde_blk_t));
if (block == XP_NULL) if (block == XP_NULL)
{ {
xp_awk_tab_remrange ( xp_awk_tab_remove (
&awk->parse.locals, nlocals, &awk->parse.locals, nlocals,
xp_awk_tab_getsize(&awk->parse.locals) - nlocals); xp_awk_tab_getsize(&awk->parse.locals) - nlocals);
xp_awk_clrpt (head); 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); tmp = xp_awk_tab_getsize(&awk->parse.locals);
if (tmp > awk->parse.nlocals_max) awk->parse.nlocals_max = tmp; 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); &awk->parse.locals, nlocals, tmp - nlocals);
/* adjust number of locals for a block without any statements */ /* 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); 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); 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); 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); PANIC (awk, XP_AWK_ENOMEM);
} }
@ -1061,8 +1045,8 @@ static xp_awk_nde_t* __parse_equality (xp_awk_t* awk)
while (1) while (1)
{ {
if (MATCH(awk,TOKEN_EQ)) opcode = BINOP_EQ; if (MATCH(awk,TOKEN_EQ)) opcode = XP_AWK_BINOP_EQ;
else if (MATCH(awk,TOKEN_NE)) opcode = BINOP_NE; else if (MATCH(awk,TOKEN_NE)) opcode = XP_AWK_BINOP_NE;
else break; else break;
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
@ -1111,10 +1095,10 @@ static xp_awk_nde_t* __parse_relational (xp_awk_t* awk)
while (1) while (1)
{ {
if (MATCH(awk,TOKEN_GT)) opcode = BINOP_GT; if (MATCH(awk,TOKEN_GT)) opcode = XP_AWK_BINOP_GT;
else if (MATCH(awk,TOKEN_GE)) opcode = BINOP_GE; else if (MATCH(awk,TOKEN_GE)) opcode = XP_AWK_BINOP_GE;
else if (MATCH(awk,TOKEN_LT)) opcode = BINOP_LT; else if (MATCH(awk,TOKEN_LT)) opcode = XP_AWK_BINOP_LT;
else if (MATCH(awk,TOKEN_LE)) opcode = BINOP_LE; else if (MATCH(awk,TOKEN_LE)) opcode = XP_AWK_BINOP_LE;
else break; else break;
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
@ -1163,8 +1147,8 @@ static xp_awk_nde_t* __parse_shift (xp_awk_t* awk)
while (1) while (1)
{ {
if (MATCH(awk,TOKEN_RSHIFT)) opcode = BINOP_RSHIFT; if (MATCH(awk,TOKEN_RSHIFT)) opcode = XP_AWK_BINOP_RSHIFT;
else if (MATCH(awk,TOKEN_LSHIFT)) opcode = BINOP_LSHIFT; else if (MATCH(awk,TOKEN_LSHIFT)) opcode = XP_AWK_BINOP_LSHIFT;
else break; else break;
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
@ -1213,8 +1197,8 @@ static xp_awk_nde_t* __parse_additive (xp_awk_t* awk)
while (1) while (1)
{ {
if (MATCH(awk,TOKEN_PLUS)) opcode = BINOP_PLUS; if (MATCH(awk,TOKEN_PLUS)) opcode = XP_AWK_BINOP_PLUS;
else if (MATCH(awk,TOKEN_MINUS)) opcode = BINOP_MINUS; else if (MATCH(awk,TOKEN_MINUS)) opcode = XP_AWK_BINOP_MINUS;
else break; else break;
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
@ -1263,9 +1247,9 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk)
while (1) while (1)
{ {
if (MATCH(awk,TOKEN_MUL)) opcode = BINOP_MUL; if (MATCH(awk,TOKEN_MUL)) opcode = XP_AWK_BINOP_MUL;
else if (MATCH(awk,TOKEN_DIV)) opcode = BINOP_DIV; else if (MATCH(awk,TOKEN_DIV)) opcode = XP_AWK_BINOP_DIV;
else if (MATCH(awk,TOKEN_MOD)) opcode = BINOP_MOD; else if (MATCH(awk,TOKEN_MOD)) opcode = XP_AWK_BINOP_MOD;
else break; else break;
if (__get_token(awk) == -1) if (__get_token(awk) == -1)
@ -1293,9 +1277,9 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk)
xp_awk_clrpt (right); xp_awk_clrpt (right);
if (opcode == BINOP_MUL) l *= r; if (opcode == XP_AWK_BINOP_MUL) l *= r;
else if (opcode == BINOP_DIV) l /= r; else if (opcode == XP_AWK_BINOP_DIV) l /= r;
else if (opcode == BINOP_MOD) l %= r; else if (opcode == XP_AWK_BINOP_MOD) l %= r;
((xp_awk_nde_int_t*)left)->val = l; ((xp_awk_nde_int_t*)left)->val = l;
continue; continue;

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -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_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_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) 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) if (awk->tree.begin != XP_NULL)
{ {
xp_assert (awk->tree.begin->type == XP_AWK_NDE_BLK); 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) if (awk->tree.end != XP_NULL)
{ {
xp_assert (awk->tree.end->type == XP_AWK_NDE_BLK); 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); 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; break;
case XP_AWK_NDE_EXP_BIN: case XP_AWK_NDE_EXP_BIN:
val = __eval_binary(awk,(xp_awk_nde_exp_t*)nde);
break;
case XP_AWK_NDE_EXP_UNR: 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_ARGIDX:
case XP_AWK_NDE_NAMED: 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: 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); xp_assert (tgt != XP_NULL);
if (new == XP_NULL) return 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); pair = xp_awk_map_get(&awk->run.named, tgt->id.name);
if (pair == XP_NULL) 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; 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;
}

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
@ -12,7 +12,8 @@
xp_awk_tab_t* xp_awk_tab_open (xp_awk_tab_t* tab) 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)); tab = (xp_awk_tab_t*) xp_malloc (xp_sizeof(xp_awk_tab_t));
if (tab == XP_NULL) return XP_NULL; if (tab == XP_NULL) return XP_NULL;
tab->__dynamic = xp_true; 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) void xp_awk_tab_close (xp_awk_tab_t* tab)
{ {
xp_awk_tab_clear (tab); xp_awk_tab_clear (tab);
if (tab->buf != XP_NULL) { if (tab->buf != XP_NULL)
{
xp_free (tab->buf); xp_free (tab->buf);
tab->buf = XP_NULL; tab->buf = XP_NULL;
tab->capa = 0; 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; xp_char_t** tmp;
if (tab->size > capa) { if (tab->size > capa)
xp_awk_tab_remrange (tab, capa, tab->size - capa); {
xp_awk_tab_remove (tab, capa, tab->size - capa);
xp_assert (tab->size <= capa); xp_assert (tab->size <= capa);
} }
if (capa > 0) { if (capa > 0)
{
tmp = (xp_char_t**)xp_realloc ( tmp = (xp_char_t**)xp_realloc (
tab->buf, xp_sizeof(xp_char_t*) * capa); tab->buf, xp_sizeof(xp_char_t*) * capa);
if (tmp == XP_NULL) return XP_NULL; if (tmp == XP_NULL) return XP_NULL;
} }
else { else
{
if (tab->buf != XP_NULL) xp_free (tab->buf); if (tab->buf != XP_NULL) xp_free (tab->buf);
tmp = XP_NULL; tmp = XP_NULL;
} }
@ -79,7 +84,8 @@ void xp_awk_tab_clear (xp_awk_tab_t* tab)
xp_assert (tab != XP_NULL); xp_assert (tab != XP_NULL);
for (i = 0; i < tab->size; i++) { for (i = 0; i < tab->size; i++)
{
xp_free (tab->buf[i]); xp_free (tab->buf[i]);
tab->buf[i] = XP_NULL; 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_awk_tab_t* tab, xp_size_t index, const xp_char_t* value)
{ {
xp_size_t i; xp_size_t i;
@ -97,15 +103,18 @@ xp_size_t xp_awk_tab_insdatum (
value_dup = xp_strdup(value); value_dup = xp_strdup(value);
if (value_dup == XP_NULL) return (xp_size_t)-1; if (value_dup == XP_NULL) return (xp_size_t)-1;
if (index >= tab->capa) { if (index >= tab->capa)
{
xp_size_t capa; xp_size_t capa;
if (tab->capa <= 0) capa = (index + 1); if (tab->capa <= 0) capa = (index + 1);
else { else
{
do { capa = tab->capa * 2; } while (index >= capa); 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); xp_free (value_dup);
return (xp_size_t)-1; return (xp_size_t)-1;
} }
@ -120,7 +129,7 @@ xp_size_t xp_awk_tab_insdatum (
return index; 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_awk_tab_t* tab, xp_size_t index, xp_size_t count)
{ {
xp_size_t i, j, k; xp_size_t i, j, k;
@ -132,20 +141,29 @@ xp_size_t xp_awk_tab_remrange (
j = index + count; j = index + count;
k = index + count; k = index + count;
while (i < k) { while (i < k)
{
xp_free (tab->buf[i]); xp_free (tab->buf[i]);
if (j >= tab->size) 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; tab->size -= count;
return 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);
} }

View File

@ -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_ #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); 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_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_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_size_t xp_awk_tab_find (
xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index); xp_awk_tab_t* tab, const xp_char_t* value, xp_size_t index);
xp_size_t xp_awk_tab_rfind ( xp_size_t xp_awk_tab_rfind (

View File

@ -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 <xp/awk/awk.h> #include <xp/awk/awk.h>
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_t* xp_awk_makeintval (xp_long_t v)
{ {
xp_awk_val_int_t* val; 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) void xp_awk_printval (xp_awk_val_t* val)
{ {
// TODO: better value printing...................... // TODO: better value printing......................
switch (val->type) switch (val->type)
{ {
case XP_AWK_VAL_NIL:
xp_printf (XP_TEXT("nil"));
break;
case XP_AWK_VAL_INT: case XP_AWK_VAL_INT:
xp_printf (XP_TEXT("%lld"), xp_printf (XP_TEXT("%lld"),
(long long)((xp_awk_val_int_t*)val)->val); (long long)((xp_awk_val_int_t*)val)->val);

View File

@ -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_ #ifndef _XP_AWK_VAL_H_
@ -11,12 +11,14 @@
enum enum
{ {
XP_AWK_VAL_NIL,
XP_AWK_VAL_INT, XP_AWK_VAL_INT,
XP_AWK_VAL_REAL, XP_AWK_VAL_REAL,
XP_AWK_VAL_STR XP_AWK_VAL_STR
}; };
typedef struct xp_awk_val_t xp_awk_val_t; 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_int_t xp_awk_val_int_t;
typedef struct xp_awk_val_real_t xp_awk_val_real_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; 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_HDR;
}; };
/* XP_AWK_VAL_NIL */
struct xp_awk_val_nil_t
{
XP_AWK_VAL_HDR;
};
/* XP_AWK_VAL_INT */ /* XP_AWK_VAL_INT */
struct xp_awk_val_int_t struct xp_awk_val_int_t
{ {
@ -55,10 +63,13 @@ struct xp_awk_val_str_t
extern "C" { extern "C" {
#endif #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_makeintval (xp_long_t v);
xp_awk_val_t* xp_awk_makestrval (const xp_char_t* str, xp_size_t len); 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); 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); void xp_awk_printval (xp_awk_val_t* val);
#ifdef __cplusplus #ifdef __cplusplus