#include <unistd.h>
#include <termios.h>
#include <cerrno>
#include <cstdio>
char getch() {
char buf = 0;
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return (buf);
}
int getchs(char* dest, int maxnum)
{
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
int rdNum=0;
if ((rdNum=read(0, dest, maxnum)) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return rdNum;
}
#include <iostream>
#include <cstdint>
int main()
{
using namespace std;
cout << "Waiting for input..."<< endl;
for (;;)
{
//char c = getch();
const int maxChars = 8; // most I saw was 5
char buf[ maxChars + 1 ]; // +1 for terminating zero
const int readNum = getchs(buf, maxChars);
if (readNum>=0)
buf[readNum] = '\0';
switch (readNum)
{
case 1:
if (27 == buf[0]) // Esc key?
return 0;
cout << buf << endl;
break;
case 2 ... maxChars:
for (int i=0; i<readNum; ++i)
cout << hex << (unsigned)buf[i];
cout << endl;
break;
default: cout << "Unexpected byte count: "<< readNum << endl; break;
}
}
return 0;
}