diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..c76584c --- /dev/null +++ b/test/Makefile @@ -0,0 +1,10 @@ +## +# TEST +# +# @file +# @version 0.1 + +main: main.c + $(CC) main.c -o main -Wall -Wextra -pedantic + +# end diff --git a/test/main.c b/test/main.c new file mode 100644 index 0000000..35706b5 --- /dev/null +++ b/test/main.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include + +/* defines */ +#define CTRL_KEY(k) ((k) & 0x1f) + +/* data */ +struct termios orig_termios; + +/* terminal */ + +void die(const char *s) { + perror(s); + exit(1); +} + +void disableRawMode() { + if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios) == -1) { + die("tcsetattr"); + } +} + +void enableRawMode() { + if (tcgetattr(STDIN_FILENO, &orig_termios) == -1) { + die("tcgetattr"); + } + atexit(disableRawMode); + + struct termios raw = orig_termios; + raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); + raw.c_oflag &= ~(OPOST); + raw.c_cflag |= (CS8); + raw.c_lflag &= ~(ECHO | ICANON | ISIG | IEXTEN); + raw.c_cc[VMIN] = 0; + raw.c_cc[VTIME] = 1; + + if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1) { + die("tcgetattr"); + } +} + +/* init */ + +int main() { + char c; + + enableRawMode(); + + while (1) { + c = '\0'; + if (read(STDIN_FILENO, &c, 1) == -1 && errno != EAGAIN) { + die("read"); + } + if (iscntrl(c)) { + printf("%d\r\n", c); + } else { + printf("%d ('%c')\r\n", c, c); + } + if (c == CTRL_KEY('q')) { + break; + } + } + return 0; +}