From dd49dc9e1f1c62fb585ea9ceac9f2f4c57fbf7b0 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sun, 16 Apr 2006 04:31:38 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.c | 4 +- ase/awk/awk.dsp | 4 +- ase/awk/awk.h | 5 +- ase/awk/awk_i.h | 4 +- ase/awk/build.com | 2 +- ase/awk/makefile.bcc | 2 +- ase/awk/makefile.cl | 2 +- ase/awk/makefile.lcc | 2 +- ase/awk/makefile.sco | 2 +- ase/awk/map.c | 4 +- ase/awk/map.h | 4 +- ase/awk/misc.c | 8 +- ase/awk/parse.c | 44 ++++- ase/awk/run.c | 367 ++++++++++++++++++++++++++++++-------- ase/awk/sa.c | 4 +- ase/awk/sa.h | 4 +- ase/awk/tab.c | 4 +- ase/awk/tab.h | 4 +- ase/awk/tree.c | 8 +- ase/awk/val.c | 9 +- ase/test/awk/awk.c | 15 +- ase/test/awk/makefile.bcc | 2 +- ase/test/awk/makefile.cl | 2 +- ase/test/awk/makefile.sco | 2 +- 24 files changed, 390 insertions(+), 118 deletions(-) diff --git a/ase/awk/awk.c b/ase/awk/awk.c index 484b8e1a..6ef11736 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,10 +1,10 @@ /* - * $Id: awk.c,v 1.40 2006-04-14 10:56:42 bacon Exp $ + * $Id: awk.c,v 1.41 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #endif diff --git a/ase/awk/awk.dsp b/ase/awk/awk.dsp index c8c666c3..d8d15d67 100644 --- a/ase/awk/awk.dsp +++ b/ase/awk/awk.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "AWK_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "__STAND_ALONE" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 @@ -71,7 +71,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "AWK_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "__STAND_ALONE" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "XP_AWK_STAND_ALONE" /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 diff --git a/ase/awk/awk.h b/ase/awk/awk.h index f8c77000..d23efb11 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.48 2006-04-14 10:56:42 bacon Exp $ + * $Id: awk.h,v 1.49 2006-04-16 04:31:38 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -106,7 +106,8 @@ int xp_awk_parse (xp_awk_t* awk); int xp_awk_run (xp_awk_t* awk); /* utility functions exported by awk.h */ -xp_long_t xp_awk_strtolong (const xp_char_t* str, int base); +xp_long_t xp_awk_strtolong ( + const xp_char_t* str, int base, const xp_char_t** endptr); xp_real_t xp_awk_strtoreal (const xp_char_t* str); #ifdef __cplusplus diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index bbe6b4e1..652d0c36 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.3 2006-04-14 10:56:42 bacon Exp $ + * $Id: awk_i.h,v 1.4 2006-04-16 04:31:38 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -12,7 +12,7 @@ #include #include -#ifdef __STAND_ALONE +#ifdef XP_AWK_STAND_ALONE #include #else #include diff --git a/ase/awk/build.com b/ase/awk/build.com index fe2899ea..c6bb08bd 100644 --- a/ase/awk/build.com +++ b/ase/awk/build.com @@ -17,7 +17,7 @@ $ goto compile_loop $ $ compile_file: $ write sys$output "Compiling ''name'.c..." -$ cc/define=__STAND_ALONE 'name' +$ cc/define=XP_AWK_STAND_ALONE 'name' $ return $ $ archive: diff --git a/ase/awk/makefile.bcc b/ase/awk/makefile.bcc index 32edb9bc..1a86882d 100644 --- a/ase/awk/makefile.bcc +++ b/ase/awk/makefile.bcc @@ -3,7 +3,7 @@ OBJS = $(SRCS:.c=.obj) OUT = xpawk.lib CC = bcc32 -CFLAGS = -O2 -WM -w -w-inl -w-sig -w-spa -w-hid -RT- -I../.. -D__STAND_ALONE +CFLAGS = -O2 -WM -w -w-inl -w-sig -w-spa -w-hid -RT- -I../.. -DXP_AWK_STAND_ALONE all: $(OBJS) tlib $(OUT) @&&! diff --git a/ase/awk/makefile.cl b/ase/awk/makefile.cl index 5903f05f..9620a6c7 100644 --- a/ase/awk/makefile.cl +++ b/ase/awk/makefile.cl @@ -4,7 +4,7 @@ OUT = xpawk CC = cl #CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -CFLAGS = /nologo /O2 /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -D__STAND_ALONE -DXP_CHAR_IS_WCHAR +CFLAGS = /nologo /O2 /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I../.. -DXP_AWK_STAND_ALONE -DXP_CHAR_IS_WCHAR all: lib diff --git a/ase/awk/makefile.lcc b/ase/awk/makefile.lcc index 13dcc5c8..99c5e0f7 100644 --- a/ase/awk/makefile.lcc +++ b/ase/awk/makefile.lcc @@ -3,7 +3,7 @@ OBJS = awk.obj err.obj tree.obj tab.obj map.obj parse.obj run.obj sa.obj val.obj OUT = xpawk.lib CC = lcc -CFLAGS = -I../.. -A -ansic -libcdll -D__STAND_ALONE +CFLAGS = -I../.. -A -ansic -libcdll -DXP_AWK_STAND_ALONE LDFLAGS = LIBS = diff --git a/ase/awk/makefile.sco b/ase/awk/makefile.sco index 16a83d6d..6633e111 100644 --- a/ase/awk/makefile.sco +++ b/ase/awk/makefile.sco @@ -3,7 +3,7 @@ OBJS = $(SRCS:.c=.o) OUT = libxpawk.a CC = cc -CFLAGS = -Xc -a ansi -w3 -O2 -I../.. -D__STAND_ALONE +CFLAGS = -Xc -a ansi -w3 -O2 -I../.. -DXP_AWK_STAND_ALONE all: $(OBJS) ar cr $(OUT) $(OBJS) diff --git a/ase/awk/map.c b/ase/awk/map.c index 51cfdb94..5b4bc0c2 100644 --- a/ase/awk/map.c +++ b/ase/awk/map.c @@ -1,10 +1,10 @@ /* - * $Id: map.c,v 1.10 2006-04-14 10:56:42 bacon Exp $ + * $Id: map.c,v 1.11 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include diff --git a/ase/awk/map.h b/ase/awk/map.h index 6127a909..adf2a8a9 100644 --- a/ase/awk/map.h +++ b/ase/awk/map.h @@ -1,5 +1,5 @@ /* - * $Id: map.h,v 1.6 2006-03-27 14:14:00 bacon Exp $ + * $Id: map.h,v 1.7 2006-04-16 04:31:38 bacon Exp $ */ #ifndef _XP_AWK_MAP_H_ @@ -9,7 +9,7 @@ #error Never include this file directly. Include instead #endif -#ifdef __STAND_ALONE +#ifdef XP_AWK_STAND_ALONE #include #else #include diff --git a/ase/awk/misc.c b/ase/awk/misc.c index 6c15c7a2..014c3581 100644 --- a/ase/awk/misc.c +++ b/ase/awk/misc.c @@ -1,15 +1,16 @@ /* - * $Id: misc.c,v 1.4 2006-04-10 14:53:48 bacon Exp $ + * $Id: misc.c,v 1.5 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #endif -xp_long_t xp_awk_strtolong (const xp_char_t* str, int base) +xp_long_t xp_awk_strtolong ( + const xp_char_t* str, int base, const xp_char_t** endptr) { xp_long_t n = 0; const xp_char_t* p; @@ -74,6 +75,7 @@ xp_long_t xp_awk_strtolong (const xp_char_t* str, int base) p++; } + if (endptr != XP_NULL) *endptr = p; return (negative)? -n: n; } diff --git a/ase/awk/parse.c b/ase/awk/parse.c index f2d0ab2c..49a836ab 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,10 +1,10 @@ /* - * $Id: parse.c,v 1.81 2006-04-14 16:26:00 bacon Exp $ + * $Id: parse.c,v 1.82 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include @@ -58,6 +58,7 @@ enum TOKEN_DOLLAR, TOKEN_COMMA, + TOKEN_PERIOD, TOKEN_SEMICOLON, TOKEN_COLON, TOKEN_QUEST, @@ -196,6 +197,34 @@ static struct __kwent __kwtab[] = { XP_NULL, 0, 0 } }; +/* TODO: +static struct __kwent __bvtab[] = +{ + { XP_TEXT("ARGC"), TOKEN_ARGC, 0 }, + { XP_TEXT("ARGIND"), TOKEN_ARGIND, 0 }, + { XP_TEXT("ARGV"), TOKEN_ARGV, 0 }, + { XP_TEXT("CONVFMT"), TOKEN_CONVFMT, 0 }, + { XP_TEXT("FIELDWIDTHS"), TOKEN_FIELDWIDTHS, 0 }, + { XP_TEXT("ENVIRON"), TOKEN_ENVIRON, 0 }, + { XP_TEXT("ERRNO"), TOKEN_ERRNO, 0 }, + { XP_TEXT("FILENAME"), TOKEN_FILENAME, 0 }, + { XP_TEXT("FNR"), TOKEN_FNR, 0 }, + { XP_TEXT("FS"), TOKEN_FS, 0 }, + { XP_TEXT("IGNORECASE"), TOKEN_IGNORECASE, 0 }, + { XP_TEXT("NF"), TOKEN_NF, 0 }, + { XP_TEXT("NR"), TOKEN_NR, 0 }, + { XP_TEXT("OFMT"), TOKEN_OFMT, 0 }, + { XP_TEXT("OFS"), TOKEN_OFS, 0 }, + { XP_TEXT("ORS"), TOKEN_ORS, 0 }, + { XP_TEXT("RS"), TOKEN_RS, 0 }, + { XP_TEXT("RT"), TOKEN_RT, 0 }, + { XP_TEXT("RSTART"), TOKEN_RSTART, 0 }, + { XP_TEXT("RLENGTH"), TOKEN_RLENGTH, 0 }, + { XP_TEXT("SUBSEP"), TOKEN_SUBSEP, 0 }, + { XP_NULL, 0, 0 } +}; +*/ + #define GET_CHAR(awk) \ do { if (__get_char(awk) == -1) return -1; } while(0) @@ -233,7 +262,7 @@ do { \ do { (awk)->errnum = (code); return XP_NULL; } while (0) /* TODO: remove stdio.h */ -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #endif static int __dump_func (xp_awk_pair_t* pair) @@ -1557,7 +1586,8 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) nde->type = XP_AWK_NDE_INT; nde->next = XP_NULL; - nde->val = xp_awk_strtolong (XP_STR_BUF(&awk->token.name), 0); + nde->val = xp_awk_strtolong ( + XP_STR_BUF(&awk->token.name), 0, XP_NULL); xp_assert ( XP_STR_LEN(&awk->token.name) == @@ -2572,6 +2602,12 @@ static int __get_token (xp_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR_TO (awk, c); } + else if (c == XP_CHAR('.')) + { + SET_TOKEN_TYPE (awk, TOKEN_PERIOD); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } else if (c == XP_CHAR(';')) { SET_TOKEN_TYPE (awk, TOKEN_SEMICOLON); diff --git a/ase/awk/run.c b/ase/awk/run.c index e28deef9..c8e6e7ff 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.49 2006-04-14 16:26:00 bacon Exp $ + * $Id: run.c,v 1.50 2006-04-16 04:31:38 bacon Exp $ */ #include @@ -7,7 +7,7 @@ /* TODO: remove this dependency...*/ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include @@ -115,6 +115,10 @@ static int __raw_push (xp_awk_t* awk, void* val); static void __raw_pop (xp_awk_t* awk); static void __raw_pop_times (xp_awk_t* awk, xp_size_t times); +static xp_awk_val_t* __str_to_num ( + xp_awk_t* awk, xp_awk_val_str_t* str, + void (*helper) (void*,void*), void* user_data); + typedef xp_awk_val_t* (*binop_func_t) ( xp_awk_t* awk, xp_awk_val_t* left, xp_awk_val_t* right); typedef xp_awk_val_t* (*eval_expr_t) (xp_awk_t* awk, xp_awk_nde_t* nde); @@ -672,7 +676,7 @@ 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_t* nde) { - xp_awk_val_t* val; + xp_awk_val_t* val, * res; xp_awk_nde_ass_t* ass = (xp_awk_nde_ass_t*)nde; xp_assert (ass->left != XP_NULL && ass->right != XP_NULL); @@ -680,8 +684,67 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_t* nde) val = __eval_expression(awk, ass->right); if (val == XP_NULL) return XP_NULL; -/*TODO: ass->opcode....*/ - return __do_assignment (awk, (xp_awk_nde_var_t*)ass->left, val); + xp_awk_refupval (val); + + if (ass->opcode != XP_AWK_ASSOP_NONE) + { + xp_awk_val_t* val2, * tmp; + + val2 = __eval_expression (awk, ass->left); + if (val2 == XP_NULL) + { + xp_awk_refdownval (awk, val); + return XP_NULL; + } + + xp_awk_refupval (val2); + + if (ass->opcode == XP_AWK_ASSOP_PLUS) + { + tmp = __eval_binop_plus (awk, val2, val); + } + else if (ass->opcode == XP_AWK_ASSOP_MINUS) + { + tmp = __eval_binop_minus (awk, val2, val); + } + else if (ass->opcode == XP_AWK_ASSOP_MUL) + { + tmp = __eval_binop_mul (awk, val2, val); + } + else if (ass->opcode == XP_AWK_ASSOP_DIV) + { + tmp = __eval_binop_div (awk, val2, val); + } + else if (ass->opcode == XP_AWK_ASSOP_MOD) + { + tmp = __eval_binop_mod (awk, val2, val); + } + else if (ass->opcode == XP_AWK_ASSOP_EXP) + { + tmp = __eval_binop_exp (awk, val2, val); + } + else + { + xp_assert (!"should never happen - invalid assignment opcode"); + PANIC (awk, XP_AWK_EINTERNAL); + } + + if (tmp == XP_NULL) + { + xp_awk_refdownval (awk, val); + xp_awk_refdownval (awk, val2); + return XP_NULL; + } + + xp_awk_refdownval (awk, val); + val = tmp; + xp_awk_refupval (val); + } + + res = __do_assignment (awk, (xp_awk_nde_var_t*)ass->left, val); + xp_awk_refdownval (awk, val); + + return res; } static xp_awk_val_t* __do_assignment ( @@ -692,7 +755,7 @@ static xp_awk_val_t* __do_assignment ( xp_awk_pair_t* pair; xp_char_t* name; - pair = xp_awk_map_get(&awk->run.named, var->id.name); + pair = xp_awk_map_get (&awk->run.named, var->id.name); if (pair == XP_NULL) { name = xp_strdup (var->id.name); @@ -1264,52 +1327,111 @@ static xp_awk_val_t* __eval_binop_plus ( { xp_awk_val_t* res = XP_NULL; - if (left->type == XP_AWK_VAL_INT && - right->type == XP_AWK_VAL_INT) +/* TODO: improve this ............ */ + if (left->type == XP_AWK_VAL_NIL) { - xp_long_t r = - ((xp_awk_val_int_t*)left)->val + - ((xp_awk_val_int_t*)right)->val; - res = xp_awk_makeintval (awk, r); + if (right->type == XP_AWK_VAL_NIL) + { + res = xp_awk_val_nil; + } + else if (right->type == XP_AWK_VAL_INT) + { + res = xp_awk_makeintval ( + awk, ((xp_awk_val_int_t*)right)->val); + } + else if (right->type == XP_AWK_VAL_REAL) + { + res = xp_awk_makerealval ( + awk, ((xp_awk_val_real_t*)right)->val); + } + else if (right->type == XP_AWK_VAL_STR) + { + res = __str_to_num ( + awk, (xp_awk_val_str_t*)right, __helper, NULL); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_REAL && - right->type == XP_AWK_VAL_REAL) + else if (left->type == XP_AWK_VAL_INT) { - xp_real_t r = - ((xp_awk_val_real_t*)left)->val + - ((xp_awk_val_real_t*)right)->val; - res = xp_awk_makerealval (awk, r); + if (right->type == XP_AWK_VAL_INT) + { + xp_long_t r = + ((xp_awk_val_int_t*)left)->val + + ((xp_awk_val_int_t*)right)->val; + res = xp_awk_makeintval (awk, r); + } + else if (right->type == XP_AWK_VAL_REAL) + { + xp_real_t r = + ((xp_awk_val_int_t*)left)->val + + ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_STR) + { + xp_long_t r = + ((xp_awk_val_int_t*)left)->val + + xp_awk_strtolong(((xp_awk_val_str_t*)right)->buf,0,XP_NULL); + /* don't care about ((xp_awk_val_str_t*)right)->len */ + res = xp_awk_makeintval (awk, r); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_INT && - right->type == XP_AWK_VAL_REAL) + else if (left->type == XP_AWK_VAL_REAL) { - xp_real_t r = - ((xp_awk_val_int_t*)left)->val + - ((xp_awk_val_real_t*)right)->val; - res = xp_awk_makerealval (awk, r); + if (right->type == XP_AWK_VAL_INT) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val + + ((xp_awk_val_int_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_REAL) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val + + ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_STR) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val + + xp_awk_strtoreal(((xp_awk_val_str_t*)right)->buf); + /* don't care about ((xp_awk_val_str_t*)right)->len */ + res = xp_awk_makerealval (awk, r); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_REAL && - right->type == XP_AWK_VAL_INT) + else if (left->type == XP_AWK_VAL_STR) { - xp_real_t r = - ((xp_awk_val_real_t*)left)->val + - ((xp_awk_val_int_t*)right)->val; - res = xp_awk_makerealval (awk, r); - } - else if (left->type == XP_AWK_VAL_STR && - right->type == XP_AWK_VAL_STR) - { - res = xp_awk_makestrval2 ( - ((xp_awk_val_str_t*)left)->buf, - ((xp_awk_val_str_t*)left)->len, - ((xp_awk_val_str_t*)right)->buf, - ((xp_awk_val_str_t*)right)->len); + + if (right->type == XP_AWK_VAL_STR) + { + res = xp_awk_makestrval2 ( + ((xp_awk_val_str_t*)left)->buf, + ((xp_awk_val_str_t*)left)->len, + ((xp_awk_val_str_t*)right)->buf, + ((xp_awk_val_str_t*)right)->len); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } else { PANIC (awk, XP_AWK_EOPERAND); } - /* TODO: addition between integer and astring??? 1 + "123" */ if (res == XP_NULL) PANIC (awk, XP_AWK_ENOMEM); return res; @@ -1320,37 +1442,104 @@ static xp_awk_val_t* __eval_binop_minus ( { xp_awk_val_t* res = XP_NULL; - if (left->type == XP_AWK_VAL_INT && - right->type == XP_AWK_VAL_INT) + if (left->type == XP_AWK_VAL_NIL) { - xp_long_t r = - ((xp_awk_val_int_t*)left)->val - - ((xp_awk_val_int_t*)right)->val; - res = xp_awk_makeintval (awk, r); + if (right->type == XP_AWK_VAL_NIL) + { + res = xp_awk_val_nil; + } + else if (right->type == XP_AWK_VAL_INT) + { + res = xp_awk_makeintval ( + awk, -((xp_awk_val_int_t*)right)->val); + } + else if (right->type == XP_AWK_VAL_REAL) + { + res = xp_awk_makerealval ( + awk, -((xp_awk_val_real_t*)right)->val); + } + else if (right->type == XP_AWK_VAL_STR) + { + res = __str_to_num ( + awk, (xp_awk_val_str_t*)right, __helper, NULL); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_REAL && - right->type == XP_AWK_VAL_REAL) + else if (left->type == XP_AWK_VAL_INT) { - xp_real_t r = - ((xp_awk_val_real_t*)left)->val - - ((xp_awk_val_real_t*)right)->val; - res = xp_awk_makerealval (awk, r); + if (right->type == XP_AWK_VAL_INT) + { + xp_long_t r = + ((xp_awk_val_int_t*)left)->val - + ((xp_awk_val_int_t*)right)->val; + res = xp_awk_makeintval (awk, r); + } + else if (right->type == XP_AWK_VAL_REAL) + { + xp_real_t r = + ((xp_awk_val_int_t*)left)->val - + ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_STR) + { + xp_long_t r = + ((xp_awk_val_int_t*)left)->val - + xp_awk_strtolong(((xp_awk_val_str_t*)right)->buf,0,XP_NULL); + res = xp_awk_makeintval (awk, r); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_INT && - right->type == XP_AWK_VAL_REAL) + else if (left->type == XP_AWK_VAL_REAL) { - xp_real_t r = - ((xp_awk_val_int_t*)left)->val - - ((xp_awk_val_real_t*)right)->val; - res = xp_awk_makerealval (awk, r); + if (right->type == XP_AWK_VAL_INT) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val - + ((xp_awk_val_int_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_REAL) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val - + ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, r); + } + else if (right->type == XP_AWK_VAL_STR) + { + xp_real_t r = + ((xp_awk_val_real_t*)left)->val - + xp_awk_strtoreal(((xp_awk_val_str_t*)right)->buf); + /* don't care about ((xp_awk_val_str_t*)right)->len */ + res = xp_awk_makerealval (awk, r); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } - else if (left->type == XP_AWK_VAL_REAL && - right->type == XP_AWK_VAL_INT) + else if (left->type == XP_AWK_VAL_STR) { - xp_real_t r = - ((xp_awk_val_real_t*)left)->val - - ((xp_awk_val_int_t*)right)->val; - res = xp_awk_makerealval (awk, r); + + if (right->type == XP_AWK_VAL_STR) + { + res = xp_awk_makestrval2 ( + ((xp_awk_val_str_t*)left)->buf, + ((xp_awk_val_str_t*)left)->len, + ((xp_awk_val_str_t*)right)->buf, + ((xp_awk_val_str_t*)right)->len); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } } else { @@ -1506,24 +1695,24 @@ static xp_awk_val_t* __eval_binop_exp ( right->type == XP_AWK_VAL_REAL) { /* TODO: write own pow... */ - double x = ((xp_awk_val_int_t*)left)->val; - double y = ((xp_awk_val_real_t*)right)->val; + xp_real_t x = ((xp_awk_val_int_t*)left)->val; + xp_real_t y = ((xp_awk_val_real_t*)right)->val; res = xp_awk_makerealval (awk, pow (x, y)); } else if (left->type == XP_AWK_VAL_REAL && right->type == XP_AWK_VAL_INT) { /* TODO: write own pow... */ - double x = ((xp_awk_val_real_t*)left)->val; - double y = ((xp_awk_val_int_t*)right)->val; + xp_real_t x = ((xp_awk_val_real_t*)left)->val; + xp_real_t y = ((xp_awk_val_int_t*)right)->val; res = xp_awk_makerealval (awk, pow (x, y)); } else if (left->type == XP_AWK_VAL_REAL && right->type == XP_AWK_VAL_REAL) { /* TODO: wirte own pow... */ - double x = ((xp_awk_val_real_t*)left)->val; - double y = ((xp_awk_val_real_t*)right)->val; + xp_real_t x = ((xp_awk_val_real_t*)left)->val; + xp_real_t y = ((xp_awk_val_real_t*)right)->val; res = xp_awk_makerealval (awk, pow (x, y)); } else @@ -1717,8 +1906,7 @@ static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_t* nde) PANIC (awk, XP_AWK_EINTERNAL); } - if (__do_assignment (awk, - (xp_awk_nde_var_t*)exp->left, res) == XP_NULL) + if (__do_assignment(awk, (xp_awk_nde_var_t*)exp->left, res) == XP_NULL) { xp_awk_refdownval (awk, left); return XP_NULL; @@ -1831,8 +2019,7 @@ static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_t* nde) PANIC (awk, XP_AWK_EINTERNAL); } - if (__do_assignment (awk, - (xp_awk_nde_var_t*)exp->left, res2) == XP_NULL) + if (__do_assignment(awk, (xp_awk_nde_var_t*)exp->left, res2) == XP_NULL) { xp_awk_refdownval (awk, left); return XP_NULL; @@ -2158,3 +2345,35 @@ static void __raw_pop_times (xp_awk_t* awk, xp_size_t times) __raw_pop (awk); } } + +static xp_awk_val_t* __str_to_num ( + xp_awk_t* awk, xp_awk_val_str_t* str, + void (*helper) (void*,void*), void* user_data) +{ + xp_long_t l; + const xp_char_t* endptr; + xp_awk_val_t* res; + + /* don't care about str->len */ + l = xp_awk_strtolong (str->buf, 0, &endptr); + + if (*endptr == XP_CHAR('.') || + *endptr == XP_CHAR('E') || + *endptr == XP_CHAR('e')) + { + xp_real_t r; + + r = xp_awk_strtoreal ( + ((xp_awk_val_str_t*)str)->buf); + + res = helper (&r, user_data); + //res = xp_awk_makerealval (awk, r * factor); + } + else + { + res = helper (&l, user_data); + //res = xp_awk_makeintval (awk, l * factor); + } + + return res; +} diff --git a/ase/awk/sa.c b/ase/awk/sa.c index 5cd6297d..1ffe4d8c 100644 --- a/ase/awk/sa.c +++ b/ase/awk/sa.c @@ -1,10 +1,10 @@ /* - * $Id: sa.c,v 1.15 2006-04-06 16:25:37 bacon Exp $ + * $Id: sa.c,v 1.16 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifdef __STAND_ALONE +#ifdef XP_AWK_STAND_ALONE static xp_char_t* __adjust_format (const xp_char_t* format); diff --git a/ase/awk/sa.h b/ase/awk/sa.h index 20309493..02d27757 100644 --- a/ase/awk/sa.h +++ b/ase/awk/sa.h @@ -1,5 +1,5 @@ /* - * $Id: sa.h,v 1.21 2006-04-10 14:53:48 bacon Exp $ + * $Id: sa.h,v 1.22 2006-04-16 04:31:38 bacon Exp $ */ #ifndef _XP_AWK_SA_H_ @@ -9,7 +9,7 @@ #error Never include this file directly. Include instead #endif -#ifdef __STAND_ALONE +#ifdef XP_AWK_STAND_ALONE #if !defined(XP_CHAR_IS_MCHAR) && !defined(XP_CHAR_IS_WCHAR) #error Neither XP_CHAR_IS_MCHAR nor XP_CHAR_IS_WCHAR is defined. diff --git a/ase/awk/tab.c b/ase/awk/tab.c index 30d72ece..22d5414b 100644 --- a/ase/awk/tab.c +++ b/ase/awk/tab.c @@ -1,10 +1,10 @@ /* - * $Id: tab.c,v 1.7 2006-03-31 16:35:37 bacon Exp $ + * $Id: tab.c,v 1.8 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include diff --git a/ase/awk/tab.h b/ase/awk/tab.h index 291343c5..b1c44f53 100644 --- a/ase/awk/tab.h +++ b/ase/awk/tab.h @@ -1,5 +1,5 @@ /* - * $Id: tab.h,v 1.6 2006-04-14 10:56:42 bacon Exp $ + * $Id: tab.h,v 1.7 2006-04-16 04:31:38 bacon Exp $ */ #ifndef _XP_AWK_TAB_H_ @@ -9,7 +9,7 @@ #error Never include this file directly. Include instead #endif -#ifdef __STAND_ALONE +#ifdef XP_AWK_STAND_ALONE #include #else #include diff --git a/ase/awk/tree.c b/ase/awk/tree.c index ebf32be0..8d561b85 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,10 +1,10 @@ /* - * $Id: tree.c,v 1.37 2006-04-14 16:26:00 bacon Exp $ + * $Id: tree.c,v 1.38 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include @@ -630,7 +630,9 @@ void xp_awk_clrpt (xp_awk_nde_t* tree) break; default: - xp_assert (XP_TEXT("shoud not happen") == XP_TEXT(" here")); + xp_assert (!"should never happen - invalid node type"); + xp_free (p); + break; } p = next; diff --git a/ase/awk/val.c b/ase/awk/val.c index 8b439831..137e945e 100644 --- a/ase/awk/val.c +++ b/ase/awk/val.c @@ -1,10 +1,10 @@ /* - * $Id: val.c,v 1.18 2006-04-14 10:56:42 bacon Exp $ + * $Id: val.c,v 1.19 2006-04-16 04:31:38 bacon Exp $ */ #include -#ifndef __STAND_ALONE +#ifndef XP_AWK_STAND_ALONE #include #include #include @@ -248,7 +248,7 @@ xp_bool_t xp_awk_boolval (xp_awk_val_t* val) return ((xp_awk_val_str_t*)val)->len > 0; } - xp_assert (!"should never happen"); + xp_assert (!"should never happen - invalid vlaue type"); return xp_false; } @@ -287,6 +287,7 @@ void xp_awk_printval (xp_awk_val_t* val) break; default: - xp_printf (XP_TEXT("**** INTERNAL ERROR - UNKNOWN VALUE TYPE ****\n")); + xp_assert (!"should never happen - invalid value type"); + xp_printf (XP_TEXT("**** INTERNAL ERROR - INVALID VALUE TYPE ****\n")); } } diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index aad8fa9d..21a09a4b 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.22 2006-04-14 16:26:00 bacon Exp $ + * $Id: awk.c,v 1.23 2006-04-16 04:31:38 bacon Exp $ */ #include @@ -7,19 +7,30 @@ #include #include +#ifdef __STAND_ALONE +#define xp_printf xp_awk_printf +extern int xp_awk_printf (const xp_char_t* fmt, ...); +#else #ifdef XP_CHAR_IS_MCHAR #define xp_printf printf #else #define xp_printf wprintf #endif +#endif +#ifdef __STAND_ALONE +#define xp_strcmp xp_awk_strcmp +extern int xp_awk_strcmp (const xp_char_t* s1, const xp_char_t* s2); +#else #ifdef XP_CHAR_IS_MCHAR #define xp_strcmp strcmp #else #define xp_strcmp wcscmp #endif +#endif -static xp_ssize_t process_source (int cmd, void* arg, xp_char_t* data, xp_size_t size) +static xp_ssize_t process_source ( + int cmd, void* arg, xp_char_t* data, xp_size_t size) { xp_char_t c; diff --git a/ase/test/awk/makefile.bcc b/ase/test/awk/makefile.bcc index 82087af3..4f714890 100644 --- a/ase/test/awk/makefile.bcc +++ b/ase/test/awk/makefile.bcc @@ -1,5 +1,5 @@ CC = bcc32 -CFLAGS = -I..\..\.. +CFLAGS = -I..\..\.. -D__STAND_ALONE LDFLAGS = -L..\..\..\xp\bas -L..\..\..\xp\awk LIBS = import32.lib cw32mt.lib xpbas.lib xpawk.lib STARTUP = c0x32w.obj diff --git a/ase/test/awk/makefile.cl b/ase/test/awk/makefile.cl index 69521f34..340160a9 100644 --- a/ase/test/awk/makefile.cl +++ b/ase/test/awk/makefile.cl @@ -1,6 +1,6 @@ CC = cl #CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. -CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. +CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. -D__STAND_ALONE LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk LIBS = xpbas.lib xpawk.lib #LIBS = xpawk.lib diff --git a/ase/test/awk/makefile.sco b/ase/test/awk/makefile.sco index 1f7fdc94..681a0578 100644 --- a/ase/test/awk/makefile.sco +++ b/ase/test/awk/makefile.sco @@ -1,5 +1,5 @@ CC = cc -CFLAGS = -Xc -a ansi -O2 -I../../.. +CFLAGS = -Xc -a ansi -O2 -I../../.. -D__STAND_ALONE LDFLAGS = -L../../bas -L../../awk LIBS = -lxpawk -lm