summaryrefslogtreecommitdiffstats
path: root/src/utl_term_io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utl_term_io.cpp')
-rwxr-xr-xsrc/utl_term_io.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/utl_term_io.cpp b/src/utl_term_io.cpp
new file mode 100755
index 00000000..8e561188
--- /dev/null
+++ b/src/utl_term_io.cpp
@@ -0,0 +1,98 @@
+/*
+ Hanoh Haim
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2015-2015 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#include "utl_term_io.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/select.h>
+#include <termios.h>
+#include <inttypes.h>
+#include <fcntl.h>
+
+static struct termios oldterm;
+struct termios orig_termios;
+
+static void exit_handler1(void){
+ tcsetattr(fileno(stdin), TCSANOW, &oldterm);
+}
+
+static void save_termio(void){
+ tcgetattr(0, &oldterm);
+}
+
+
+void reset_terminal_mode(void){
+ tcsetattr(0, TCSANOW, &orig_termios);
+}
+
+static void set_conio_terminal_mode(void){
+
+ struct termios oldterm, term;
+
+ tcgetattr(0, &oldterm);
+ memcpy(&term, &oldterm, sizeof(term));
+ term.c_lflag &= ~(ICANON | ECHO | ISIG);
+ tcsetattr(0, TCSANOW, &term);
+ setbuf(stdin, NULL);
+}
+
+static int kbhit(void) {
+ struct timeval tv = { 0L, 0L };
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(0, &fds);
+ return select(1, &fds, NULL, NULL, &tv);
+}
+
+static int getch(void){
+ int r;
+ unsigned char c;
+ if ((r = read(0, &c, sizeof(c))) < 0) {
+ return r;
+ } else {
+ return c;
+ }
+}
+
+
+int utl_termio_init(){
+ atexit(exit_handler1);
+ save_termio();
+ set_conio_terminal_mode();
+ return (0);
+}
+
+
+int utl_termio_try_getch(void){
+ if ( kbhit() ){
+ return (getch());
+ }else{
+ return (0);
+ }
+}
+
+int utl_termio_reset(void){
+ tcsetattr(fileno(stdin), TCSANOW, &oldterm);
+ return (0);
+}
+
+