mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-06 05:52:48 -05:00
Generalise strbuf_catf() into put_fmt().
marshal.h now provides a macro put_fmt() which allows you to write arbitrary printf-formatted data to an arbitrary BinarySink. We already had this facility for strbufs in particular, in the form of strbuf_catf(). That was able to take advantage of knowing the inner structure of a strbuf to minimise memory allocation (it would snprintf directly into the strbuf's existing buffer if possible). For a general black-box BinarySink we can't do that, so instead we dupvprintf into a temporary buffer. For consistency, I've removed strbuf_catf, and converted all uses of it into the new put_fmt - and I've also added an extra vtable method in the BinarySink API, so that put_fmt can still use strbuf_catf's more efficient memory management when talking to a strbuf, and fall back to the simpler strategy when that's not available.
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -99,6 +100,25 @@ bool BinarySink_put_pstring(BinarySink *bs, const char *str)
|
||||
return true;
|
||||
}
|
||||
|
||||
void BinarySink_put_fmtv(BinarySink *bs, const char *fmt, va_list ap)
|
||||
{
|
||||
if (bs->writefmtv) {
|
||||
bs->writefmtv(bs, fmt, ap);
|
||||
} else {
|
||||
char *str = dupvprintf(fmt, ap);
|
||||
bs->write(bs, str, strlen(str));
|
||||
burnstr(str);
|
||||
}
|
||||
}
|
||||
|
||||
void BinarySink_put_fmt(BinarySink *bs, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
BinarySink_put_fmtv(bs, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static bool BinarySource_data_avail(BinarySource *src, size_t wanted)
|
||||
|
Reference in New Issue
Block a user