On Monday, 10 November 2014, Jonathan Vollebregt wrote:
WCHAR msg_buffer[1024];
No easy way to get the expected size and dynamically allocate the output I take it?
I looked into it before but besides _vscprintf (In msvcrt, which we're not allowed to use) there doesn't seem to be a way to get the expected output size besides perhaps growing the buffer over and over again until it fits (Which seems inefficient for a simple printing function)
One possible way would be to avoid using vsnprintfW() and pass everything through to output_vprintf().
static void __cdecl reg_printfW(const WCHAR* msg, ...) { __ms_va_list va_args;
__ms_va_start(va_args, msg); output_vprintf(msg, va_args); __ms_va_end(va_args); }
This would have the advantage of using FormatMessage() to allocate memory. But we would have to replace all format specifiers (four or five?) with their FormatMessage() equivalents.
static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
becomes
static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','1','!','x','!',' ',' ','d','a','t','a',' ','%','2','\n',0};
That was my thought, but it doesn't appear to be parsing printf parameters properly:
Sticking this in main:
static const WCHAR testW[] = {'w','0','o','t','\n','%','s','\n',0}; reg_printfW(testW, deleteW);
Results in the output:
w0ot s
On 11/10/2014 01:10 PM, Hugh McMaster wrote:
On Monday, 10 November 2014, Jonathan Vollebregt wrote:
WCHAR msg_buffer[1024];
No easy way to get the expected size and dynamically allocate the output I take it?
I looked into it before but besides _vscprintf (In msvcrt, which we're not allowed to use) there doesn't seem to be a way to get the expected output size besides perhaps growing the buffer over and over again until it fits (Which seems inefficient for a simple printing function)
One possible way would be to avoid using vsnprintfW() and pass everything through to output_vprintf().
static void __cdecl reg_printfW(const WCHAR* msg, ...) { __ms_va_list va_args;
__ms_va_start(va_args, msg); output_vprintf(msg, va_args); __ms_va_end(va_args);
}
This would have the advantage of using FormatMessage() to allocate memory. But we would have to replace all format specifiers (four or five?) with their FormatMessage() equivalents.
static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
becomes
static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','1','!','x','!',' ',' ','d','a','t','a',' ','%','2','\n',0};
On Monday, 10 Nov 2014 13:17:56 +0100, Jonathan Vollebregt wrote:
That was my thought, but it doesn't appear to be parsing printf parameters properly:
Sticking this in main:
static const WCHAR testW[] = {'w','0','o','t','\n','%','s','\n',0}; reg_printfW(testW, deleteW);
Results in the output:
w0ot s
At a quick glance, %s should be %1. FormatMessage() accepts numerals.
Unfortunately if I pass in anything besides a pointer it will segfault. It actually wants a format string "%1!d!" for ints which is hardly compact (Especially since we have to type it out in a WCHAR array)
There must be a better way to get the size of the string...
On 11/10/2014 01:44 PM, Hugh McMaster wrote:
On Monday, 10 Nov 2014 13:17:56 +0100, Jonathan Vollebregt wrote:
That was my thought, but it doesn't appear to be parsing printf parameters properly:
Sticking this in main:
static const WCHAR testW[] = {'w','0','o','t','\n','%','s','\n',0}; reg_printfW(testW, deleteW);
Results in the output:
w0ot s
At a quick glance, %s should be %1. FormatMessage() accepts numerals.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Am 2014-11-10 14:05, schrieb Jonathan Vollebregt:
Unfortunately if I pass in anything besides a pointer it will segfault. It actually wants a format string "%1!d!" for ints which is hardly compact (Especially since we have to type it out in a WCHAR array)
There must be a better way to get the size of the string...
Fwiw, I cannot really comment on this patch because I have no experience with output handling. I'm afraid the two of you have to come to an agreement on your own.
Just two general observations: *) The entire console writing code is terribly verbose, but I guess that's the Windows API's fault. What may help is a helper file similar to include/wine/list.h that contains this code, so it doesn't have to be re-coded in every program. I haven't looked at the individual implementations though.
*) I see the static buffer passed to LoadString as a relatively minor issue because the length of those strings is fixed. Translations may cause problems I guess.
Does SizeofResource() help here? I'm a bit confused re HMODULE and HINSTANCE.