fixed a bug of not checking a parameter name against the function name

This commit is contained in:
hyung-hwan 2009-06-27 23:52:54 +00:00
parent c31adc3f7c
commit b9d3b490a2
10 changed files with 25 additions and 66 deletions

View File

@ -1,3 +0,0 @@
function f(f) { print f; }
BEGIN { f("hello"); }

View File

@ -1,5 +0,0 @@
function f(f)
{
print f;
f("my hello");
}

View File

@ -1,3 +0,0 @@
# should print 50
function fn(f) { f = 20; }
BEGIN { f = 50; fn(100); print f; }

View File

@ -1,3 +0,0 @@
# A function and a named variable cannot have the same name.
function a () { }
BEGIN { a = 20; }

View File

@ -1,3 +0,0 @@
function a () { }
BEGIN { local a; a = 20; }

View File

@ -1,2 +0,0 @@
global a;
function a () { }

View File

@ -1,4 +0,0 @@
function fn () { a = 20; return a;}
global a;
BEGIN { a = 30; print fn (); print a; }

View File

@ -1,16 +0,0 @@
global x;
BEGIN {
x = 1;
{
local x;
x = 2;
{
local x;
x = 3;
print x;
}
print x;
}
print x;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: parse.c 214 2009-06-27 02:50:54Z hyunghwan.chung $
* $Id: parse.c 215 2009-06-27 05:52:54Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -930,13 +930,16 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
/* NOTE: the following is not a conflict.
* so the parameter is not checked against
* global variables.
* gbl x;
* global x;
* function f (x) { print x; }
* x in print x is a parameter
*/
/* check if a parameter conflicts with other parameters */
if (qse_lda_search (awk->parse.params,
/* check if a parameter conflicts with the function
* name or other parameters */
if (qse_strxncmp (
param, param_len, name_dup, name_len) == 0 ||
qse_lda_search (awk->parse.params,
0, param, param_len) != QSE_LDA_NIL)
{
QSE_AWK_FREE (awk, name_dup);
@ -989,12 +992,16 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
return QSE_NULL;
}
if (get_token(awk) <= -1)
do
{
QSE_AWK_FREE (awk, name_dup);
qse_lda_clear (awk->parse.params);
return QSE_NULL;
if (get_token(awk) <= -1)
{
QSE_AWK_FREE (awk, name_dup);
qse_lda_clear (awk->parse.params);
return QSE_NULL;
}
}
while (MATCH(awk,TOKEN_NEWLINE));
}
if (get_token(awk) <= -1)
@ -3723,17 +3730,22 @@ static qse_awk_nde_t* parse_fncall (
if (!MATCH(awk,TOKEN_COMMA))
{
if (head != QSE_NULL) qse_awk_clrpt (awk, head);
if (head != QSE_NULL)
qse_awk_clrpt (awk, head);
SETERRTOK (awk, QSE_AWK_ECOMMA);
return QSE_NULL;
}
if (get_token(awk) <= -1)
do
{
if (head != QSE_NULL) qse_awk_clrpt (awk, head);
return QSE_NULL;
if (get_token(awk) <= -1)
{
if (head != QSE_NULL)
qse_awk_clrpt (awk, head);
return QSE_NULL;
}
}
while (MATCH(awk,TOKEN_NEWLINE));
}
}

View File

@ -1,14 +0,0 @@
ld zero # initialize sum to zero
st sum
loop get # read a number
jz done # no more input if number is zero
add sum # add in accumulated sum
st sum # store new value back in sum
j loop # go back and read another number
done ld sum # print sum
put
halt
zero const 0
sum const