*** empty log message ***
This commit is contained in:
		| @ -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,14 +2085,33 @@ 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")); */ | ||||||
|  |  | ||||||
| 	xp_assert (func->body->type == XP_AWK_NDE_BLK); | 	xp_assert (func->body->type == XP_AWK_NDE_BLK); | ||||||
| @ -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 */ | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user