_WCRTLINK int getch( void ) { int c; HANDLE h; DWORD mode; if( (c = _RWD_cbyte) != 0 ) { _RWD_cbyte = 0; return( c ); } #ifdef DEFAULT_WINDOWING if( _WindowsGetch != NULL ) { LPWDATA res; res = _WindowsIsWindowedHandle( (int)STDIN_FILENO ); c = _WindowsGetch( res ); } else { #endif _AccessFileH( STDIN_FILENO ); h = __NTConsoleInput(); GetConsoleMode( h, &mode ); SetConsoleMode( h, 0 ); c = do_getch( h ); SetConsoleMode( h, mode ); _ReleaseFileH( STDIN_FILENO ); #ifdef DEFAULT_WINDOWING } #endif return( c ); }
_WCRTLINK int kbhit( void ) { DWORD n; HANDLE h; INPUT_RECORD r; #ifdef DEFAULT_WINDOWING if( _WindowsKbhit != 0 ) { LPWDATA res; res = _WindowsIsWindowedHandle( (int) STDIN_FILENO ); return( _WindowsKbhit( res ) ); } #endif _AccessFileH( STDIN_FILENO ); h = __NTConsoleInput(); for(;;) { PeekConsoleInput( h, &r, 1, &n ); if( n == 0 ) break; if( __NTRealKey( &r ) ) break; // flush out mouse, window, and key up events ReadConsoleInput( h, &r, 1, &n ); } // n != 0 if there is a key waiting _ReleaseFileH( STDIN_FILENO ); return( n != 0 ); }
_WCRTLINK char *cgets( char *buff ) { char *p; char len; DWORD n; HANDLE h; INPUT_RECORD r; #ifdef DEFAULT_WINDOWING if( _WindowsStdin != 0 ) { // Default windowing... __qread( STDIN_FILENO, buff + 2, *buff - 1 ); p = buff + 2; len = *buff; for(;;) { if( len <= 1 ) break; if( *p == '\r' || *p == '\0' ) break; ++p; --len; } *p = '\0'; buff[1] = p - buff - 2; return( buff + 2 ); } #endif _AccessFileH( STDIN_FILENO ); h = __NTConsoleInput(); // obtain a console input handle for( p = buff + 2, len = *buff; ; ) { ReadConsoleInput( h, &r, 1, &n ); if( __NTRealKey( &r ) ) { // Only interested in real keys if( r.Event.KeyEvent.uChar.AsciiChar == CRLF ) { *p = '\0'; break; } for( ; r.Event.KeyEvent.wRepeatCount > 0; --r.Event.KeyEvent.wRepeatCount ) { // Deal with backspace first... if( r.Event.KeyEvent.uChar.AsciiChar == BACKSPACE ) { if( p > buff + 2 ) { putch( BACKSPACE ); putch( SPACE ); putch( BACKSPACE ); --p; ++len; } } else if( len > 1 ) { // Other real chars... *p = r.Event.KeyEvent.uChar.AsciiChar; putch( r.Event.KeyEvent.uChar.AsciiChar ); ++p; --len; } // Otherwise: len <= 1, can't type more. } } } _ReleaseFileH( STDIN_FILENO ); buff[1] = p - buff - 2; return( buff + 2 ); }