fixed escape sequence handling in regular expression
This commit is contained in:
parent
fc00b6f468
commit
df755c2bd1
123
ase/awk/rex.c
123
ase/awk/rex.c
@ -893,6 +893,25 @@ what if it is not in the raight format? convert it to ordinary characters?? */
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CHECK_END(builder) \
|
||||||
|
do { \
|
||||||
|
if (builder->ptn.curp >= builder->ptn.end) \
|
||||||
|
{ \
|
||||||
|
builder->errnum = ASE_AWK_EREXEND; \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define IS_HEX(c) \
|
||||||
|
((c >= ASE_T('0') && c <= ASE_T('9')) || \
|
||||||
|
(c >= ASE_T('A') && c <= ASE_T('F')) || \
|
||||||
|
(c >= ASE_T('a') && c <= ASE_T('f')))
|
||||||
|
|
||||||
|
#define HEX_TO_NUM(c) \
|
||||||
|
((c >= ASE_T('0') && c <= ASE_T('9'))? c-ASE_T('0'): \
|
||||||
|
(c >= ASE_T('A') && c <= ASE_T('F'))? c-ASE_T('A')+10: \
|
||||||
|
c-ASE_T('a')+10)
|
||||||
|
|
||||||
static int next_char (builder_t* builder, int level)
|
static int next_char (builder_t* builder, int level)
|
||||||
{
|
{
|
||||||
if (builder->ptn.curp >= builder->ptn.end)
|
if (builder->ptn.curp >= builder->ptn.end)
|
||||||
@ -909,14 +928,106 @@ static int next_char (builder_t* builder, int level)
|
|||||||
|
|
||||||
if (builder->ptn.curc.value == ASE_T('\\'))
|
if (builder->ptn.curc.value == ASE_T('\\'))
|
||||||
{
|
{
|
||||||
if (builder->ptn.curp >= builder->ptn.end)
|
ase_char_t c;
|
||||||
{
|
|
||||||
builder->errnum = ASE_AWK_EREXEND;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
builder->ptn.curc.value = *builder->ptn.curp++;
|
CHECK_END (builder);
|
||||||
|
c = *builder->ptn.curp++;
|
||||||
|
|
||||||
|
if (c == ASE_T('n')) c = ASE_T('\n');
|
||||||
|
else if (c == ASE_T('r')) c = ASE_T('\r');
|
||||||
|
else if (c == ASE_T('t')) c = ASE_T('\t');
|
||||||
|
else if (c == ASE_T('f')) c = ASE_T('\f');
|
||||||
|
else if (c == ASE_T('b')) c = ASE_T('\b');
|
||||||
|
else if (c == ASE_T('v')) c = ASE_T('\v');
|
||||||
|
else if (c == ASE_T('a')) c = ASE_T('\a');
|
||||||
|
else if (c >= ASE_T('0') && c <= ASE_T('7'))
|
||||||
|
{
|
||||||
|
ase_char_t cx;
|
||||||
|
|
||||||
|
c = c - ASE_T('0');
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (cx >= ASE_T('0') && cx <= ASE_T('7'))
|
||||||
|
{
|
||||||
|
c = c * 8 + cx - ASE_T('0');
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (cx >= ASE_T('0') && cx <= ASE_T('7'))
|
||||||
|
{
|
||||||
|
c = c * 8 + cx - ASE_T('0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (c == ASE_T('x'))
|
||||||
|
{
|
||||||
|
ase_char_t cx;
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (IS_HEX(cx))
|
||||||
|
{
|
||||||
|
c = HEX_TO_NUM(cx);
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (IS_HEX(cx))
|
||||||
|
{
|
||||||
|
c = c * 16 + HEX_TO_NUM(cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef ASE_CHAR_IS_WCHAR
|
||||||
|
else if (c == ASE_T('u') && ASE_SIZEOF(ase_char_t) >= 2)
|
||||||
|
{
|
||||||
|
ase_char_t cx;
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (IS_HEX(cx))
|
||||||
|
{
|
||||||
|
ase_size_t i;
|
||||||
|
|
||||||
|
c = HEX_TO_NUM(cx);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
|
||||||
|
if (!IS_HEX(cx)) break;
|
||||||
|
c = c * 16 + HEX_TO_NUM(cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (c == ASE_T('U') && ASE_SIZEOF(ase_char_t) >= 4)
|
||||||
|
{
|
||||||
|
ase_char_t cx;
|
||||||
|
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
if (IS_HEX(cx))
|
||||||
|
{
|
||||||
|
ase_size_t i;
|
||||||
|
|
||||||
|
c = HEX_TO_NUM(cx);
|
||||||
|
|
||||||
|
for (i = 0; i < 7; i++)
|
||||||
|
{
|
||||||
|
CHECK_END (builder);
|
||||||
|
cx = *builder->ptn.curp++;
|
||||||
|
|
||||||
|
if (!IS_HEX(cx)) break;
|
||||||
|
c = c * 16 + HEX_TO_NUM(cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
builder->ptn.curc.value = c;
|
||||||
builder->ptn.curc.escaped = ase_true;
|
builder->ptn.curc.escaped = ase_true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user