+/* 0x00..0x1f chars glyph map */ +static const WCHAR glyph_xlat[32] = { + 0x0000, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2662, 0x2219, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC +}; + +/* adds glyphs to the string */ +static inline void add_glyphs( WCHAR *str, unsigned int length ) +{ + unsigned int i; + for (i=0; i!=length; i++) { + if (str[i]<0x20) str[i]=glyph_xlat[str[i]]; + } +}
I propose to make this routine extern, because it is the simpliest way to make console renderer (I mean user backend of wineconsole) display the characters below 0x20 correct.
The test: #include <windows.h>
int main(void) { DWORD d; char str[32]; int i;
GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &d); d &= ~ENABLE_PROCESSED_OUTPUT; SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), d); for (i = 0; i < 32; i++) str[i] = i; WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), str, 32, &d, 0); d |= ENABLE_PROCESSED_OUTPUT; SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), d); return 0; }
Under wine we get strange symbols, under windows we get correct glyphs.
If we perform the same character conversion in wineconsole/user.c just before actual text output, we get almost the same result that Windows does. The only difference is handling \0 symbol.
-- Kirill