*** empty log message ***
This commit is contained in:
parent
951a4bb95b
commit
ff4f09f03f
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parse.c,v 1.76 2006-04-10 15:52:07 bacon Exp $
|
* $Id: parse.c,v 1.77 2006-04-11 09:16:20 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -1064,12 +1064,15 @@ static xp_awk_nde_t* __parse_basic_expr (xp_awk_t* awk)
|
|||||||
|
|
||||||
if (MATCH(awk,TOKEN_QUEST))
|
if (MATCH(awk,TOKEN_QUEST))
|
||||||
{
|
{
|
||||||
|
xp_awk_nde_cnd_t* tmp;
|
||||||
|
|
||||||
if (__get_token(awk) == -1) return XP_NULL;
|
if (__get_token(awk) == -1) return XP_NULL;
|
||||||
|
|
||||||
n1 = __parse_basic_expr (awk);
|
n1 = __parse_basic_expr (awk);
|
||||||
if (n1 == XP_NULL)
|
if (n1 == XP_NULL)
|
||||||
{
|
{
|
||||||
//TODO: error handling...
|
xp_awk_clrpt (nde);
|
||||||
|
return XP_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MATCH(awk,TOKEN_COLON)) PANIC (awk, XP_AWK_ECOLON);
|
if (!MATCH(awk,TOKEN_COLON)) PANIC (awk, XP_AWK_ECOLON);
|
||||||
@ -1078,10 +1081,27 @@ static xp_awk_nde_t* __parse_basic_expr (xp_awk_t* awk)
|
|||||||
n2 = __parse_basic_expr (awk);
|
n2 = __parse_basic_expr (awk);
|
||||||
if (n2 == XP_NULL)
|
if (n2 == XP_NULL)
|
||||||
{
|
{
|
||||||
//TODO: error handling
|
xp_awk_clrpt (nde);
|
||||||
|
xp_awk_clrpt (n1);
|
||||||
|
return XP_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: compose the new node...
|
tmp = (xp_awk_nde_cnd_t*)xp_malloc(xp_sizeof(xp_awk_nde_cnd_t));
|
||||||
|
if (tmp == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_awk_clrpt (nde);
|
||||||
|
xp_awk_clrpt (n1);
|
||||||
|
xp_awk_clrpt (n2);
|
||||||
|
return XP_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp->type = XP_AWK_NDE_CND;
|
||||||
|
tmp->next = XP_NULL;
|
||||||
|
tmp->test = nde;
|
||||||
|
tmp->left = n1;
|
||||||
|
tmp->right = n2;
|
||||||
|
|
||||||
|
nde = (xp_awk_nde_t*)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nde;
|
return nde;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.44 2006-04-10 15:00:19 bacon Exp $
|
* $Id: run.c,v 1.45 2006-04-11 09:16:20 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -87,6 +87,7 @@ static xp_awk_val_t* __eval_binop_mod (
|
|||||||
static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
|
static xp_awk_val_t* __eval_cnd (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_call (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_call (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_int (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_int (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
static xp_awk_val_t* __eval_real (xp_awk_t* awk, xp_awk_nde_t* nde);
|
static xp_awk_val_t* __eval_real (xp_awk_t* awk, xp_awk_nde_t* nde);
|
||||||
@ -636,6 +637,7 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
|
|||||||
__eval_unary,
|
__eval_unary,
|
||||||
__eval_incpre,
|
__eval_incpre,
|
||||||
__eval_incpst,
|
__eval_incpst,
|
||||||
|
__eval_cnd,
|
||||||
__eval_call,
|
__eval_call,
|
||||||
__eval_int,
|
__eval_int,
|
||||||
__eval_real,
|
__eval_real,
|
||||||
@ -1760,6 +1762,24 @@ static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_t* nde)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static xp_awk_val_t* __eval_cnd (xp_awk_t* awk, xp_awk_nde_t* nde)
|
||||||
|
{
|
||||||
|
xp_awk_val_t* tv, * v;
|
||||||
|
xp_awk_nde_cnd_t* cnd = (xp_awk_nde_cnd_t*)nde;
|
||||||
|
|
||||||
|
tv = __eval_expression (awk, cnd->test);
|
||||||
|
if (tv == XP_NULL) return XP_NULL;
|
||||||
|
|
||||||
|
xp_awk_refupval (tv);
|
||||||
|
|
||||||
|
v = (xp_awk_boolval(tv))?
|
||||||
|
__eval_expression (awk, cnd->left):
|
||||||
|
__eval_expression (awk, cnd->right);
|
||||||
|
|
||||||
|
xp_awk_refdownval (awk, tv);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_call (xp_awk_t* awk, xp_awk_nde_t* nde)
|
static xp_awk_val_t* __eval_call (xp_awk_t* awk, xp_awk_nde_t* nde)
|
||||||
{
|
{
|
||||||
xp_awk_func_t* func;
|
xp_awk_func_t* func;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.c,v 1.32 2006-04-04 16:50:36 bacon Exp $
|
* $Id: tree.c,v 1.33 2006-04-11 09:16:20 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -119,6 +119,19 @@ static int __print_expression (xp_awk_nde_t* nde)
|
|||||||
__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
|
__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case XP_AWK_NDE_CND:
|
||||||
|
xp_printf (XP_TEXT("("));
|
||||||
|
if (__print_expression(((xp_awk_nde_cnd_t*)nde)->test) == -1)
|
||||||
|
return -1;
|
||||||
|
xp_printf (XP_TEXT(")?"));
|
||||||
|
|
||||||
|
if (__print_expression(((xp_awk_nde_cnd_t*)nde)->left) == -1)
|
||||||
|
return -1;
|
||||||
|
xp_printf (XP_TEXT(":"));
|
||||||
|
if (__print_expression(((xp_awk_nde_cnd_t*)nde)->right) == -1)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_AWK_NDE_INT:
|
case XP_AWK_NDE_INT:
|
||||||
#if defined(__LCC__)
|
#if defined(__LCC__)
|
||||||
xp_printf (XP_TEXT("%lld"), (long long)((xp_awk_nde_int_t*)nde)->val);
|
xp_printf (XP_TEXT("%lld"), (long long)((xp_awk_nde_int_t*)nde)->val);
|
||||||
@ -547,6 +560,13 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
|
|||||||
xp_free (p);
|
xp_free (p);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case XP_AWK_NDE_CND:
|
||||||
|
xp_awk_clrpt (((xp_awk_nde_cnd_t*)p)->test);
|
||||||
|
xp_awk_clrpt (((xp_awk_nde_cnd_t*)p)->left);
|
||||||
|
xp_awk_clrpt (((xp_awk_nde_cnd_t*)p)->right);
|
||||||
|
xp_free (p);
|
||||||
|
break;
|
||||||
|
|
||||||
case XP_AWK_NDE_INT:
|
case XP_AWK_NDE_INT:
|
||||||
xp_free (p);
|
xp_free (p);
|
||||||
break;
|
break;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.h,v 1.30 2006-04-07 16:52:42 bacon Exp $
|
* $Id: tree.h,v 1.31 2006-04-11 09:16:20 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_TREE_H_
|
#ifndef _XP_AWK_TREE_H_
|
||||||
@ -32,6 +32,7 @@ enum
|
|||||||
XP_AWK_NDE_EXP_UNR,
|
XP_AWK_NDE_EXP_UNR,
|
||||||
XP_AWK_NDE_EXP_INCPRE,
|
XP_AWK_NDE_EXP_INCPRE,
|
||||||
XP_AWK_NDE_EXP_INCPST,
|
XP_AWK_NDE_EXP_INCPST,
|
||||||
|
XP_AWK_NDE_CND,
|
||||||
XP_AWK_NDE_CALL,
|
XP_AWK_NDE_CALL,
|
||||||
XP_AWK_NDE_INT,
|
XP_AWK_NDE_INT,
|
||||||
XP_AWK_NDE_REAL,
|
XP_AWK_NDE_REAL,
|
||||||
@ -54,6 +55,7 @@ typedef struct xp_awk_nde_t xp_awk_nde_t;
|
|||||||
typedef struct xp_awk_nde_blk_t xp_awk_nde_blk_t;
|
typedef struct xp_awk_nde_blk_t xp_awk_nde_blk_t;
|
||||||
typedef struct xp_awk_nde_ass_t xp_awk_nde_ass_t;
|
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_cnd_t xp_awk_nde_cnd_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_real_t xp_awk_nde_real_t;
|
||||||
@ -103,7 +105,7 @@ struct xp_awk_nde_ass_t
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR,
|
/* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR,
|
||||||
* XP_AWK_NDE_EXP_INCPRE, XP_AWNDE_EXP_INCPST */
|
* XP_AWK_NDE_EXP_INCPRE, XP_AW_NDE_EXP_INCPST */
|
||||||
struct xp_awk_nde_exp_t
|
struct xp_awk_nde_exp_t
|
||||||
{
|
{
|
||||||
XP_AWK_NDE_HDR;
|
XP_AWK_NDE_HDR;
|
||||||
@ -112,6 +114,15 @@ struct xp_awk_nde_exp_t
|
|||||||
xp_awk_nde_t* right; /* XP_NULL for UNR, INCPRE, INCPST */
|
xp_awk_nde_t* right; /* XP_NULL for UNR, INCPRE, INCPST */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* XP_AWK_NDE_CND */
|
||||||
|
struct xp_awk_nde_cnd_t
|
||||||
|
{
|
||||||
|
XP_AWK_NDE_HDR;
|
||||||
|
xp_awk_nde_t* test;
|
||||||
|
xp_awk_nde_t* left;
|
||||||
|
xp_awk_nde_t* right;
|
||||||
|
};
|
||||||
|
|
||||||
/* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */
|
/* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */
|
||||||
struct xp_awk_nde_pos_t
|
struct xp_awk_nde_pos_t
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user