mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-17 22:50:51 +00:00
make dstring_adjust `grow' in increments of 1024. this should speed up
multiple appends nicely. also create davsprintf and dasprintf to /append/ the printed strings to the dstring rather than overwriting it as is done with dvsprintf and dsprintf.
This commit is contained in:
parent
1f0b6e84a5
commit
68b41f9b44
2 changed files with 45 additions and 9 deletions
|
@ -62,5 +62,7 @@ void dstring_clearstr (dstring_t *dstr);
|
|||
|
||||
int dvsprintf (dstring_t *dstr, const char *fmt, va_list args);
|
||||
int dsprintf (dstring_t *dstr, const char *fmt, ...) __attribute__((format(printf,2,3)));
|
||||
int davsprintf (dstring_t *dstr, const char *fmt, va_list args);
|
||||
int dasprintf (dstring_t *dstr, const char *fmt, ...) __attribute__((format(printf,2,3)));
|
||||
|
||||
#endif // __dstring_h
|
||||
|
|
|
@ -59,10 +59,10 @@ inline void
|
|||
dstring_adjust (dstring_t *dstr)
|
||||
{
|
||||
if (dstr->size > dstr->truesize) {
|
||||
dstr->str = realloc (dstr->str, dstr->size);
|
||||
dstr->truesize = (dstr->size + 1023) & ~1023;
|
||||
dstr->str = realloc (dstr->str, dstr->truesize);
|
||||
if (!dstr->str)
|
||||
Sys_Error ("dstring_adjust: Failed to reallocate memory.");
|
||||
dstr->truesize = dstr->size;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -191,8 +191,8 @@ dstring_clearstr (dstring_t *dstr)
|
|||
# define VA_COPY memcpy (a, b, sizeof (a))
|
||||
#endif
|
||||
|
||||
int
|
||||
dvsprintf (dstring_t *dstr, const char *fmt, va_list args)
|
||||
static int
|
||||
_dvsprintf (dstring_t *dstr, int offs, const char *fmt, va_list args)
|
||||
{
|
||||
int size;
|
||||
|
||||
|
@ -205,22 +205,30 @@ dvsprintf (dstring_t *dstr, const char *fmt, va_list args)
|
|||
dstr->size = 1024;
|
||||
dstring_adjust (dstr);
|
||||
}
|
||||
size = vsnprintf (dstr->str, dstr->truesize, fmt, args) + 1; // +1 for nul
|
||||
// +1 for nul
|
||||
size = vsnprintf (dstr->str + offs, dstr->truesize - offs, fmt, args) + 1;
|
||||
while (size <= 0 || size > dstr->truesize) {
|
||||
if (size > 0)
|
||||
dstr->size = (size + 1023) & ~1023; // 1k multiples
|
||||
dstr->size = (size + offs + 1023) & ~1023; // 1k multiples
|
||||
else
|
||||
dstr->size = dstr->truesize + 1024;
|
||||
dstring_adjust (dstr);
|
||||
#ifdef VA_LIST_IS_ARRAY
|
||||
VA_COPY (args, tmp_args);
|
||||
#endif
|
||||
size = vsnprintf (dstr->str, dstr->truesize, fmt, args) + 1;
|
||||
size = vsnprintf (dstr->str + offs, dstr->truesize - offs,
|
||||
fmt, args) + 1;
|
||||
}
|
||||
dstr->size = size;
|
||||
dstr->size = size + offs;
|
||||
return size - 1;
|
||||
}
|
||||
|
||||
int
|
||||
dvsprintf (dstring_t *dstr, const char *fmt, va_list args)
|
||||
{
|
||||
return _dvsprintf (dstr, 0, fmt, args);
|
||||
}
|
||||
|
||||
int
|
||||
dsprintf (dstring_t *dstr, const char *fmt, ...)
|
||||
{
|
||||
|
@ -228,7 +236,33 @@ dsprintf (dstring_t *dstr, const char *fmt, ...)
|
|||
int ret;
|
||||
|
||||
va_start (args, fmt);
|
||||
ret = dvsprintf (dstr, fmt, args);
|
||||
ret = _dvsprintf (dstr, 0, fmt, args);
|
||||
va_end (args);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
davsprintf (dstring_t *dstr, const char *fmt, va_list args)
|
||||
{
|
||||
int offs = 0;
|
||||
|
||||
if (dstr->size)
|
||||
offs = dstr->size - 1;
|
||||
return _dvsprintf (dstr, offs, fmt, args);
|
||||
}
|
||||
|
||||
int
|
||||
dasprintf (dstring_t *dstr, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
int ret;
|
||||
int offs = 0;
|
||||
|
||||
if (dstr->size)
|
||||
offs = dstr->size - 1;
|
||||
va_start (args, fmt);
|
||||
ret = _dvsprintf (dstr, offs, fmt, args);
|
||||
va_end (args);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue