enhanced qse_str_fmt()
This commit is contained in:
@ -426,13 +426,52 @@ qse_size_t str_pac (str_t* str)
|
||||
}
|
||||
|
||||
|
||||
qse_size_t str_fmt (str_t* str, const char_t* fmt, ...)
|
||||
|
||||
qse_size_t str_vfcat (str_t* str, const char_t* fmt, va_list ap)
|
||||
{
|
||||
return (qse_size_t)-1;
|
||||
va_list orgap;
|
||||
fmtout_t fo;
|
||||
int x;
|
||||
qse_size_t old_len;
|
||||
|
||||
old_len = str->val.len;
|
||||
|
||||
fo.limit = QSE_TYPE_MAX(qse_size_t) - 1;
|
||||
fo.ctx = str;
|
||||
fo.put = str->val.ptr? put_char_check: put_char_null;
|
||||
fo.conv = conv_char;
|
||||
|
||||
va_copy (orgap, ap);
|
||||
x = fmtout (fmt, &fo, ap);
|
||||
|
||||
if (x <= -1)
|
||||
{
|
||||
str->val.len = old_len;
|
||||
return (qse_size_t)-1;
|
||||
}
|
||||
|
||||
if (str->val.ptr == QSE_NULL || str->val.len - old_len < fo.count)
|
||||
{
|
||||
str->val.len = old_len;
|
||||
|
||||
/* resizing is required */
|
||||
x = resize_for_ncat (str, fo.count);
|
||||
|
||||
if (x <= -1) return (qse_size_t)-1;
|
||||
if (x >= 1)
|
||||
{
|
||||
fo.put = put_char_nocheck;
|
||||
x = fmtout (fmt, &fo, orgap);
|
||||
}
|
||||
}
|
||||
|
||||
str->val.ptr[str->val.len] = T('\0');
|
||||
return str->val.len;
|
||||
}
|
||||
|
||||
qse_size_t str_fcat (str_t* str, const char_t* fmt, ...)
|
||||
{
|
||||
#if 0
|
||||
va_list ap;
|
||||
fmtout_t fo;
|
||||
int x;
|
||||
@ -475,4 +514,53 @@ qse_size_t str_fcat (str_t* str, const char_t* fmt, ...)
|
||||
|
||||
str->val.ptr[str->val.len] = T('\0');
|
||||
return str->val.len;
|
||||
#endif
|
||||
qse_size_t x;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
x = str_vfcat (str, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
qse_size_t str_vfmt (str_t* str, const char_t* fmt, va_list ap)
|
||||
{
|
||||
int x;
|
||||
fmtout_t fo;
|
||||
va_list orgap;
|
||||
|
||||
fo.limit = QSE_TYPE_MAX(qse_size_t) - 1;
|
||||
fo.ctx = str;
|
||||
fo.put = put_char_null;
|
||||
fo.conv = conv_char;
|
||||
|
||||
va_copy (orgap, ap);
|
||||
if (fmtout (fmt, &fo, ap) <= -1) return (qse_size_t)-1;
|
||||
|
||||
str_clear (str);
|
||||
x = resize_for_ncat (str, fo.count);
|
||||
|
||||
if (x <= -1) return (qse_size_t)-1;
|
||||
if (x >= 1)
|
||||
{
|
||||
fo.put = put_char_nocheck;
|
||||
x = fmtout (fmt, &fo, orgap);
|
||||
}
|
||||
|
||||
str->val.ptr[str->val.len] = T('\0');
|
||||
return str->val.len;
|
||||
}
|
||||
|
||||
qse_size_t str_fmt (str_t* str, const char_t* fmt, ...)
|
||||
{
|
||||
qse_size_t x;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
x = str_vfmt (str, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
return x;
|
||||
}
|
||||
|
Reference in New Issue
Block a user