You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.0 KiB
116 lines
3.0 KiB
/* |
|
* |
|
* conio.h |
|
* |
|
* Non-Windows implementation of kbhit() for interactive |
|
* console applications. |
|
* |
|
* Copyright (c) 2011-2012, Archaea Software, LLC. |
|
* All rights reserved. |
|
* |
|
* Redistribution and use in source and binary forms, with or without |
|
* modification, are permitted provided that the following conditions |
|
* are met: |
|
* |
|
* 1. Redistributions of source code must retain the above copyright |
|
* notice, this list of conditions and the following disclaimer. |
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
* notice, this list of conditions and the following disclaimer in |
|
* the documentation and/or other materials provided with the |
|
* distribution. |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
* POSSIBILITY OF SUCH DAMAGE. |
|
* |
|
*/ |
|
|
|
#ifdef _WIN32 |
|
#include <conio.h> |
|
#else |
|
|
|
#include <termios.h> |
|
#include <unistd.h> |
|
#include <fcntl.h> |
|
#include <sys/select.h> |
|
|
|
int kbhit(void) |
|
{ |
|
struct termios oldt, newt; |
|
int ch; |
|
int oldf; |
|
|
|
tcgetattr(STDIN_FILENO, &oldt); |
|
newt = oldt; |
|
newt.c_lflag &= ~(ICANON | ECHO); |
|
tcsetattr(STDIN_FILENO, TCSANOW, &newt); |
|
oldf = fcntl(STDIN_FILENO, F_GETFL, 0); |
|
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); |
|
|
|
ch = getchar(); |
|
|
|
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); |
|
fcntl(STDIN_FILENO, F_SETFL, oldf); |
|
|
|
if(ch != EOF) |
|
{ |
|
ungetc(ch, stdin); |
|
return 1; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
#if 0 |
|
int kbhit(void) |
|
{ |
|
struct timeval tv; |
|
fd_set read_fd; |
|
|
|
/* Do not wait at all, not even a microsecond */ |
|
tv.tv_sec=0; |
|
tv.tv_usec=0; |
|
|
|
/* Must be done first to initialize read_fd */ |
|
FD_ZERO(&read_fd); |
|
|
|
/* Makes select() ask if input is ready: |
|
* * 0 is the file descriptor for stdin */ |
|
FD_SET(0,&read_fd); |
|
|
|
/* The first parameter is the number of the |
|
* * largest file descriptor to check + 1. */ |
|
if(select(1, &read_fd,NULL, /*No writes*/NULL, /*No exceptions*/&tv) == -1) |
|
return 0; /* An error occured */ |
|
|
|
/* read_fd now holds a bit map of files that are |
|
* * readable. We test the entry for the standard |
|
* * input (file 0). */ |
|
|
|
if(FD_ISSET(0,&read_fd)) |
|
/* Character pending on stdin */ |
|
return 1; |
|
|
|
/* no characters were pending */ |
|
return 0; |
|
} |
|
#endif |
|
|
|
// we only call getch() when kbhit() has told us there |
|
// is a pending keystroke |
|
int |
|
getch() |
|
{ |
|
return getchar(); |
|
} |
|
|
|
#endif
|
|
|