renamed str::value() to str::fromcharcode() in awk.
added str::tocharcode() in awk. enhanced qse_awk_rtx_makestrvalwithxstr() to skip copying the data from the given string pointer if it's null
This commit is contained in:
parent
51853507fa
commit
c3e30eaae4
@ -243,15 +243,58 @@ static int fnc_isxdigit (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
return is_class(rtx, QSE_CTYPE_XDIGIT);
|
return is_class(rtx, QSE_CTYPE_XDIGIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fnc_value (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_fromcharcode (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
/* return the numeric value for the first character.
|
/* create a string from a series of charcter codes */
|
||||||
* you can use sprintf("%c", num_val) for reverse conversion. */
|
|
||||||
|
qse_awk_val_t* retv;
|
||||||
|
qse_size_t nargs, i;
|
||||||
|
qse_chau_t* ptr0; /* to guarantee the unsigned code conversion */
|
||||||
|
|
||||||
|
nargs = qse_awk_rtx_getnargs(rtx);
|
||||||
|
|
||||||
|
retv = qse_awk_rtx_makestrval(rtx, QSE_NULL, nargs);
|
||||||
|
if (!retv) return -1;
|
||||||
|
|
||||||
|
ptr0 = (qse_chau_t*)((qse_awk_val_str_t*)retv)->val.ptr;
|
||||||
|
|
||||||
|
for (i = 0; i < nargs; i++)
|
||||||
|
{
|
||||||
|
qse_awk_val_t* a0;
|
||||||
|
qse_awk_int_t cc;
|
||||||
|
|
||||||
|
a0 = qse_awk_rtx_getarg(rtx, i);
|
||||||
|
if (qse_awk_rtx_valtoint(rtx, a0, &cc) <= -1)
|
||||||
|
{
|
||||||
|
qse_awk_rtx_freeval (rtx, retv, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr0[i] = cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_awk_rtx_setretval (rtx, retv);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fnc_tocharcode (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
|
{
|
||||||
|
/* return the numeric value for the first character or the character of the given position.
|
||||||
|
* you can use sprintf("%c", num_val) or str::fromcharcode(num_val) for reverse conversion. */
|
||||||
qse_awk_val_t* retv;
|
qse_awk_val_t* retv;
|
||||||
qse_awk_val_t* a0;
|
qse_awk_val_t* a0;
|
||||||
qse_awk_int_t iv = -1;
|
qse_awk_int_t iv = -1;
|
||||||
|
qse_awk_int_t pos = 0;
|
||||||
|
|
||||||
a0 = qse_awk_rtx_getarg(rtx, 0);
|
a0 = qse_awk_rtx_getarg(rtx, 0);
|
||||||
|
if (qse_awk_rtx_getnargs(rtx) >= 2)
|
||||||
|
{
|
||||||
|
/* optional index. must be between 1 and the string length inclusive */
|
||||||
|
qse_awk_val_t* a1;
|
||||||
|
a1 = qse_awk_rtx_getarg(rtx, 1);
|
||||||
|
if (qse_awk_rtx_valtoint(rtx, a1, &pos) <= -1) return -1;
|
||||||
|
pos--; /* 1 based indexing. range check to be done before accessing below */
|
||||||
|
}
|
||||||
|
|
||||||
if (QSE_AWK_RTX_GETVALTYPE(rtx, a0) == QSE_AWK_VAL_MBS)
|
if (QSE_AWK_RTX_GETVALTYPE(rtx, a0) == QSE_AWK_VAL_MBS)
|
||||||
{
|
{
|
||||||
@ -261,13 +304,13 @@ static int fnc_value (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
str0 = ((qse_awk_val_mbs_t*)a0)->val.ptr;
|
str0 = ((qse_awk_val_mbs_t*)a0)->val.ptr;
|
||||||
len0 = ((qse_awk_val_mbs_t*)a0)->val.len;
|
len0 = ((qse_awk_val_mbs_t*)a0)->val.len;
|
||||||
|
|
||||||
if (len0 >= 1)
|
if (pos >= 0 && pos < len0)
|
||||||
{
|
{
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
/* typecasting in case qse_mchar_t is signed */
|
/* typecasting in case qse_mchar_t is signed */
|
||||||
iv = (unsigned char)str0[0];
|
iv = (unsigned char)str0[pos];
|
||||||
#else
|
#else
|
||||||
iv = str0[0];
|
iv = str0[pos];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -279,13 +322,13 @@ static int fnc_value (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
str0 = qse_awk_rtx_getvalstr(rtx, a0, &len0);
|
str0 = qse_awk_rtx_getvalstr(rtx, a0, &len0);
|
||||||
if (!str0) return -1;
|
if (!str0) return -1;
|
||||||
|
|
||||||
if (len0 >= 1)
|
if (pos >= 0 && pos < len0)
|
||||||
{
|
{
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
/* typecasting in case qse_mchar_t is signed */
|
/* typecasting in case qse_mchar_t is signed */
|
||||||
iv = (unsigned char)str0[0];
|
iv = (unsigned char)str0[pos];
|
||||||
#else
|
#else
|
||||||
iv = str0[0];
|
iv = str0[pos];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,6 +426,7 @@ struct fnctab_t
|
|||||||
static fnctab_t fnctab[] =
|
static fnctab_t fnctab[] =
|
||||||
{
|
{
|
||||||
/* keep this table sorted for binary search in query(). */
|
/* keep this table sorted for binary search in query(). */
|
||||||
|
{ QSE_T("fromcharcode"), { { 0, A_MAX, QSE_NULL }, fnc_fromcharcode, 0 } },
|
||||||
{ QSE_T("gsub"), { { 2, 3, QSE_T("xvr")}, qse_awk_fnc_gsub, 0 } },
|
{ QSE_T("gsub"), { { 2, 3, QSE_T("xvr")}, qse_awk_fnc_gsub, 0 } },
|
||||||
{ QSE_T("index"), { { 2, 3, QSE_NULL }, qse_awk_fnc_index, 0 } },
|
{ QSE_T("index"), { { 2, 3, QSE_NULL }, qse_awk_fnc_index, 0 } },
|
||||||
{ QSE_T("isalnum"), { { 1, 1, QSE_NULL }, fnc_isalnum, 0 } },
|
{ QSE_T("isalnum"), { { 1, 1, QSE_NULL }, fnc_isalnum, 0 } },
|
||||||
@ -407,11 +451,12 @@ static fnctab_t fnctab[] =
|
|||||||
{ QSE_T("split"), { { 2, 3, QSE_T("vrx") }, qse_awk_fnc_split, 0 } },
|
{ QSE_T("split"), { { 2, 3, QSE_T("vrx") }, qse_awk_fnc_split, 0 } },
|
||||||
{ QSE_T("sub"), { { 2, 3, QSE_T("xvr") }, qse_awk_fnc_sub, 0 } },
|
{ QSE_T("sub"), { { 2, 3, QSE_T("xvr") }, qse_awk_fnc_sub, 0 } },
|
||||||
{ QSE_T("substr"), { { 2, 3, QSE_NULL }, qse_awk_fnc_substr, 0 } },
|
{ QSE_T("substr"), { { 2, 3, QSE_NULL }, qse_awk_fnc_substr, 0 } },
|
||||||
|
{ QSE_T("tocharcode"), { { 1, 2, QSE_NULL }, fnc_tocharcode, 0 } },
|
||||||
{ QSE_T("tolower"), { { 1, 1, QSE_NULL }, qse_awk_fnc_tolower, 0 } },
|
{ QSE_T("tolower"), { { 1, 1, QSE_NULL }, qse_awk_fnc_tolower, 0 } },
|
||||||
{ QSE_T("tonum"), { { 1, 2, QSE_NULL }, fnc_tonum, 0 } },
|
{ QSE_T("tonum"), { { 1, 2, QSE_NULL }, fnc_tonum, 0 } },
|
||||||
{ QSE_T("toupper"), { { 1, 1, QSE_NULL }, qse_awk_fnc_toupper, 0 } },
|
{ QSE_T("toupper"), { { 1, 1, QSE_NULL }, qse_awk_fnc_toupper, 0 } },
|
||||||
{ QSE_T("trim"), { { 1, 1, QSE_NULL }, fnc_trim, 0 } },
|
{ QSE_T("trim"), { { 1, 1, QSE_NULL }, fnc_trim, 0 } }
|
||||||
{ QSE_T("value"), { { 1, 1, QSE_NULL }, fnc_value, 0 } }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym)
|
static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym)
|
||||||
|
@ -193,7 +193,7 @@ init:
|
|||||||
val->nstr = 0;
|
val->nstr = 0;
|
||||||
val->val.len = str->len;
|
val->val.len = str->len;
|
||||||
val->val.ptr = (qse_char_t*)(val + 1);
|
val->val.ptr = (qse_char_t*)(val + 1);
|
||||||
qse_strncpy (val->val.ptr, str->ptr, str->len);
|
if (str->ptr) qse_strncpy (val->val.ptr, str->ptr, str->len);
|
||||||
|
|
||||||
#ifdef DEBUG_VAL
|
#ifdef DEBUG_VAL
|
||||||
qse_errputstrf (QSE_T("makestrval => %p\n"), val);
|
qse_errputstrf (QSE_T("makestrval => %p\n"), val);
|
||||||
@ -388,7 +388,7 @@ qse_awk_val_t* qse_awk_rtx_makembsval (qse_awk_rtx_t* rtx, const qse_mchar_t* pt
|
|||||||
val->nstr = 0;
|
val->nstr = 0;
|
||||||
val->val.len = len;
|
val->val.len = len;
|
||||||
val->val.ptr = (qse_mchar_t*)(val + 1);
|
val->val.ptr = (qse_mchar_t*)(val + 1);
|
||||||
QSE_MEMCPY (val->val.ptr, ptr, xsz);
|
if (ptr) QSE_MEMCPY (val->val.ptr, ptr, xsz);
|
||||||
val->val.ptr[len] = QSE_MT('\0');
|
val->val.ptr[len] = QSE_MT('\0');
|
||||||
|
|
||||||
return (qse_awk_val_t*)val;
|
return (qse_awk_val_t*)val;
|
||||||
|
Loading…
Reference in New Issue
Block a user