static int init_console(void) { # if defined(GAUCHE_WINDOWS_NOCONSOLE) char buf[100]; int in_fd, out_fd; #define ERR(msg) do {sprintf(buf, msg, strerror(errno));goto fail;} while(0) if ((in_fd = open("NUL", O_RDONLY)) < 0) ERR("couldn't open NUL: %s"); if ((out_fd = open("NUL", O_WRONLY))< 0) ERR("couldn't open NUL: %s"); if (_dup2(in_fd, 0) < 0) ERR("dup2(0) failed (%s)"); if (_dup2(out_fd, 1) < 0) ERR("dup2(1) failed (%s)"); if (_dup2(out_fd, 2) < 0) ERR("dup2(2) failed (%s)"); close(in_fd); close(out_fd); return FALSE; #undef ERR fail: MessageBoxA(NULL, buf, "gosh-noconsole", MB_OK|MB_ICONERROR); Scm_Exit(1); # else /*!defined(GAUCHE_WINDOWS_NOCONSOLE)*/ /* This saves so much trouble */ _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); _setmode(_fileno(stderr), _O_BINARY); return TRUE; # endif /*!defined(GAUCHE_WINDOWS_NOCONSOLE)*/ }
static int init_console(void) { # if defined(GAUCHE_WINDOWS_NOCONSOLE) char buf[100]; int in_fd, out_fd; #define ERR(msg) do {sprintf(buf, msg, strerror(errno));goto fail;} while(0) /* If we don't have console, we'll start off with stdio to be redirected to NUL; but whenever Scheme program tries to do I/O from/to standard Scheme ports, we open the console and reconnect the ports. */ if ((in_fd = open("NUL", O_RDONLY)) < 0) ERR("couldn't open NUL: %s"); if ((out_fd = open("NUL", O_WRONLY)) < 0) ERR("couldn't open NUL: %s"); if (_dup2(in_fd, 0) < 0) ERR("dup2(0) failed (%s)"); if (_dup2(out_fd, 1) < 0) ERR("dup2(1) failed (%s)"); if (_dup2(out_fd, 2) < 0) ERR("dup2(2) failed (%s)"); close(in_fd); close(out_fd); return FALSE; #undef ERR fail: MessageBoxA(NULL, buf, "gosh-noconsole", MB_OK|MB_ICONERROR); Scm_Exit(1); # else /*!defined(GAUCHE_WINDOWS_NOCONSOLE)*/ /* This saves so much trouble */ _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); _setmode(_fileno(stderr), _O_BINARY); return TRUE; # endif /*!defined(GAUCHE_WINDOWS_NOCONSOLE)*/ }
/* Error handling */ void error_exit(ScmObj c) { ScmObj m = Scm_ConditionMessage(c); if (SCM_FALSEP(m)) { Scm_Printf(SCM_CURERR, "gosh: Thrown unknown condition: %S\n", c); } else { Scm_Printf(SCM_CURERR, "gosh: %S: %A\n", Scm_ConditionTypeName(c), m); } Scm_Exit(1); }