*** empty log message ***
This commit is contained in:
parent
87c8b40064
commit
b974c49c76
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c,v 1.34 2006-03-27 14:14:00 bacon Exp $
|
* $Id: awk.c,v 1.35 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk.h>
|
#include <xp/awk/awk.h>
|
||||||
@ -90,6 +90,7 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk)
|
|||||||
awk->run.stack_limit = 0;
|
awk->run.stack_limit = 0;
|
||||||
awk->run.exit_level = 0;
|
awk->run.exit_level = 0;
|
||||||
awk->run.icache_count = 0;
|
awk->run.icache_count = 0;
|
||||||
|
awk->run.rcache_count = 0;
|
||||||
|
|
||||||
awk->lex.curc = XP_CHAR_EOF;
|
awk->lex.curc = XP_CHAR_EOF;
|
||||||
awk->lex.ungotc_count = 0;
|
awk->lex.ungotc_count = 0;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h,v 1.37 2006-03-27 11:43:17 bacon Exp $
|
* $Id: awk.h,v 1.38 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWK_H_
|
#ifndef _XP_AWK_AWK_H_
|
||||||
@ -100,7 +100,9 @@ struct xp_awk_t
|
|||||||
int exit_level;
|
int exit_level;
|
||||||
|
|
||||||
xp_awk_val_int_t* icache[100]; // TODO: ...
|
xp_awk_val_int_t* icache[100]; // TODO: ...
|
||||||
|
xp_awk_val_real_t* rcache[100]; // TODO: ...
|
||||||
xp_size_t icache_count;
|
xp_size_t icache_count;
|
||||||
|
xp_size_t rcache_count;
|
||||||
} run;
|
} run;
|
||||||
|
|
||||||
/* source buffer management */
|
/* source buffer management */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.25 2006-03-28 11:32:58 bacon Exp $
|
* $Id: run.c,v 1.26 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk.h>
|
#include <xp/awk/awk.h>
|
||||||
@ -12,12 +12,14 @@
|
|||||||
|
|
||||||
#define STACK_INCREMENT 512
|
#define STACK_INCREMENT 512
|
||||||
|
|
||||||
#define STACK_AT(awk,n) ((awk)->run.stack[(awk)->run.stack_base+n])
|
#define STACK_AT(awk,n) ((awk)->run.stack[(awk)->run.stack_base+(n)])
|
||||||
#define STACK_NARGS(awk) ((xp_size_t)STACK_AT(awk,3))
|
#define STACK_NARGS(awk) ((xp_size_t)STACK_AT(awk,3))
|
||||||
#define STACK_ARG(awk,n) STACK_AT(awk,3+1+(n))
|
#define STACK_ARG(awk,n) STACK_AT(awk,3+1+(n))
|
||||||
#define STACK_LOCAL(awk,n) STACK_AT(awk,3+STACK_NARGS(awk)+1+(n))
|
#define STACK_LOCAL(awk,n) STACK_AT(awk,3+STACK_NARGS(awk)+1+(n))
|
||||||
#define STACK_RETVAL(awk) STACK_AT(awk,2)
|
#define STACK_RETVAL(awk) STACK_AT(awk,2)
|
||||||
|
|
||||||
|
#define STACK_GLOBAL(awk,n) ((awk)->run.stack[n])
|
||||||
|
|
||||||
#define EXIT_NONE 0
|
#define EXIT_NONE 0
|
||||||
#define EXIT_BREAK 1
|
#define EXIT_BREAK 1
|
||||||
#define EXIT_CONTINUE 2
|
#define EXIT_CONTINUE 2
|
||||||
@ -57,7 +59,9 @@ int xp_awk_run (xp_awk_t* awk)
|
|||||||
// TODO: clear run stack/exit_level
|
// TODO: clear run stack/exit_level
|
||||||
awk->run.exit_level = EXIT_NONE;
|
awk->run.exit_level = EXIT_NONE;
|
||||||
|
|
||||||
|
xp_assert (awk->run.stack_base == 0 && awk->run.stack_top == 0);
|
||||||
|
|
||||||
|
/* secure space for global variables */
|
||||||
nglobals = awk->tree.nglobals;
|
nglobals = awk->tree.nglobals;
|
||||||
while (nglobals > 0)
|
while (nglobals > 0)
|
||||||
{
|
{
|
||||||
@ -443,11 +447,9 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
|
|||||||
val = xp_awk_makeintval(awk,((xp_awk_nde_int_t*)nde)->val);
|
val = xp_awk_makeintval(awk,((xp_awk_nde_int_t*)nde)->val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* TODO:
|
|
||||||
case XP_AWK_NDE_REAL:
|
case XP_AWK_NDE_REAL:
|
||||||
val = xp_awk_makerealval(((xp_awk_nde_real_t*)nde)->val);
|
val = xp_awk_makerealval(awk,((xp_awk_nde_real_t*)nde)->val);
|
||||||
break;
|
break;
|
||||||
*/
|
|
||||||
|
|
||||||
case XP_AWK_NDE_NAMED:
|
case XP_AWK_NDE_NAMED:
|
||||||
{
|
{
|
||||||
@ -461,8 +463,8 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
|
|||||||
|
|
||||||
case XP_AWK_NDE_GLOBAL:
|
case XP_AWK_NDE_GLOBAL:
|
||||||
{
|
{
|
||||||
//xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
|
xp_awk_nde_var_t* tgt = (xp_awk_nde_var_t*)nde;
|
||||||
//val = STACK_GLOBAL(awk,tgt->id.idxa);
|
val = STACK_GLOBAL(awk,tgt->id.idxa);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -552,11 +554,9 @@ static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde)
|
|||||||
}
|
}
|
||||||
else if (tgt->type == XP_AWK_NDE_GLOBAL)
|
else if (tgt->type == XP_AWK_NDE_GLOBAL)
|
||||||
{
|
{
|
||||||
/*
|
xp_awk_refdownval (awk, STACK_GLOBAL(awk,tgt->id.idxa));
|
||||||
xp_awk_refdownval(STACK_GLOBAL(awk,tgt->id.idxa));
|
|
||||||
STACK_GLOBAL(awk,tgt->id.idxa) = val;
|
STACK_GLOBAL(awk,tgt->id.idxa) = val;
|
||||||
xp_awk_refupval (val);
|
xp_awk_refupval (val);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
else if (tgt->type == XP_AWK_NDE_LOCAL)
|
else if (tgt->type == XP_AWK_NDE_LOCAL)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.c,v 1.26 2006-03-23 15:36:20 bacon Exp $
|
* $Id: tree.c,v 1.27 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk.h>
|
#include <xp/awk/awk.h>
|
||||||
@ -77,6 +77,10 @@ static int __print_expression (xp_awk_nde_t* nde)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case XP_AWK_NDE_REAL:
|
||||||
|
xp_printf (XP_TEXT("%lf"), (long double)((xp_awk_nde_real_t*)nde)->val);
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_AWK_NDE_STR:
|
case XP_AWK_NDE_STR:
|
||||||
// TODO: buf, len
|
// TODO: buf, len
|
||||||
xp_printf (XP_TEXT("\"%s\""), ((xp_awk_nde_str_t*)nde)->buf);
|
xp_printf (XP_TEXT("\"%s\""), ((xp_awk_nde_str_t*)nde)->buf);
|
||||||
@ -490,6 +494,10 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
|
|||||||
xp_free (p);
|
xp_free (p);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case XP_AWK_NDE_REAL:
|
||||||
|
xp_free (p);
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_AWK_NDE_STR:
|
case XP_AWK_NDE_STR:
|
||||||
xp_free (((xp_awk_nde_str_t*)p)->buf);
|
xp_free (((xp_awk_nde_str_t*)p)->buf);
|
||||||
xp_free (p);
|
xp_free (p);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.h,v 1.27 2006-03-07 16:02:18 bacon Exp $
|
* $Id: tree.h,v 1.28 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_TREE_H_
|
#ifndef _XP_AWK_TREE_H_
|
||||||
@ -20,7 +20,7 @@ enum
|
|||||||
XP_AWK_NDE_EXP_UNR,
|
XP_AWK_NDE_EXP_UNR,
|
||||||
|
|
||||||
XP_AWK_NDE_INT,
|
XP_AWK_NDE_INT,
|
||||||
/*TODO: XP_AWK_NDE_REAL,*/
|
XP_AWK_NDE_REAL,
|
||||||
XP_AWK_NDE_STR,
|
XP_AWK_NDE_STR,
|
||||||
XP_AWK_NDE_NAMED,
|
XP_AWK_NDE_NAMED,
|
||||||
XP_AWK_NDE_NAMEDIDX,
|
XP_AWK_NDE_NAMEDIDX,
|
||||||
@ -55,6 +55,7 @@ typedef struct xp_awk_nde_ass_t xp_awk_nde_ass_t;
|
|||||||
typedef struct xp_awk_nde_exp_t xp_awk_nde_exp_t;
|
typedef struct xp_awk_nde_exp_t xp_awk_nde_exp_t;
|
||||||
typedef struct xp_awk_nde_pos_t xp_awk_nde_pos_t;
|
typedef struct xp_awk_nde_pos_t xp_awk_nde_pos_t;
|
||||||
typedef struct xp_awk_nde_int_t xp_awk_nde_int_t;
|
typedef struct xp_awk_nde_int_t xp_awk_nde_int_t;
|
||||||
|
typedef struct xp_awk_nde_real_t xp_awk_nde_real_t;
|
||||||
typedef struct xp_awk_nde_str_t xp_awk_nde_str_t;
|
typedef struct xp_awk_nde_str_t xp_awk_nde_str_t;
|
||||||
typedef struct xp_awk_nde_var_t xp_awk_nde_var_t;
|
typedef struct xp_awk_nde_var_t xp_awk_nde_var_t;
|
||||||
typedef struct xp_awk_nde_idx_t xp_awk_nde_idx_t;
|
typedef struct xp_awk_nde_idx_t xp_awk_nde_idx_t;
|
||||||
@ -123,6 +124,13 @@ struct xp_awk_nde_int_t
|
|||||||
xp_long_t val;
|
xp_long_t val;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* XP_AWK_NDE_REAL */
|
||||||
|
struct xp_awk_nde_real_t
|
||||||
|
{
|
||||||
|
XP_AWK_NDE_HDR;
|
||||||
|
xp_real_t val;
|
||||||
|
};
|
||||||
|
|
||||||
/* XP_AWK_NDE_STR */
|
/* XP_AWK_NDE_STR */
|
||||||
struct xp_awk_nde_str_t
|
struct xp_awk_nde_str_t
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: val.c,v 1.12 2006-03-27 14:14:00 bacon Exp $
|
* $Id: val.c,v 1.13 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk.h>
|
#include <xp/awk/awk.h>
|
||||||
@ -44,7 +44,8 @@ xp_awk_val_t* xp_awk_makeintval (xp_awk_t* awk, xp_long_t v)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
val = (xp_awk_val_int_t*)xp_malloc(xp_sizeof(xp_awk_val_int_t));
|
val = (xp_awk_val_int_t*)
|
||||||
|
xp_malloc(xp_sizeof(xp_awk_val_int_t));
|
||||||
if (val == XP_NULL) return XP_NULL;
|
if (val == XP_NULL) return XP_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,12 +56,20 @@ xp_awk_val_t* xp_awk_makeintval (xp_awk_t* awk, xp_long_t v)
|
|||||||
return (xp_awk_val_t*)val;
|
return (xp_awk_val_t*)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_awk_val_t* xp_awk_makerealval (xp_real_t v)
|
xp_awk_val_t* xp_awk_makerealval (xp_awk_t* awk, xp_real_t v)
|
||||||
{
|
{
|
||||||
xp_awk_val_real_t* val;
|
xp_awk_val_real_t* val;
|
||||||
|
|
||||||
val = (xp_awk_val_real_t*)xp_malloc(xp_sizeof(xp_awk_val_real_t));
|
if (awk->run.rcache_count > 0)
|
||||||
|
{
|
||||||
|
val = awk->run.rcache[--awk->run.rcache_count];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val = (xp_awk_val_real_t*)
|
||||||
|
xp_malloc (xp_sizeof(xp_awk_val_real_t));
|
||||||
if (val == XP_NULL) return XP_NULL;
|
if (val == XP_NULL) return XP_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
val->type = XP_AWK_VAL_REAL;
|
val->type = XP_AWK_VAL_REAL;
|
||||||
val->ref = 0;
|
val->ref = 0;
|
||||||
@ -118,7 +127,15 @@ void xp_awk_freeval (xp_awk_t* awk, xp_awk_val_t* val)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case XP_AWK_VAL_REAL:
|
case XP_AWK_VAL_REAL:
|
||||||
|
if (awk->run.rcache_count < xp_countof(awk->run.rcache))
|
||||||
|
{
|
||||||
|
awk->run.rcache[awk->run.rcache_count++] =
|
||||||
|
(xp_awk_val_real_t*)val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
xp_free (val);
|
xp_free (val);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XP_AWK_VAL_STR:
|
case XP_AWK_VAL_STR:
|
||||||
@ -184,7 +201,7 @@ xp_awk_val_t* xp_awk_cloneval (xp_awk_t* awk, xp_awk_val_t* val)
|
|||||||
case XP_AWK_VAL_INT:
|
case XP_AWK_VAL_INT:
|
||||||
return xp_awk_makeintval (awk, ((xp_awk_val_int_t*)val)->val);
|
return xp_awk_makeintval (awk, ((xp_awk_val_int_t*)val)->val);
|
||||||
case XP_AWK_VAL_REAL:
|
case XP_AWK_VAL_REAL:
|
||||||
return xp_awk_makerealval (((xp_awk_val_real_t*)val)->val);
|
return xp_awk_makerealval (awk, ((xp_awk_val_real_t*)val)->val);
|
||||||
case XP_AWK_VAL_STR:
|
case XP_AWK_VAL_STR:
|
||||||
return xp_awk_makestrval (
|
return xp_awk_makestrval (
|
||||||
((xp_awk_val_str_t*)val)->buf,
|
((xp_awk_val_str_t*)val)->buf,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: val.h,v 1.11 2006-03-28 11:32:58 bacon Exp $
|
* $Id: val.h,v 1.12 2006-03-28 16:33:09 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_VAL_H_
|
#ifndef _XP_AWK_VAL_H_
|
||||||
@ -76,6 +76,7 @@ extern "C" {
|
|||||||
extern xp_awk_val_t* xp_awk_val_nil;
|
extern xp_awk_val_t* xp_awk_val_nil;
|
||||||
|
|
||||||
xp_awk_val_t* xp_awk_makeintval (xp_awk_t* awk, xp_long_t v);
|
xp_awk_val_t* xp_awk_makeintval (xp_awk_t* awk, xp_long_t v);
|
||||||
|
xp_awk_val_t* xp_awk_makerealval (xp_awk_t* awk, xp_real_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);
|
||||||
//xp_awk_val_t* xp_awk_makemapval ();
|
//xp_awk_val_t* xp_awk_makemapval ();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user