partial enhancement to str::match() and match()
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
d6ac0010d3
commit
7ff4b3a812
83
lib/fnc.c
83
lib/fnc.c
@ -1713,7 +1713,6 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
|
|||||||
|
|
||||||
/* RLENGTH: -1 on no match */
|
/* RLENGTH: -1 on no match */
|
||||||
HAWK_ASSERT (&mat.o.len == &mat.b.len);
|
HAWK_ASSERT (&mat.o.len == &mat.b.len);
|
||||||
//x1 = hawk_rtx_makeintval(rtx, ((n == 0)? (hawk_int_t)-1: (hawk_int_t)mat.o.len)); /* just use mat.o.len regardless of a0_type */
|
|
||||||
x1 = hawk_rtx_makeintval(rtx, ((n == 0)? (hawk_int_t)-1: (hawk_int_t)mat.o.len)); /* just use mat.o.len regardless of a0_type */
|
x1 = hawk_rtx_makeintval(rtx, ((n == 0)? (hawk_int_t)-1: (hawk_int_t)mat.o.len)); /* just use mat.o.len regardless of a0_type */
|
||||||
if (!x1) goto oops;
|
if (!x1) goto oops;
|
||||||
hawk_rtx_refupval (rtx, x1);
|
hawk_rtx_refupval (rtx, x1);
|
||||||
@ -1726,13 +1725,53 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
|
|||||||
hawk_val_t* tv;
|
hawk_val_t* tv;
|
||||||
|
|
||||||
hawk_ooecs_clear (&rtx->fnc.oout);
|
hawk_ooecs_clear (&rtx->fnc.oout);
|
||||||
|
subsep = hawk_rtx_getsubsep(rtx);
|
||||||
|
|
||||||
x2 = hawk_rtx_makemapval(rtx);
|
x2 = hawk_rtx_makemapval(rtx);
|
||||||
if (HAWK_UNLIKELY(!x2)) goto oops;
|
if (HAWK_UNLIKELY(!x2)) goto oops;
|
||||||
hawk_rtx_refupval (rtx, x2);
|
hawk_rtx_refupval (rtx, x2);
|
||||||
|
|
||||||
|
/* add the full match value to the array at index "0" */
|
||||||
|
if (hawk_ooecs_fmt(&rtx->fnc.oout, HAWK_T("%d"), 0) == (hawk_oow_t)-1) goto oops;
|
||||||
|
tv = (a0_type == HAWK_VAL_MBS)?
|
||||||
|
hawk_rtx_makembsvalwithbchars(rtx, mat.b.ptr, mat.b.len):
|
||||||
|
hawk_rtx_makestrvalwithoochars(rtx, mat.o.ptr, mat.o.len);
|
||||||
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
|
{
|
||||||
|
hawk_rtx_refupval (rtx, tv);
|
||||||
|
hawk_rtx_refdownval (rtx, tv);
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 0,start */
|
||||||
|
if (hawk_ooecs_ncat(&rtx->fnc.oout, subsep->ptr, subsep->len) == (hawk_oow_t)-1) goto oops;
|
||||||
|
xlen = HAWK_OOECS_LEN(&rtx->fnc.oout);
|
||||||
|
if (hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("start"), 5) == (hawk_oow_t)-1) goto oops;
|
||||||
|
|
||||||
|
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.ptr - str0.b + 1: mat.o.ptr - str0.o + 1));
|
||||||
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
|
{
|
||||||
|
hawk_rtx_refupval (rtx, tv);
|
||||||
|
hawk_rtx_refdownval (rtx, tv);
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 0,length */
|
||||||
|
if (hawk_ooecs_setlen(&rtx->fnc.oout, xlen) == (hawk_oow_t)-1 ||
|
||||||
|
hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("length"), 6) == (hawk_oow_t)-1) goto oops;
|
||||||
|
|
||||||
|
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? mat.b.len: mat.o.len));
|
||||||
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
|
{
|
||||||
|
hawk_rtx_refupval (rtx, tv);
|
||||||
|
hawk_rtx_refdownval (rtx, tv);
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
submatcount = 0;
|
submatcount = 0;
|
||||||
subsep = hawk_rtx_getsubsep(rtx);
|
|
||||||
for (i = 0; i < HAWK_COUNTOF(submat.o); i++)
|
for (i = 0; i < HAWK_COUNTOF(submat.o); i++)
|
||||||
{
|
{
|
||||||
HAWK_ASSERT ((void*)&submat.o[i] == (void*)&submat.b[i]);
|
HAWK_ASSERT ((void*)&submat.o[i] == (void*)&submat.b[i]);
|
||||||
@ -1740,13 +1779,25 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
|
|||||||
|
|
||||||
submatcount++;
|
submatcount++;
|
||||||
|
|
||||||
if (hawk_ooecs_fmt(&rtx->fnc.oout, HAWK_T("%d"), (int)submatcount) == (hawk_oow_t)-1 ||
|
if (hawk_ooecs_fmt(&rtx->fnc.oout, HAWK_T("%d"), (int)submatcount) == (hawk_oow_t)-1) goto oops;
|
||||||
hawk_ooecs_ncat(&rtx->fnc.oout, subsep->ptr, subsep->len) == (hawk_oow_t)-1) goto oops;
|
|
||||||
|
tv = (a0_type == HAWK_VAL_MBS)?
|
||||||
|
hawk_rtx_makembsvalwithbchars(rtx, submat.b[i].ptr, submat.b[i].len):
|
||||||
|
hawk_rtx_makestrvalwithoochars(rtx, submat.o[i].ptr, submat.o[i].len);
|
||||||
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
|
{
|
||||||
|
hawk_rtx_refupval (rtx, tv);
|
||||||
|
hawk_rtx_refdownval (rtx, tv);
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hawk_ooecs_ncat(&rtx->fnc.oout, subsep->ptr, subsep->len) == (hawk_oow_t)-1) goto oops;
|
||||||
xlen = HAWK_OOECS_LEN(&rtx->fnc.oout);
|
xlen = HAWK_OOECS_LEN(&rtx->fnc.oout);
|
||||||
if (hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("start"), 5) == (hawk_oow_t)-1) goto oops;
|
if (hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("start"), 5) == (hawk_oow_t)-1) goto oops;
|
||||||
|
|
||||||
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].ptr - str0.b + 1: submat.o[i].ptr - str0.o + 1));
|
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].ptr - str0.b + 1: submat.o[i].ptr - str0.o + 1));
|
||||||
if (!tv) goto oops;
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
{
|
{
|
||||||
hawk_rtx_refupval (rtx, tv);
|
hawk_rtx_refupval (rtx, tv);
|
||||||
@ -1757,8 +1808,8 @@ static int __fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, int support_
|
|||||||
if (hawk_ooecs_setlen(&rtx->fnc.oout, xlen) == (hawk_oow_t)-1 ||
|
if (hawk_ooecs_setlen(&rtx->fnc.oout, xlen) == (hawk_oow_t)-1 ||
|
||||||
hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("length"), 6) == (hawk_oow_t)-1) goto oops;
|
hawk_ooecs_ncat(&rtx->fnc.oout, HAWK_T("length"), 6) == (hawk_oow_t)-1) goto oops;
|
||||||
|
|
||||||
tv = hawk_rtx_makeintval(rtx, submat.o[i].len);
|
tv = hawk_rtx_makeintval(rtx, ((a0_type == HAWK_VAL_MBS)? submat.b[i].len: submat.o[i].len));
|
||||||
if (!tv) goto oops;
|
if (HAWK_UNLIKELY(!tv)) goto oops;
|
||||||
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
if (!hawk_rtx_setmapvalfld(rtx, x2, HAWK_OOECS_PTR(&rtx->fnc.oout), HAWK_OOECS_LEN(&rtx->fnc.oout), tv))
|
||||||
{
|
{
|
||||||
hawk_rtx_refupval (rtx, tv);
|
hawk_rtx_refupval (rtx, tv);
|
||||||
@ -1794,26 +1845,16 @@ oops:
|
|||||||
|
|
||||||
static int fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
static int fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
/*
|
/* this variant supports three parameters only.
|
||||||
match("abcdefg", "cde");
|
* the start index is not supported.
|
||||||
match("abcdefgdefx", "def", 7);
|
* you must use str::match() for it instead. */
|
||||||
------------------------------------
|
|
||||||
match("ab\uB098cdefgdefx", /(def)g(.+)/, x);
|
|
||||||
q = length(x) / 2;
|
|
||||||
for (i = 1; i <= q; i++) print x[i,"start"], x[i,"length"];
|
|
||||||
print RSTART, RLENGTH;
|
|
||||||
* ------------------------------------
|
|
||||||
match(@b"ab\xB0\x98cdefgdefx", /(def)g(.+)/, x);
|
|
||||||
q = length(x) / 2;
|
|
||||||
for (i = 1; i <= q; i++) print x[i,"start"], x[i,"length"];
|
|
||||||
print RSTART, RLENGTH;
|
|
||||||
*/
|
|
||||||
return __fnc_match(rtx, fi, 0);
|
return __fnc_match(rtx, fi, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int hawk_fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
int hawk_fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
str::match(@b"abcdefg", "cde");
|
||||||
str::match("abcdefg", "cde");
|
str::match("abcdefg", "cde");
|
||||||
str::match("abcdefgdefx", "def", 7);
|
str::match("abcdefgdefx", "def", 7);
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user