enhanced qse_mbsxsubst() and qse_wcsxsubst() for buffer size prediction

This commit is contained in:
2013-09-09 05:47:54 +00:00
parent 88266f1b2e
commit 04e6df3dd8
3 changed files with 108 additions and 6 deletions

View File

@ -25,6 +25,7 @@
#undef char_t
#undef cstr_t
#undef T
#undef NOBUF
#undef strlen
#undef scan_dollar
#undef expand_dollar
@ -35,6 +36,7 @@
#define char_t qse_mchar_t
#define cstr_t qse_mcstr_t
#define T(x) QSE_MT(x)
#define NOBUF QSE_MBSSUBST_NOBUF
#define strlen qse_mbslen
#define scan_dollar mbs_scan_dollar
#define expand_dollar mbs_expand_dollar
@ -48,6 +50,7 @@
#undef char_t
#undef cstr_t
#undef T
#undef NOBUF
#undef strlen
#undef scan_dollar
#undef expand_dollar
@ -58,6 +61,7 @@
#define char_t qse_wchar_t
#define cstr_t qse_wcstr_t
#define T(x) QSE_WT(x)
#define NOBUF QSE_WCSSUBST_NOBUF
#define strlen qse_wcslen
#define scan_dollar wcs_scan_dollar
#define expand_dollar wcs_expand_dollar

View File

@ -122,7 +122,7 @@ qse_size_t strxnsubst (
const char_t* f = fmt;
const char_t* fend = fmt + fsz;
if (bsz <= 0) return 0;
if (buf != NOBUF && bsz <= 0) return 0;
while (f < fend)
{
@ -144,8 +144,18 @@ qse_size_t strxnsubst (
if (tmp == QSE_NULL || ident.len <= 0) goto normal;
f = tmp;
b = expand_dollar (b, end - b + 1, &ident, &dfl, subst, ctx);
if (b >= end) goto fini;
if (buf != NOBUF)
{
b = expand_dollar (b, end - b + 1, &ident, &dfl, subst, ctx);
if (b >= end) goto fini;
}
else
{
/* the buffer points to NOBUF. */
tmp = expand_dollar (buf, bsz, &ident, &dfl, subst, ctx);
/* increment b by the length of the expanded string */
b += (tmp - buf);
}
continue;
}
@ -157,12 +167,16 @@ qse_size_t strxnsubst (
}
normal:
if (b >= end) break;
*b++ = *f++;
if (buf != NOBUF)
{
if (b >= end) break;
*b = *f;
}
b++; f++;
}
fini:
*b = T('\0');
if (buf != NOBUF) *b = T('\0');
return b - buf;
}
@ -172,3 +186,4 @@ qse_size_t strxsubst (
{
return strxnsubst (buf, bsz, fmt, strlen(fmt), subst, ctx);
}