diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index b71828b5..a77244eb 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -2846,25 +2846,41 @@ QSE_EXPORT int qse_awk_rtx_valtostr ( * \return character pointer to a string converted on success, * #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 */ 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_awk_rtx_t* rtx, /**< runtime context */ 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_awk_rtx_t* rtx, /**< runtime context */ 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 * 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 * 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 */ 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 * to by \a str if \a val is not of the #QSE_AWK_VAL_STR type. @@ -2899,7 +2918,7 @@ QSE_EXPORT qse_mchar_t* qse_awk_rtx_getvalmbswithcmgr ( qse_cmgr_t* cmgr ); -#define qse_awk_rtx_getvalmbs(rtx,val,len) qse_awk_rtx_getvalmbswithcmgr(rtx, val, len, qse_awk_rtx_getcmgr(rtx)) +#define qse_awk_rtx_getvalmbs(rtx, val, len) qse_awk_rtx_getvalmbswithcmgr(rtx, val, len, qse_awk_rtx_getcmgr(rtx)) QSE_EXPORT void qse_awk_rtx_freevalmbs ( qse_awk_rtx_t* rtx, /**< runtime context */ diff --git a/qse/lib/awk/mod-str.c b/qse/lib/awk/mod-str.c index 7599bf9d..58375551 100644 --- a/qse/lib/awk/mod-str.c +++ b/qse/lib/awk/mod-str.c @@ -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) { - /* 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_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_cstr_t enc; + a1 = qse_awk_rtx_getarg(rtx, 1); enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len); 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); if (!cmgr) @@ -391,7 +399,7 @@ static int fnc_frommbs (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) default: { 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; r = qse_awk_rtx_makestrvalwithxstr(rtx, &str); 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) { - /* 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_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); enc.ptr = qse_awk_rtx_getvalstr(rtx, a1, &enc.len); 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); if (!cmgr) @@ -490,7 +506,7 @@ static int fnc_tonum (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_awk_int_t base; if (qse_awk_rtx_valtoint(rtx, a1, &base) <= -1) return -1; - rx = qse_awk_rtx_strtonum ( + rx = qse_awk_rtx_strtonum( rtx, QSE_AWK_RTX_STRTONUM_MAKE_OPTION(0, base), ((qse_awk_val_str_t*)a0)->val.ptr, diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index 3af99376..759b8d5a 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -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; } -qse_char_t* qse_awk_rtx_valtostrdup (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len) -{ - 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* qse_awk_rtx_valtombsdupwithcmgr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, qse_size_t* len, qse_cmgr_t* cmgr) { 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); len1 = len0; #else - mbs = qse_wcsntombsdupwithcmgr(str0, len0, &len1, rtx->awk->mmgr, rtx->awk->cmgr); + mbs = qse_wcsntombsdupwithcmgr(str0, len0, &len1, rtx->awk->mmgr, cmgr); #endif qse_awk_rtx_freevalstr (rtx, v, str0); 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; } -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_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; 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) { 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) qse_size_t wcslen, mbslen; 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 wcs = qse_strxdup(((qse_awk_val_str_t*)v)->val.ptr, ((qse_awk_val_str_t*)v)->val.len, rtx->awk->mmgr); #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); 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); 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; } -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) { @@ -1630,7 +1619,7 @@ qse_char_t* qse_awk_rtx_getvalstr (qse_awk_rtx_t* rtx, const qse_awk_val_t* v, q } 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) { 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 { - return qse_awk_rtx_valtombsdup(rtx, v, len); /* TODO: */ + return qse_awk_rtx_valtombsdupwithcmgr(rtx, v, len, cmgr); } }