From fccad2613afcd92fb823b684c686c1cc6f92ed45 Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Fri, 17 Nov 2017 20:55:38 -0800 Subject: [PATCH] restore Windows console codepage on exit --- pkg2zip.c | 1 + pkg2zip_sys.c | 21 +++++++++++++++++---- pkg2zip_sys.h | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pkg2zip.c b/pkg2zip.c index bec4f44..c99d17e 100644 --- a/pkg2zip.c +++ b/pkg2zip.c @@ -889,4 +889,5 @@ int main(int argc, char* argv[]) } sys_output("[*] done!\n"); + sys_output_done(); } diff --git a/pkg2zip_sys.c b/pkg2zip_sys.c index 305092e..348b22b 100644 --- a/pkg2zip_sys.c +++ b/pkg2zip_sys.c @@ -13,9 +13,11 @@ static HANDLE gStdout; static int gStdoutRedirected; +static UINT gOldCP; void sys_output_init(void) { + gOldCP = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); gStdout = GetStdHandle(STD_OUTPUT_HANDLE); @@ -23,6 +25,11 @@ void sys_output_init(void) gStdoutRedirected = !GetConsoleMode(gStdout, &mode); } +void sys_output_done(void) +{ + SetConsoleOutputCP(gOldCP); +} + void sys_output(const char* msg, ...) { char buffer[1024]; @@ -60,12 +67,14 @@ void sys_error(const char* msg, ...) int wcount = MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wbuffer, sizeof(buffer)); DWORD written; - WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wbuffer, wcount, &written, NULL); - - exit(EXIT_FAILURE); + WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wbuffer, wcount - 1, &written, NULL); + } + else + { + fputs(buffer, stderr); } - fputs(buffer, stderr); + SetConsoleOutputCP(gOldCP); exit(EXIT_FAILURE); } @@ -168,6 +177,10 @@ void sys_output_init(void) gStdoutRedirected = !isatty(STDOUT_FILENO); } +void sys_output_done(void) +{ +} + void sys_output(const char* msg, ...) { va_list arg; diff --git a/pkg2zip_sys.h b/pkg2zip_sys.h index 53b19b8..9096f29 100644 --- a/pkg2zip_sys.h +++ b/pkg2zip_sys.h @@ -4,6 +4,7 @@ // correctly outputs utf8 string void sys_output_init(void); +void sys_output_done(void); void sys_output(const char* msg, ...); void NORETURN sys_error(const char* msg, ...);