mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 19:12: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:
@ -4946,7 +4946,7 @@ static void wintw_clip_write(
|
||||
|
||||
get_unitab(CP_ACP, unitab, 0);
|
||||
|
||||
strbuf_catf(
|
||||
put_fmt(
|
||||
rtf, "{\\rtf1\\ansi\\deff0{\\fonttbl\\f0\\fmodern %s;}\\f0\\fs%d",
|
||||
font->name, font->height*2);
|
||||
|
||||
@ -5034,16 +5034,16 @@ static void wintw_clip_write(
|
||||
for (i = 0; i < OSC4_NCOLOURS; i++) {
|
||||
if (palette[i] != 0) {
|
||||
const PALETTEENTRY *pe = &logpal->palPalEntry[i];
|
||||
strbuf_catf(rtf, "\\red%d\\green%d\\blue%d;",
|
||||
pe->peRed, pe->peGreen, pe->peBlue);
|
||||
put_fmt(rtf, "\\red%d\\green%d\\blue%d;",
|
||||
pe->peRed, pe->peGreen, pe->peBlue);
|
||||
}
|
||||
}
|
||||
if (rgbtree) {
|
||||
rgbindex *rgbp;
|
||||
for (i = 0; (rgbp = index234(rgbtree, i)) != NULL; i++)
|
||||
strbuf_catf(rtf, "\\red%d\\green%d\\blue%d;",
|
||||
GetRValue(rgbp->ref), GetGValue(rgbp->ref),
|
||||
GetBValue(rgbp->ref));
|
||||
put_fmt(rtf, "\\red%d\\green%d\\blue%d;",
|
||||
GetRValue(rgbp->ref), GetGValue(rgbp->ref),
|
||||
GetBValue(rgbp->ref));
|
||||
}
|
||||
put_datapl(rtf, PTRLEN_LITERAL("}"));
|
||||
}
|
||||
@ -5162,13 +5162,13 @@ static void wintw_clip_write(
|
||||
lastfgcolour = fgcolour;
|
||||
lastfg = fg;
|
||||
if (fg == -1) {
|
||||
strbuf_catf(rtf, "\\cf%d ",
|
||||
(fgcolour >= 0) ? palette[fgcolour] : 0);
|
||||
put_fmt(rtf, "\\cf%d ",
|
||||
(fgcolour >= 0) ? palette[fgcolour] : 0);
|
||||
} else {
|
||||
rgbindex rgb, *rgbp;
|
||||
rgb.ref = fg;
|
||||
if ((rgbp = find234(rgbtree, &rgb, NULL)) != NULL)
|
||||
strbuf_catf(rtf, "\\cf%d ", rgbp->index);
|
||||
put_fmt(rtf, "\\cf%d ", rgbp->index);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5176,13 +5176,13 @@ static void wintw_clip_write(
|
||||
lastbgcolour = bgcolour;
|
||||
lastbg = bg;
|
||||
if (bg == -1)
|
||||
strbuf_catf(rtf, "\\highlight%d ",
|
||||
(bgcolour >= 0) ? palette[bgcolour] : 0);
|
||||
put_fmt(rtf, "\\highlight%d ",
|
||||
(bgcolour >= 0) ? palette[bgcolour] : 0);
|
||||
else {
|
||||
rgbindex rgb, *rgbp;
|
||||
rgb.ref = bg;
|
||||
if ((rgbp = find234(rgbtree, &rgb, NULL)) != NULL)
|
||||
strbuf_catf(rtf, "\\highlight%d ", rgbp->index);
|
||||
put_fmt(rtf, "\\highlight%d ", rgbp->index);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5243,7 +5243,7 @@ static void wintw_clip_write(
|
||||
} else if (tdata[tindex+i] == 0x0D || tdata[tindex+i] == 0x0A) {
|
||||
put_datapl(rtf, PTRLEN_LITERAL("\\par\r\n"));
|
||||
} else if (tdata[tindex+i] > 0x7E || tdata[tindex+i] < 0x20) {
|
||||
strbuf_catf(rtf, "\\'%02x", tdata[tindex+i]);
|
||||
put_fmt(rtf, "\\'%02x", tdata[tindex+i]);
|
||||
} else {
|
||||
put_byte(rtf, tdata[tindex+i]);
|
||||
}
|
||||
|
Reference in New Issue
Block a user