X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmisc.cpp;h=74b6385a45217d18c833b658a013b5f58c29a904;hp=72f93c5e0677cd1f854d29795ebb042a25e88eab;hb=3abff79df3c50435556d53c1b39ec3e5935b642e;hpb=9da1f45b1d310fbe213a7f51916e098fba837a9a diff --git a/src/misc.cpp b/src/misc.cpp index 72f93c5e..74b6385a 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -154,6 +154,8 @@ const string engine_name() { return s.str(); } +const string engine_author() { return "Tord Romstad, Marco Costalba and Joona Kiiski"; } + /// get_system_time() returns the current system time, measured in /// milliseconds. @@ -205,11 +207,11 @@ int cpu_count() { #endif -/// Check for console input. Original code from Beowulf and Olithink +/// Check for console input. Original code from Beowulf, Olithink and Greko #ifndef _WIN32 -int data_available() +int input_available() { fd_set readfds; struct timeval timeout; @@ -225,35 +227,46 @@ int data_available() #else -int data_available() +int input_available() { static HANDLE inh = NULL; - static bool usePipe; + static bool usePipe = false; INPUT_RECORD rec[256]; - DWORD dw, recCnt; + DWORD nchars, recCnt; if (!inh) { inh = GetStdHandle(STD_INPUT_HANDLE); - usePipe = !GetConsoleMode(inh, &dw); - if (!usePipe) + if (GetConsoleMode(inh, &nchars)) { - SetConsoleMode(inh, dw & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); + SetConsoleMode(inh, nchars & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer(inh); - } + } else + usePipe = true; } - // If we're running under XBoard then we can't use PeekConsoleInput() as - // the input commands are sent to us directly over the internal pipe. + // When using Standard C input functions, also check if there + // is anything in the buffer. After a call to such functions, + // the input waiting in the pipe will be copied to the buffer, + // and the call to PeekNamedPipe can indicate no input available. + // Setting stdin to unbuffered was not enough. [from Greko] + if (stdin->_cnt > 0) + return 1; + + // When running under a GUI the input commands are sent to us + // directly over the internal pipe. If PeekNamedPipe() returns 0 + // then something went wrong. Probably the parent program exited. + // Returning 1 will make the next call to the input function + // return EOF, where this should be catched then. if (usePipe) - return PeekNamedPipe(inh, NULL, 0, NULL, &dw, NULL) ? dw : 1; + return PeekNamedPipe(inh, NULL, 0, NULL, &nchars, NULL) ? nchars : 1; // Count the number of unread input records, including keyboard, // mouse, and window-resizing input records. - GetNumberOfConsoleInputEvents(inh, &dw); + GetNumberOfConsoleInputEvents(inh, &nchars); // Read data from console without removing it from the buffer - if (dw <= 0 || !PeekConsoleInput(inh, rec, Min(dw, 256), &recCnt)) + if (nchars <= 0 || !PeekConsoleInput(inh, rec, Min(nchars, 256), &recCnt)) return 0; // Search for at least one keyboard event