added qse_awk_rtx_valtostrdupwithcmgr()/qse_awk_rtx_getvalstrwithcmgr()
enhanced str::frommbs()/str::tombs() to support the encoding name as the second parameter
This commit is contained in:
parent
a04c9b6125
commit
00d0dc786f
@ -2846,25 +2846,41 @@ QSE_EXPORT int qse_awk_rtx_valtostr (
|
|||||||
* \return character pointer to a string converted on success,
|
* \return character pointer to a string converted on success,
|
||||||
* #QSE_NULL on failure
|
* #QSE_NULL on failure
|
||||||
*/
|
*/
|
||||||
QSE_EXPORT qse_char_t* qse_awk_rtx_valtostrdup (
|
#if 0
|
||||||
|
QSE_EXPORT qse_char_t* qse_awk_rtx_valtostrdupwithcmgr (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
|
qse_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
QSE_EXPORT qse_mchar_t* qse_awk_rtx_valtombsdup (
|
QSE_EXPORT qse_mchar_t* qse_awk_rtx_valtombsdup (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
|
qse_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup (
|
QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
|
qse_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#define qse_awk_rtx_valtombsdup(rtx, val, len) qse_awk_rtx_valtombsdupwithcmgr(rtx, val, len, qse_awk_rtx_getcmgr(rtx))
|
||||||
|
#define qse_awk_rtx_valtowcsdup(rtx, val, len) qse_awk_rtx_valtowcsdupwithcmgr(rtx, val, len, qse_awk_rtx_getcmgr(rtx))
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
# define qse_awk_rtx_valtostrdupwithcmgr(rtx, val, len, cmgr) qse_awk_rtx_valtombsdup(rtx, val, len, cmgr)
|
||||||
|
# define qse_awk_rtx_valtostrdup(rtx, val, len) qse_awk_rtx_valtombsdup(rtx, val, len)
|
||||||
|
#else
|
||||||
|
# define qse_awk_rtx_valtostrdupwithcmgr(rtx, val, len, cmgr) qse_awk_rtx_valtowcsdupwithcmgr(rtx, val, len, cmgr)
|
||||||
|
# define qse_awk_rtx_valtostrdup(rtx, val, len) qse_awk_rtx_valtowcsdup(rtx, val, len)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_getvalstr() function returns a string
|
* The qse_awk_rtx_getvalstr() function returns a string
|
||||||
* pointer converted from a value \a val. If the value
|
* pointer converted from a value \a val. If the value
|
||||||
@ -2873,12 +2889,15 @@ QSE_EXPORT qse_wchar_t* qse_awk_rtx_valtowcsdup (
|
|||||||
* qse_awk_rtx_valtostrdup(). The length of the returned
|
* qse_awk_rtx_valtostrdup(). The length of the returned
|
||||||
* string is stored into the location pointed to by \a len.
|
* string is stored into the location pointed to by \a len.
|
||||||
*/
|
*/
|
||||||
QSE_EXPORT qse_char_t* qse_awk_rtx_getvalstr (
|
QSE_EXPORT qse_char_t* qse_awk_rtx_getvalstrwithcmgr (
|
||||||
qse_awk_rtx_t* rtx, /**< runtime context */
|
qse_awk_rtx_t* rtx, /**< runtime context */
|
||||||
const qse_awk_val_t* val, /**< value to convert */
|
const qse_awk_val_t* val, /**< value to convert */
|
||||||
qse_size_t* len /**< result length */
|
qse_size_t* len, /**< result length */
|
||||||
|
qse_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#define qse_awk_rtx_getvalstr(rtx,val,len) qse_awk_rtx_getvalstrwithcmgr(rtx, val, len, qse_awk_rtx_getcmgr(rtx))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_rtx_freevalstr() function frees the memory pointed
|
* The qse_awk_rtx_freevalstr() function frees the memory pointed
|
||||||
* to by \a str if \a val is not of the #QSE_AWK_VAL_STR type.
|
* to by \a str if \a val is not of the #QSE_AWK_VAL_STR type.
|
||||||
|
@ -358,7 +358,12 @@ static int fnc_tocharcode (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
|
|
||||||
static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
/* str::frommbs(B"byte-string" [, "encoding-name"]) */
|
/* str::frommbs(B"byte-string" [, "encoding-name"])
|
||||||
|
*
|
||||||
|
* if you use a supported encoding name, it may look like this:
|
||||||
|
* a = str::frommbs(B"\xC7\xD1\xB1\xDB", "cp949");
|
||||||
|
* printf ("%K\n", a);
|
||||||
|
*/
|
||||||
qse_awk_val_t* a0, * r;
|
qse_awk_val_t* a0, * r;
|
||||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgr(rtx);
|
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgr(rtx);
|
||||||
|
|
||||||
@ -367,10 +372,13 @@ static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
qse_awk_val_t* a1;
|
qse_awk_val_t* a1;
|
||||||
qse_cstr_t enc;
|
qse_cstr_t enc;
|
||||||
|
|
||||||
|
|
||||||
a1 = qse_awk_rtx_getarg(rtx, 1);
|
a1 = qse_awk_rtx_getarg(rtx, 1);
|
||||||
enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len);
|
enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len);
|
||||||
if (!enc.ptr) return -1;
|
if (!enc.ptr) return -1;
|
||||||
cmgr = (enc.len == qse_strlen(enc.ptr))? qse_findcmgr(enc.ptr): QSE_NULL;
|
/* if encoding name is an empty string, qse_Findcmgr() returns the default cmgr.
|
||||||
|
* i don't want that behavior. */
|
||||||
|
cmgr = (enc.len > 0 && enc.len == qse_strlen(enc.ptr))? qse_findcmgr(enc.ptr): QSE_NULL;
|
||||||
qse_awk_rtx_freevalstr (rtx, a1, enc.ptr);
|
qse_awk_rtx_freevalstr (rtx, a1, enc.ptr);
|
||||||
|
|
||||||
if (!cmgr)
|
if (!cmgr)
|
||||||
@ -391,7 +399,7 @@ static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
qse_cstr_t str;
|
qse_cstr_t str;
|
||||||
str.ptr = qse_awk_rtx_getvalstr(rtx, a0, &str.len);
|
str.ptr = qse_awk_rtx_getvalstrwithcmgr(rtx, a0, &str.len, cmgr);
|
||||||
if (!str.ptr) return -1;
|
if (!str.ptr) return -1;
|
||||||
r = qse_awk_rtx_makestrvalwithxstr(rtx, &str);
|
r = qse_awk_rtx_makestrvalwithxstr(rtx, &str);
|
||||||
qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
|
qse_awk_rtx_freevalstr (rtx, a0, str.ptr);
|
||||||
@ -407,7 +415,13 @@ done:
|
|||||||
|
|
||||||
static int fnc_tombs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
static int fnc_tombs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||||
{
|
{
|
||||||
/* str::tombs("string", [, "encoding-name"]) */
|
/* str::tombs("string", [, "encoding-name"])
|
||||||
|
*
|
||||||
|
* if you use a supported encoding name, it may look like this:
|
||||||
|
* a = str::tombs("\uD55C\uAE00", "cp949");
|
||||||
|
* printf (B"%K\n", a);
|
||||||
|
*/
|
||||||
|
|
||||||
qse_awk_val_t* a0, * r;
|
qse_awk_val_t* a0, * r;
|
||||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgr(rtx);
|
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgr(rtx);
|
||||||
|
|
||||||
@ -418,7 +432,9 @@ static int fnc_tombs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
|||||||
a1 = qse_awk_rtx_getarg(rtx, 1);
|
a1 = qse_awk_rtx_getarg(rtx, 1);
|
||||||
enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len);
|
enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len);
|
||||||
if (!enc.ptr) return -1;
|
if (!enc.ptr) return -1;
|
||||||
cmgr = (enc.len == qse_strlen(enc.ptr))? qse_findcmgr(enc.ptr): QSE_NULL;
|
/* if encoding name is an empty string, qse_Findcmgr() returns the default cmgr.
|
||||||
|
* i don't want that behavior. */
|
||||||
|
cmgr = (enc.len > 0 && enc.len == qse_strlen(enc.ptr))? qse_findcmgr(enc.ptr): QSE_NULL;
|
||||||
qse_awk_rtx_freevalstr (rtx, a1, enc.ptr);
|
qse_awk_rtx_freevalstr (rtx, a1, enc.ptr);
|
||||||
|
|
||||||
if (!cmgr)
|
if (!cmgr)
|
||||||
|
@ -1492,18 +1492,7 @@ int qse_awk_rtx_valtostr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_awk_rt
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_char_t* qse_awk_rtx_valtostrdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
|
qse_mchar_t* qse_awk_rtx_valtombsdupwithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr)
|
||||||
{
|
|
||||||
qse_awk_rtx_valtostr_out_t out;
|
|
||||||
|
|
||||||
out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP;
|
|
||||||
if (qse_awk_rtx_valtostr(rtx, v, &out) <= -1) return QSE_NULL;
|
|
||||||
|
|
||||||
if (len) *len = out.u.cpldup.len;
|
|
||||||
return out.u.cpldup.ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
qse_mchar_t* qse_awk_rtx_valtombsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
|
|
||||||
{
|
{
|
||||||
qse_mchar_t* mbs;
|
qse_mchar_t* mbs;
|
||||||
|
|
||||||
@ -1530,7 +1519,7 @@ qse_mchar_t* qse_awk_rtx_valtombsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
mbs = qse_strxdup(str0, len0, rtx->awk->mmgr);
|
mbs = qse_strxdup(str0, len0, rtx->awk->mmgr);
|
||||||
len1 = len0;
|
len1 = len0;
|
||||||
#else
|
#else
|
||||||
mbs = qse_wcsntombsdupwithcmgr(str0, len0, &len1, rtx->awk->mmgr, rtx->awk->cmgr);
|
mbs = qse_wcsntombsdupwithcmgr(str0, len0, &len1, rtx->awk->mmgr, cmgr);
|
||||||
#endif
|
#endif
|
||||||
qse_awk_rtx_freevalstr (rtx, v, str0);
|
qse_awk_rtx_freevalstr (rtx, v, str0);
|
||||||
if (!mbs)
|
if (!mbs)
|
||||||
@ -1544,7 +1533,7 @@ qse_mchar_t* qse_awk_rtx_valtombsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
return mbs;
|
return mbs;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_wchar_t* qse_awk_rtx_valtowcsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
|
qse_wchar_t* qse_awk_rtx_valtowcsdupwithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
qse_wchar_t* wcs;
|
qse_wchar_t* wcs;
|
||||||
qse_awk_val_type_t vtype;
|
qse_awk_val_type_t vtype;
|
||||||
@ -1557,7 +1546,7 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
{
|
{
|
||||||
qse_size_t mbslen, wcslen;
|
qse_size_t mbslen, wcslen;
|
||||||
mbslen = ((qse_awk_val_mbs_t*)v)->val.len;
|
mbslen = ((qse_awk_val_mbs_t*)v)->val.len;
|
||||||
wcs = qse_mbsntowcsalldupwithcmgr(((qse_awk_val_mbs_t*)v)->val.ptr, &mbslen, &wcslen, rtx->awk->mmgr, rtx->awk->cmgr);
|
wcs = qse_mbsntowcsalldupwithcmgr(((qse_awk_val_mbs_t*)v)->val.ptr, &mbslen, &wcslen, rtx->awk->mmgr, cmgr);
|
||||||
if (!wcs)
|
if (!wcs)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterror (rtx, QSE_AWK_ENOMEM, QSE_NULL, QSE_NULL);
|
qse_awk_rtx_seterror (rtx, QSE_AWK_ENOMEM, QSE_NULL, QSE_NULL);
|
||||||
@ -1573,7 +1562,7 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
qse_size_t wcslen, mbslen;
|
qse_size_t wcslen, mbslen;
|
||||||
mbslen = ((qse_awk_val_str_t*)v)->val.len;
|
mbslen = ((qse_awk_val_str_t*)v)->val.len;
|
||||||
wcs = qse_mbsntowcsalldupwithcmgr(((qse_awk_val_str_t*)v)->val.ptr, &mbslen, &wcslen, rtx->awk->mmgr, rtx->awk->cmgr);
|
wcs = qse_mbsntowcsalldupwithcmgr(((qse_awk_val_str_t*)v)->val.ptr, &mbslen, &wcslen, rtx->awk->mmgr, cmgr);
|
||||||
#else
|
#else
|
||||||
wcs = qse_strxdup(((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len, rtx->awk->mmgr);
|
wcs = qse_strxdup(((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len, rtx->awk->mmgr);
|
||||||
#endif
|
#endif
|
||||||
@ -1600,7 +1589,7 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
dup = qse_awk_rtx_valtostrdup(rtx, v, &duplen);
|
dup = qse_awk_rtx_valtostrdup(rtx, v, &duplen);
|
||||||
if (!dup) return QSE_NULL;
|
if (!dup) return QSE_NULL;
|
||||||
|
|
||||||
wcs = qse_mbsntowcsalldupwithcmgr(dup, &duplen, &wcslen, rtx->awk->mmgr, rtx->awk->cmgr);
|
wcs = qse_mbsntowcsalldupwithcmgr(dup, &duplen, &wcslen, rtx->awk->mmgr, cmgr);
|
||||||
qse_awk_rtx_freemem (rtx, dup);
|
qse_awk_rtx_freemem (rtx, dup);
|
||||||
if (!wcs)
|
if (!wcs)
|
||||||
{
|
{
|
||||||
@ -1621,7 +1610,7 @@ qse_wchar_t* qse_awk_rtx_valtowcsdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v
|
|||||||
return wcs;
|
return wcs;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_char_t* qse_awk_rtx_getvalstr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
|
qse_char_t* qse_awk_rtx_getvalstrwithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
if (QSE_AWK_RTX_GETVALTYPE(rtx, v) == QSE_AWK_VAL_STR)
|
if (QSE_AWK_RTX_GETVALTYPE(rtx, v) == QSE_AWK_VAL_STR)
|
||||||
{
|
{
|
||||||
@ -1630,7 +1619,7 @@ qse_char_t* qse_awk_rtx_getvalstr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, q
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return qse_awk_rtx_valtostrdup(rtx, v, len);
|
return qse_awk_rtx_valtostrdupwithcmgr(rtx, v, len, cmgr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1643,22 +1632,6 @@ void qse_awk_rtx_freevalstr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_cha
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
qse_mchar_t* qse_awk_rtx_getvalmbs (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len)
|
|
||||||
{
|
|
||||||
if (QSE_AWK_RTX_GETVALTYPE(rtx, v) == QSE_AWK_VAL_MBS)
|
|
||||||
{
|
|
||||||
if (len) *len = ((qse_awk_val_mbs_t*)v)->val.len;
|
|
||||||
return ((qse_awk_val_mbs_t*)v)->val.ptr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return qse_awk_rtx_valtombsdup(rtx, v, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
qse_mchar_t* qse_awk_rtx_getvalmbswithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr)
|
qse_mchar_t* qse_awk_rtx_getvalmbswithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
if (QSE_AWK_RTX_GETVALTYPE(rtx, v) == QSE_AWK_VAL_MBS)
|
if (QSE_AWK_RTX_GETVALTYPE(rtx, v) == QSE_AWK_VAL_MBS)
|
||||||
@ -1668,7 +1641,7 @@ qse_mchar_t* qse_awk_rtx_getvalmbswithcmgr (qse_awk_rtx_t* rtx, const qse_awk_va
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return qse_awk_rtx_valtombsdup(rtx, v, len); /* TODO: */
|
return qse_awk_rtx_valtombsdupwithcmgr(rtx, v, len, cmgr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user