fixed a bug in emitting a string

This commit is contained in:
2009-09-03 06:55:55 +00:00
parent 15227808a7
commit 10c75d357d
23 changed files with 887 additions and 353 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: fnc.c 274 2009-08-28 12:47:09Z hyunghwan.chung $
* $Id: fnc.c 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -1080,18 +1080,22 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
* end of string($) needs to be tested */
while (cur_ptr <= a2_end)
{
qse_awk_errnum_t errnum;
if (max_count == 0 || sub_count < max_count)
{
n = QSE_AWK_MATCHREX (
run->awk, rex, opt,
a2_ptr, a2_len,
cur_ptr, cur_len,
&mat, &run->errinf.num);
&mat, &errnum
);
}
else n = 0;
if (n == -1)
if (n <= -1)
{
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
FREE_A0_REX (run->awk, rex);
qse_str_fini (&new);
FREE_A_PTRS (run->awk);
@ -1262,8 +1266,9 @@ static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
qse_size_t len0, len1;
qse_long_t idx;
void* rex;
int opt, n;
int n;
qse_cstr_t mat;
qse_awk_errnum_t errnum;
nargs = qse_awk_rtx_getnargs (run);
QSE_ASSERT (nargs == 2);
@ -1315,17 +1320,21 @@ static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str1);
}
opt = (run->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0;
n = QSE_AWK_MATCHREX (
run->awk, rex, opt,
run->awk, rex,
(run->gbl.ignorecase? QSE_REX_MATCH_IGNORECASE: 0),
str0, len0, str0, len0,
&mat, &run->errinf.num
&mat, &errnum
);
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str0);
if (a1->type != QSE_AWK_VAL_REX) QSE_AWK_FREEREX (run->awk, rex);
if (n == -1) return -1;
if (n <= -1)
{
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
return -1;
}
idx = (n == 0)? 0: ((qse_long_t)(mat.ptr-str0) + 1);

View File

@ -1,5 +1,5 @@
/*
* $Id: rio.c 272 2009-08-28 09:48:02Z hyunghwan.chung $
* $Id: rio.c 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -272,6 +272,7 @@ int qse_awk_rtx_readio (
* after the previous matchrex has failed */
qse_cstr_t match;
qse_awk_errnum_t errnum;
QSE_ASSERT (run->gbl.rs != QSE_NULL);
@ -280,9 +281,10 @@ int qse_awk_rtx_readio (
((run->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0),
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
&match, &run->errinf.num);
&match, &errnum);
if (n <= -1)
{
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
ret = -1;
break;
}
@ -360,6 +362,7 @@ int qse_awk_rtx_readio (
else
{
qse_cstr_t match;
qse_awk_errnum_t errnum;
/* TODO: minimize the number of regular expressoin match here...
* currently matchrex is called for each character added to buf.
@ -372,9 +375,10 @@ int qse_awk_rtx_readio (
((run->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0),
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
QSE_STR_PTR(buf), QSE_STR_LEN(buf),
&match, &run->errinf.num);
&match, &errnum);
if (n <= -1)
{
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
ret = -1;
p->in.pos--; /* unread the character in c */
break;

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c 267 2009-08-25 09:50:07Z hyunghwan.chung $
* $Id: run.c 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -403,11 +403,13 @@ static int set_global (
if (fs_len > 1)
{
void* rex;
qse_awk_errnum_t errnum;
rex = QSE_AWK_BUILDREX (
rtx->awk, fs_ptr, fs_len, &rtx->errinf.num);
rtx->awk, fs_ptr, fs_len, &errnum);
if (rex == QSE_NULL)
{
SETERR_COD (rtx, errnum);
if (val->type != QSE_AWK_VAL_STR)
QSE_AWK_FREE (rtx->awk, fs_ptr);
return -1;
@ -564,11 +566,14 @@ static int set_global (
if (rs_len > 1)
{
void* rex;
qse_awk_errnum_t errnum;
/* compile the regular expression */
rex = QSE_AWK_BUILDREX (
rtx->awk, rs_ptr, rs_len, &rtx->errinf.num);
rtx->awk, rs_ptr, rs_len, &errnum);
if (rex == QSE_NULL)
{
SETERR_COD (rtx, errnum);
if (val->type != QSE_AWK_VAL_STR)
QSE_AWK_FREE (rtx->awk, rs_ptr);
return -1;

View File

@ -1,5 +1,5 @@
/*
* $Id: tree.c 265 2009-08-24 01:50:38Z hyunghwan.chung $
* $Id: tree.c 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -295,6 +295,10 @@ static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde)
PUT_SRCSTR (awk, QSE_T("\\a"));
else if (ptr[i] == QSE_T('\0'))
PUT_SRCSTR (awk, QSE_T("\\0"));
else if (ptr[i] == QSE_T('\"'))
PUT_SRCSTR (awk, QSE_T("\\\""));
else if (ptr[i] == QSE_T('\\'))
PUT_SRCSTR (awk, QSE_T("\\\\"));
else
PUT_SRCSTRX (awk, &ptr[i], 1);
}

View File

@ -1,5 +1,5 @@
/*
* $Id: sed.c 276 2009-08-31 13:24:06Z hyunghwan.chung $
* $Id: sed.c 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -1704,10 +1704,10 @@ static int write_str_clearly (
if (QSE_ISPRINT(c)) WRITE_CHAR (sed, c);
else
{
# ifdef QSE_CHAR_IS_MCHAR
#ifdef QSE_CHAR_IS_MCHAR
WRITE_CHAR (sed, QSE_T('\\'));
WRITE_NUM (sed, c, 8, QSE_SIZEOF(qse_char_t)*3);
# else
#else
if (QSE_SIZEOF(qse_char_t) <= 2)
{
WRITE_STR (sed, QSE_T("\\u"), 2);
@ -1717,7 +1717,7 @@ static int write_str_clearly (
WRITE_STR (sed, QSE_T("\\U"), 2);
}
WRITE_NUM (sed, c, 16, QSE_SIZEOF(qse_char_t)*2);
# endif
#endif
}
}
}
@ -2296,11 +2296,22 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd)
break;
case QSE_SED_CMD_PRINT_CLEARLY:
n = write_str_clearly (
sed,
QSE_STR_PTR(&sed->e.in.line),
QSE_STR_LEN(&sed->e.in.line)
);
if (sed->lformatter)
{
n = sed->lformatter (
sed,
QSE_STR_PTR(&sed->e.in.line),
QSE_STR_LEN(&sed->e.in.line),
write_char
);
}
else {
n = write_str_clearly (
sed,
QSE_STR_PTR(&sed->e.in.line),
QSE_STR_LEN(&sed->e.in.line)
);
}
if (n <= -1) return QSE_NULL;
break;
@ -2761,6 +2772,16 @@ done3:
return ret;
}
qse_sed_lformatter_t qse_sed_getlformatter (qse_sed_t* sed)
{
return sed->lformatter;
}
void qse_sed_setlformatter (qse_sed_t* sed, qse_sed_lformatter_t lf)
{
sed->lformatter = lf;
}
qse_size_t qse_sed_getlinnum (qse_sed_t* sed)
{
return sed->e.in.num;

View File

@ -1,5 +1,5 @@
/*
* $Id: sed.h 269 2009-08-26 03:03:51Z hyunghwan.chung $
* $Id: sed.h 277 2009-09-02 12:55:55Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -147,6 +147,8 @@ struct qse_sed_t
int option; /**< stores options */
qse_sed_lformatter_t lformatter;
struct
{
struct