added qse_str_ncatwcs()/qse_str_ncatmbs()

This commit is contained in:
2019-04-17 16:33:30 +00:00
parent f16437d7c0
commit f90ca01493
5 changed files with 129 additions and 24 deletions

View File

@ -71,14 +71,14 @@ static int wcs_to_mbs (
const qse_wchar_t* wcs, qse_size_t* wcslen,
qse_mchar_t* mbs, qse_size_t* mbslen, void* ctx)
{
return qse_wcsntombsnwithcmgr (wcs, wcslen, mbs, mbslen, qse_getdflcmgr());
return qse_wcsntombsnwithcmgr(wcs, wcslen, mbs, mbslen, qse_getdflcmgr());
}
static int mbs_to_wcs (
const qse_mchar_t* mbs, qse_size_t* mbslen,
qse_wchar_t* wcs, qse_size_t* wcslen, void* ctx)
{
return qse_mbsntowcsnwithcmgr (mbs, mbslen, wcs, wcslen, qse_getdflcmgr());
return qse_mbsntowcsnwithcmgr(mbs, mbslen, wcs, wcslen, qse_getdflcmgr());
}
/* -------------------------------------------------------- */
@ -278,3 +278,42 @@ static int mbs_to_wcs (
#define str_fcat qse_wcs_fcat
#define str_vfcat qse_wcs_vfcat
#include "str-dyn.h"
qse_size_t qse_mbs_ncatwcs (qse_mbs_t* str, const qse_wchar_t* s, qse_size_t len)
{
qse_size_t mbslen, wcslen;
qse_cmgr_t* cmgr = qse_getdflcmgr();
wcslen = len;
if (qse_wcsntombsnwithcmgr(s, &wcslen, QSE_NULL, &mbslen, cmgr) <= -1) return (qse_size_t)-1;
if (resize_for_mbs_ncat(str, mbslen) <= 0) return -1;
wcslen = len;
mbslen = str->capa - str->val.len;
qse_wcsntombsnwithcmgr(s, &wcslen, &str->val.ptr[str->val.len], &mbslen, cmgr);
str->val.len += mbslen;
str->val.ptr[str->val.len] = QSE_MT('\0');
return str->val.len;
}
qse_size_t qse_wcs_ncatmbs (qse_wcs_t* str, const qse_mchar_t* s, qse_size_t len)
{
qse_size_t mbslen, wcslen;
qse_cmgr_t* cmgr = qse_getdflcmgr();
mbslen = len;
if (qse_mbsntowcsnallwithcmgr(s, &mbslen, QSE_NULL, &wcslen, cmgr) <= -1) return (qse_size_t)-1;
if (resize_for_wcs_ncat(str, wcslen) <= 0) return -1;
mbslen = len;
wcslen = str->capa - str->val.len;
qse_mbsntowcsnallwithcmgr(s, &mbslen, &str->val.ptr[str->val.len], &wcslen, cmgr);
str->val.len += wcslen;
str->val.ptr[str->val.len] = QSE_WT('\0');
return str->val.len;
}

View File

@ -300,7 +300,7 @@ static int resize_for_ncat (str_t* str, qse_size_t len)
{
/* let the user determine the new capacity.
* pass the minimum capacity required as a hint */
ncapa = str->sizer (str, mincapa);
ncapa = str->sizer(str, mincapa);
/* if no change in capacity, return current length */
if (ncapa == str->capa) return 0;
}
@ -308,7 +308,7 @@ static int resize_for_ncat (str_t* str, qse_size_t len)
/* change the capacity */
do
{
if (str_setcapa (str, ncapa) != (qse_size_t)-1) break;
if (str_setcapa(str, ncapa) != (qse_size_t)-1) break;
if (ncapa <= mincapa) return -1;
ncapa--;
}
@ -318,7 +318,7 @@ static int resize_for_ncat (str_t* str, qse_size_t len)
{
QSE_ASSERT (str->val.ptr == QSE_NULL);
QSE_ASSERT (str->val.len <= 0);
if (str_setcapa (str, 1) == (qse_size_t)-1) return -1;
if (str_setcapa(str, 1) == (qse_size_t)-1) return -1;
}
return 1;
@ -329,7 +329,7 @@ qse_size_t str_ncat (str_t* str, const char_t* s, qse_size_t len)
int n;
qse_size_t i, j;
n = resize_for_ncat (str, len);
n = resize_for_ncat(str, len);
if (n <= -1) return (qse_size_t)-1;
if (n == 0) return str->val.len;
@ -357,13 +357,13 @@ qse_size_t str_nrcat (str_t* str, const char_t* s, qse_size_t len)
int n;
qse_size_t i, j;
n = resize_for_ncat (str, len);
n = resize_for_ncat(str, len);
if (n <= -1) return (qse_size_t)-1;
if (n == 0) return str->val.len;
if (len > str->capa - str->val.len) len = str->capa - str->val.len;
for (i = len, j = str->val.len ; i > 0; j++) str->val.ptr[j] = s[--i];
for (i = len, j = str->val.len ; i > 0; j++) str->val.ptr[j] = s[--i];
str->val.ptr[j] = T('\0');
str->val.len = j;
@ -483,7 +483,7 @@ qse_size_t str_vfcat (str_t* str, const char_t* fmt, va_list ap)
str->val.len = old_len;
/* resizing is required */
x = resize_for_ncat (str, fo.count);
x = resize_for_ncat(str, fo.count);
if (x <= -1) return (qse_size_t)-1;
if (x >= 1)
@ -524,7 +524,7 @@ qse_size_t str_vfmt (str_t* str, const char_t* fmt, va_list ap)
if (fmtout (fmt, &fo, ap) <= -1) return (qse_size_t)-1;
str_clear (str);
x = resize_for_ncat (str, fo.count);
x = resize_for_ncat(str, fo.count);
if (x <= -1) return (qse_size_t)-1;
if (x >= 1)