*** empty log message ***
This commit is contained in:
parent
83b04dda8c
commit
0942321094
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h,v 1.52 2006-04-18 10:28:03 bacon Exp $
|
* $Id: awk.h,v 1.53 2006-04-18 16:04:54 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_AWK_H_
|
#ifndef _XP_AWK_AWK_H_
|
||||||
@ -73,6 +73,7 @@ enum
|
|||||||
XP_AWK_EDUPNAME, /* duplicate name - function, variable, etc */
|
XP_AWK_EDUPNAME, /* duplicate name - function, variable, etc */
|
||||||
XP_AWK_EUNDEF, /* undefined identifier */
|
XP_AWK_EUNDEF, /* undefined identifier */
|
||||||
XP_AWK_ELVALUE, /* l-value required */
|
XP_AWK_ELVALUE, /* l-value required */
|
||||||
|
XP_AWK_ETOOMANYARGS, /* too many arguments */
|
||||||
|
|
||||||
/* run time error */
|
/* run time error */
|
||||||
XP_AWK_EDIVBYZERO, /* divide by zero */
|
XP_AWK_EDIVBYZERO, /* divide by zero */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: err.c,v 1.11 2006-04-17 16:12:02 bacon Exp $
|
* $Id: err.c,v 1.12 2006-04-18 16:04:54 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -43,6 +43,7 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
|
|||||||
XP_TEXT("duplicate name"),
|
XP_TEXT("duplicate name"),
|
||||||
XP_TEXT("undefined identifier"),
|
XP_TEXT("undefined identifier"),
|
||||||
XP_TEXT("l-value required"),
|
XP_TEXT("l-value required"),
|
||||||
|
XP_TEXT("too many arguments"),
|
||||||
|
|
||||||
XP_TEXT("divide by zero"),
|
XP_TEXT("divide by zero"),
|
||||||
XP_TEXT("invalid operand"),
|
XP_TEXT("invalid operand"),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parse.c,v 1.83 2006-04-16 16:30:59 bacon Exp $
|
* $Id: parse.c,v 1.84 2006-04-18 16:04:54 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -1806,10 +1806,12 @@ static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name)
|
|||||||
{
|
{
|
||||||
xp_awk_nde_t* head, * curr, * nde;
|
xp_awk_nde_t* head, * curr, * nde;
|
||||||
xp_awk_nde_call_t* call;
|
xp_awk_nde_call_t* call;
|
||||||
|
xp_size_t nargs;
|
||||||
|
|
||||||
if (__get_token(awk) == -1) return XP_NULL;
|
if (__get_token(awk) == -1) return XP_NULL;
|
||||||
|
|
||||||
head = curr = XP_NULL;
|
head = curr = XP_NULL;
|
||||||
|
nargs = 0;
|
||||||
|
|
||||||
if (MATCH(awk,TOKEN_RPAREN))
|
if (MATCH(awk,TOKEN_RPAREN))
|
||||||
{
|
{
|
||||||
@ -1831,6 +1833,8 @@ static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name)
|
|||||||
else curr->next = nde;
|
else curr->next = nde;
|
||||||
curr = nde;
|
curr = nde;
|
||||||
|
|
||||||
|
nargs++;
|
||||||
|
|
||||||
if (MATCH(awk,TOKEN_RPAREN))
|
if (MATCH(awk,TOKEN_RPAREN))
|
||||||
{
|
{
|
||||||
if (__get_token(awk) == -1)
|
if (__get_token(awk) == -1)
|
||||||
@ -1867,6 +1871,7 @@ static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name)
|
|||||||
call->next = XP_NULL;
|
call->next = XP_NULL;
|
||||||
call->name = name;
|
call->name = name;
|
||||||
call->args = head;
|
call->args = head;
|
||||||
|
call->nargs = nargs;
|
||||||
|
|
||||||
return (xp_awk_nde_t*)call;
|
return (xp_awk_nde_t*)call;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.58 2006-04-18 15:38:05 bacon Exp $
|
* $Id: run.c,v 1.59 2006-04-18 16:04:58 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -334,6 +334,7 @@ static int __run_block (xp_awk_t* awk, xp_awk_nde_blk_t* nde)
|
|||||||
/*xp_printf (XP_TEXT("executing block statements\n"));*/
|
/*xp_printf (XP_TEXT("executing block statements\n"));*/
|
||||||
while (p != XP_NULL && awk->run.exit_level == EXIT_NONE)
|
while (p != XP_NULL && awk->run.exit_level == EXIT_NONE)
|
||||||
{
|
{
|
||||||
|
/*xp_printf (XP_TEXT("running a statement\n"));*/
|
||||||
if (__run_statement(awk,p) == -1)
|
if (__run_statement(awk,p) == -1)
|
||||||
{
|
{
|
||||||
n = -1;
|
n = -1;
|
||||||
@ -524,7 +525,6 @@ static int __run_for_statement (xp_awk_t* awk, xp_awk_nde_for_t* nde)
|
|||||||
{
|
{
|
||||||
xp_awk_val_t* val;
|
xp_awk_val_t* val;
|
||||||
|
|
||||||
xp_printf (XP_TEXT("__run_for_state...\n"));
|
|
||||||
if (nde->init != XP_NULL)
|
if (nde->init != XP_NULL)
|
||||||
{
|
{
|
||||||
val = __eval_expression(awk,nde->init);
|
val = __eval_expression(awk,nde->init);
|
||||||
@ -589,7 +589,6 @@ xp_printf (XP_TEXT("__run_for_state...\n"));
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_printf (XP_TEXT("end of __run_for_state...\n"));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1951,10 +1950,19 @@ static xp_awk_val_t* __eval_call (xp_awk_t* awk, xp_awk_nde_t* nde)
|
|||||||
xp_awk_nde_call_t* call = (xp_awk_nde_call_t*)nde;
|
xp_awk_nde_call_t* call = (xp_awk_nde_call_t*)nde;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
xp_printf (XP_TEXT(".....__eval_call\n"));
|
/*xp_printf (XP_TEXT(".....__eval_call\n"));*/
|
||||||
pair = xp_awk_map_get (&awk->tree.funcs, call->name);
|
pair = xp_awk_map_get (&awk->tree.funcs, call->name);
|
||||||
if (pair == XP_NULL) PANIC (awk, XP_AWK_ENOSUCHFUNC);
|
if (pair == XP_NULL) PANIC (awk, XP_AWK_ENOSUCHFUNC);
|
||||||
|
|
||||||
|
func = (xp_awk_func_t*)pair->val;
|
||||||
|
xp_assert (func != XP_NULL);
|
||||||
|
|
||||||
|
if (call->nargs > func->nargs)
|
||||||
|
{
|
||||||
|
/* TODO: is this correct? what if i want to allow arbitarary numbers of arguments? */
|
||||||
|
PANIC (awk, XP_AWK_ETOOMANYARGS);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ---------------------
|
* ---------------------
|
||||||
* localn <- stack top
|
* localn <- stack top
|
||||||
@ -2077,13 +2085,32 @@ xp_printf (XP_TEXT(".....__eval_call\n"));
|
|||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xp_assert (nargs == call->nargs);
|
||||||
|
|
||||||
|
while (nargs < func->nargs)
|
||||||
|
{
|
||||||
|
/* push as many nils as the number of missing actual arguments */
|
||||||
|
if (__raw_push(awk,xp_awk_val_nil) == -1)
|
||||||
|
{
|
||||||
|
while (nargs > 0)
|
||||||
|
{
|
||||||
|
/* TODO: test this portion. */
|
||||||
|
--nargs;
|
||||||
|
xp_awk_refdownval (awk, STACK_ARG(awk,nargs));
|
||||||
|
__raw_pop (awk);
|
||||||
|
}
|
||||||
|
|
||||||
|
__raw_pop (awk);
|
||||||
|
__raw_pop (awk);
|
||||||
|
__raw_pop (awk);
|
||||||
|
PANIC (awk, XP_AWK_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
nargs++;
|
||||||
|
}
|
||||||
|
|
||||||
awk->run.stack_base = saved_stack_top;
|
awk->run.stack_base = saved_stack_top;
|
||||||
STACK_NARGS(awk) = (void*)nargs;
|
STACK_NARGS(awk) = (void*)nargs;
|
||||||
|
|
||||||
func = (xp_awk_func_t*)pair->val;
|
|
||||||
xp_assert (func != XP_NULL);
|
|
||||||
|
|
||||||
/* TODO: do i need to check if the number of arguments matches the actual arguments...???? this might be the compiler job... */
|
|
||||||
|
|
||||||
/*xp_printf (XP_TEXT("running function body\n")); */
|
/*xp_printf (XP_TEXT("running function body\n")); */
|
||||||
|
|
||||||
@ -2117,7 +2144,7 @@ xp_printf (XP_TEXT(".....__eval_call\n"));
|
|||||||
awk->run.exit_level = EXIT_NONE;
|
awk->run.exit_level = EXIT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
xp_printf (XP_TEXT("returning from function stack_top=%ld, stack_base=%ld\n"), awk->run.stack_top, awk->run.stack_base);
|
/*xp_printf (XP_TEXT("returning from function stack_top=%ld, stack_base=%ld\n"), awk->run.stack_top, awk->run.stack_base); */
|
||||||
return (n == -1)? XP_NULL: v;
|
return (n == -1)? XP_NULL: v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: tree.h,v 1.34 2006-04-16 16:30:59 bacon Exp $
|
* $Id: tree.h,v 1.35 2006-04-18 16:04:59 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _XP_AWK_TREE_H_
|
#ifndef _XP_AWK_TREE_H_
|
||||||
@ -173,6 +173,7 @@ struct xp_awk_nde_call_t
|
|||||||
XP_AWK_NDE_HDR;
|
XP_AWK_NDE_HDR;
|
||||||
xp_char_t* name;
|
xp_char_t* name;
|
||||||
xp_awk_nde_t* args;
|
xp_awk_nde_t* args;
|
||||||
|
xp_size_t nargs;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* XP_AWK_NDE_IF */
|
/* XP_AWK_NDE_IF */
|
||||||
|
Loading…
Reference in New Issue
Block a user