From bb4b04082addfdf7705167582b7608c8f9f12aa3 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 27 May 2010 16:47:34 -0600 Subject: [PATCH] fix cmdline-level printf wrapper for Windows It was broken in a way that made gracket-text crash Merge to v5.0 --- src/gracket/gracket.cxx | 9 +++++++-- src/gracket/grmain.cxx | 2 ++ src/racket/cmdline.inc | 6 +++--- src/racket/main.c | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/gracket/gracket.cxx b/src/gracket/gracket.cxx index ee34eeafbe..6af1e0e4dd 100644 --- a/src/gracket/gracket.cxx +++ b/src/gracket/gracket.cxx @@ -2292,6 +2292,7 @@ static void MrEdSchemeMessages(char *msg, ...) waiting_sema = CreateSemaphore(NULL, 0, 1, NULL); SetConsoleCtrlHandler(ConsoleHandler, TRUE); + { HMODULE hm; gcw_proc gcw; @@ -2336,10 +2337,14 @@ static void MrEdSchemeMessages(char *msg, ...) WriteConsole(console_out, s XFORM_OK_PLUS d, l, &wrote, NULL); } else { + long sz, wrt; char *buffer; DWORD wrote; - buffer = (char *)malloc(5 * strlen(msg)); - vsprintf(buffer, msg, args); + /* FIXME: multiplying by 5 and adding 80 works for + all the cases where printf mode is currently used + for the function, but it's completely a hack. */ + buffer = (char *)malloc((5 * strlen(msg)) + 80); + wrt = vsprintf(buffer, msg, args); WriteConsole(console_out, buffer, strlen(buffer), &wrote, NULL); free(buffer); } diff --git a/src/gracket/grmain.cxx b/src/gracket/grmain.cxx index 18b04acf94..118487e3c0 100644 --- a/src/gracket/grmain.cxx +++ b/src/gracket/grmain.cxx @@ -113,10 +113,12 @@ extern "C" Scheme_Object *scheme_initialize(Scheme_Env *env); #define GET_INIT_FILENAME get_init_filename #if REDIRECT_STDIO || WINDOW_STDIO || WCONSOLE_STDIO # define PRINTF mred_console_printf +# define CMDLINE_FFLUSH(x) /* nothing */ static void (*mred_console_printf)(char *str, ...); # define NEED_MRED_CONSOLE_PRINTF #else # define PRINTF printf +# define CMDLINE_FFLUSH fflush #endif #define PROGRAM "GRacket" #define PROGRAM_LC "gracket" diff --git a/src/racket/cmdline.inc b/src/racket/cmdline.inc index a98869abab..1bc3f94272 100644 --- a/src/racket/cmdline.inc +++ b/src/racket/cmdline.inc @@ -1078,7 +1078,7 @@ static int run_from_cmd_line(int argc, char *_argv[], #endif #if defined(USE_FD_PORTS) || defined(WINDOWS_FILE_HANDLES) - fflush(stdout); + CMDLINE_FFLUSH(stdout); #endif } #endif /* DONT_PARSE_COMMAND_LINE */ @@ -1286,7 +1286,7 @@ static int run_from_cmd_line(int argc, char *_argv[], ); PRINTF(prog, BANNER); #if defined(WINDOWS_FILE_HANDLES) - fflush(stdout); + CMDLINE_FFLUSH(stdout); #endif return 0; bad_switch: @@ -1298,7 +1298,7 @@ static int run_from_cmd_line(int argc, char *_argv[], show_need_help: PRINTF("Use the --help or -h flag for help.\n"); #if defined(DETECT_WIN32_CONSOLE_STDIN) - fflush(stdout); + CMDLINE_FFLUSH(stdout); #endif return 1; #endif diff --git a/src/racket/main.c b/src/racket/main.c index a5300a1174..cdf056e6ad 100644 --- a/src/racket/main.c +++ b/src/racket/main.c @@ -146,6 +146,7 @@ extern Scheme_Object *scheme_initialize(Scheme_Env *env); #endif #define GET_INIT_FILENAME get_init_filename #define PRINTF printf +#define CMDLINE_FFLUSH fflush #define PROGRAM "Racket" #define PROGRAM_LC "racket" #define INITIAL_BIN_TYPE "zi"