enhanced qse_mbsxsubst() and qse_wcsxsubst() for buffer size prediction
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user