Am 28.02.2020 um 14:31 schrieb Corinna Vinschen:
[CC Hans]
Thanks. I wasn't subscribed to -patches so far. Will change that.
Hans,
as for making a patch for this issue, may I leave it to you
because you are already working on it?
My patch was meant only as a minimally-invasive stop-gap fix, because
the new GCC refused to compile the code as-is (it triggers a
-Werror...). As such, sorry for hurting Brian's eyes. ;-)
I agree that this really should be an inline function. I barely speak
C++, but even I have glimpsed that multi-statement macros are rightfully
frowned upon in C++ circles.
I believe a more C++-like implementation would have to encapsulate wpbuf
and wpixput into a helper class. This is what my _very_ rusty C++
allowed me to come up with:
// simple helper class to accumulate output in a buffer
// and send that to the console on request:
static class
{
private:
unsigned char buf[WPBUF_LEN];
int ixput;
public:
inline void put(unsigned char x)
{
if (ixput < WPBUF_LEN)
{
buf[ixput++] = x;
}
};
inline void empty() { ixput = 0; };
inline void sendOut(HANDLE &handle, DWORD *wn) {
WriteConsoleA (handle, buf, ixput, wn, 0);
};
} wpbuf;
Using it works like this:
s/wpbuf_put/wpbuf.put/
s/wpixput = 0/wpbuf.empty()/
s/WriteConsoleA ( get_output_handle (), wpbuf, wpixput, \(&w*n\), 0
/wpbuf.sendOut( get_output_handle (), \1/g
Yes, sendOut() is ugly --- I didn't manage to find out how this class
could access get_output_handle() itself, so I had to let its callers
deal with that.