fixed a bug in closing a qse_awk_rtx_t object
- refdown_globals() should have been called after qse_awk_rtx_clrrec() as it still access NF. fixed typo in awk error messages fixed a memory allocation bug in matching a group (match_group) uncommented binary number parsing code in the awk parser.
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: err.c 205 2009-06-20 12:47:34Z hyunghwan.chung $
|
||||
* $Id: err.c 207 2009-06-22 13:01:28Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -64,8 +64,8 @@ const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum)
|
||||
QSE_T("cannot unget character"),
|
||||
|
||||
QSE_T("unexpected end of source"),
|
||||
QSE_T("a comment not cloawk properly"),
|
||||
QSE_T("a string or a regular expression not cloawk"),
|
||||
QSE_T("a comment not closed properly"),
|
||||
QSE_T("a string or a regular expression not closed"),
|
||||
QSE_T("unexpected end of a regular expression"),
|
||||
QSE_T("a left brace expected in place of '${0}'"),
|
||||
QSE_T("a left parenthesis expected in place of '${0}'"),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c 205 2009-06-20 12:47:34Z hyunghwan.chung $
|
||||
* $Id: parse.c 207 2009-06-22 13:01:28Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -2558,6 +2558,7 @@ static qse_awk_nde_t* parse_concat (qse_awk_t* awk, qse_size_t line)
|
||||
MATCH(awk,TOKEN_MINUS) ||
|
||||
MATCH(awk,TOKEN_PLUSPLUS) ||
|
||||
MATCH(awk,TOKEN_MINUSMINUS) ||
|
||||
MATCH(awk,TOKEN_LNOT) ||
|
||||
awk->token.type >= TOKEN_GETLINE)
|
||||
{
|
||||
/* TODO: is the check above sufficient? */
|
||||
@ -5041,7 +5042,6 @@ static int get_number (qse_awk_t* awk)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
else if (c == QSE_T('b') || c == QSE_T('B'))
|
||||
{
|
||||
/* binary number */
|
||||
@ -5054,7 +5054,6 @@ static int get_number (qse_awk_t* awk)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
else if (c != '.')
|
||||
{
|
||||
/* octal number */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rio.c 202 2009-06-16 06:05:40Z hyunghwan.chung $
|
||||
* $Id: rio.c 207 2009-06-22 13:01:28Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -279,13 +279,13 @@ int qse_awk_rtx_readio (
|
||||
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
|
||||
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
|
||||
&match, &run->errinf.num);
|
||||
if (n == -1)
|
||||
if (n <= -1)
|
||||
{
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (n == 1)
|
||||
if (n >= 1)
|
||||
{
|
||||
/* the match should be found at the end of
|
||||
* the current buffer */
|
||||
@ -359,6 +359,10 @@ int qse_awk_rtx_readio (
|
||||
{
|
||||
qse_cstr_t match;
|
||||
|
||||
/* TODO: minimize the number of regular expressoin match here...
|
||||
* currently matchrex is called for each character added to buf.
|
||||
* this is a very bad way of doing the job.
|
||||
*/
|
||||
QSE_ASSERT (run->gbl.rs != QSE_NULL);
|
||||
|
||||
n = QSE_AWK_MATCHREX (
|
||||
@ -367,14 +371,14 @@ int qse_awk_rtx_readio (
|
||||
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
|
||||
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
|
||||
&match, &run->errinf.num);
|
||||
if (n == -1)
|
||||
if (n <= -1)
|
||||
{
|
||||
ret = -1;
|
||||
p->in.pos--; /* unread the character in c */
|
||||
break;
|
||||
}
|
||||
|
||||
if (n == 1)
|
||||
if (n >= 1)
|
||||
{
|
||||
/* the match should be found at the end of
|
||||
* the current buffer */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c 206 2009-06-21 13:33:05Z hyunghwan.chung $
|
||||
* $Id: run.c 207 2009-06-22 13:01:28Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||
|
||||
@ -77,10 +77,10 @@ static qse_size_t push_arg_from_vals (
|
||||
qse_awk_rtx_t* rtx, qse_awk_nde_call_t* call, void* data);
|
||||
|
||||
static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio);
|
||||
static void fini_rtx (qse_awk_rtx_t* rtx);
|
||||
static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals);
|
||||
|
||||
static int init_globals (qse_awk_rtx_t* rtx, const qse_cstr_t* arg);
|
||||
static void fini_globals (qse_awk_rtx_t* rtx);
|
||||
static void refdown_globals (qse_awk_rtx_t* run, int pop);
|
||||
|
||||
static int run_pattern_blocks (qse_awk_rtx_t* run);
|
||||
static int run_pattern_block_chain (
|
||||
@ -415,7 +415,7 @@ static int set_global (
|
||||
qse_real_t rv;
|
||||
|
||||
n = qse_awk_rtx_valtonum (run, val, &lv, &rv);
|
||||
if (n == -1) return -1;
|
||||
if (n <= -1) return -1;
|
||||
if (n == 1) lv = (qse_long_t)rv;
|
||||
|
||||
if (lv < (qse_long_t)run->inrec.nflds)
|
||||
@ -682,7 +682,7 @@ qse_awk_rtx_t* qse_awk_rtx_open (
|
||||
|
||||
if (init_globals (rtx, arg) == -1)
|
||||
{
|
||||
fini_rtx (rtx);
|
||||
fini_rtx (rtx, 0);
|
||||
QSE_AWK_FREE (awk, rtx);
|
||||
return QSE_NULL;
|
||||
}
|
||||
@ -692,8 +692,7 @@ qse_awk_rtx_t* qse_awk_rtx_open (
|
||||
|
||||
void qse_awk_rtx_close (qse_awk_rtx_t* rtx)
|
||||
{
|
||||
fini_globals (rtx);
|
||||
fini_rtx (rtx);
|
||||
fini_rtx (rtx, 1);
|
||||
QSE_AWK_FREE (rtx->awk, rtx);
|
||||
}
|
||||
|
||||
@ -854,7 +853,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fini_rtx (qse_awk_rtx_t* rtx)
|
||||
static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
|
||||
{
|
||||
if (rtx->pattern_range_state != QSE_NULL)
|
||||
QSE_AWK_FREE (rtx->awk, rtx->pattern_range_state);
|
||||
@ -922,8 +921,8 @@ static void fini_rtx (qse_awk_rtx_t* rtx)
|
||||
qse_str_fini (&rtx->format.fmt);
|
||||
qse_str_fini (&rtx->format.out);
|
||||
|
||||
/* destroy input record. qse_awk_rtx_clrrec should be called
|
||||
* before the rtx stack has been destroyed because it may try
|
||||
/* destroy input record. qse_awk_rtx_clrrec() should be called
|
||||
* before the stack has been destroyed because it may try
|
||||
* to change the value to QSE_AWK_GBL_NF. */
|
||||
qse_awk_rtx_clrrec (rtx, QSE_FALSE);
|
||||
if (rtx->inrec.flds != QSE_NULL)
|
||||
@ -934,6 +933,8 @@ static void fini_rtx (qse_awk_rtx_t* rtx)
|
||||
}
|
||||
qse_str_fini (&rtx->inrec.line);
|
||||
|
||||
if (fini_globals) refdown_globals (rtx, 1);
|
||||
|
||||
/* destroy the stack if necessary */
|
||||
if (rtx->stack != QSE_NULL)
|
||||
{
|
||||
@ -1248,11 +1249,6 @@ oops:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void fini_globals (qse_awk_rtx_t* rtx)
|
||||
{
|
||||
refdown_globals (rtx, 1);
|
||||
}
|
||||
|
||||
struct capture_retval_data_t
|
||||
{
|
||||
qse_awk_rtx_t* rtx;
|
||||
@ -4028,7 +4024,6 @@ static int __cmp_int_str (
|
||||
|
||||
if (rtx->awk->option & QSE_AWK_NCMPONSTR)
|
||||
{
|
||||
const qse_char_t* end;
|
||||
qse_long_t ll;
|
||||
qse_real_t rr;
|
||||
|
||||
@ -4180,9 +4175,6 @@ static int __cmp_str_real (
|
||||
static int __cmp_str_str (
|
||||
qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right)
|
||||
{
|
||||
int n1, n2;
|
||||
qse_long_t l1, l2;
|
||||
qse_real_t r1, r2;
|
||||
qse_awk_val_str_t* ls, * rs;
|
||||
|
||||
ls = (qse_awk_val_str_t*)left;
|
||||
|
Reference in New Issue
Block a user