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