commit bb776044e326d7eba00f0bc22b9b338defb36525
Author: Dimitrije Dobrota <mail@dimitrijedobrota.com>
Date: Fri, 7 Apr 2023 20:22:08 +0200
Initial commit, entering raw mode
Diffstat:
3 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+kilo
diff --git a/Makefile b/Makefile
@@ -0,0 +1,2 @@
+kilo : kilo.c
+ $(CC) kilo.c -o kilo -Wall -Wextra -pedantic -std=c99
diff --git a/kilo.c b/kilo.c
@@ -0,0 +1,62 @@
+/*** includes ***/
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+
+/*** 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 | IEXTEN | ISIG);
+ raw.c_cc[VMIN] = 0;
+ raw.c_cc[VTIME] = 1;
+
+ if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1)
+ die("tcsetattr");
+}
+
+/*** init ***/
+
+int main() {
+ enableRawMode();
+
+ while (1) {
+ char 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 == 'q')
+ break;
+ }
+ return 0;
+}