aboutsummaryrefslogtreecommitdiff
path: root/termios.scm.c
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2019-03-12 19:03:48 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2019-03-12 19:03:48 +0100
commitd9d646d6442392d60d5c9253706cceb1c9928f5b (patch)
treebc010c23a3d6997668c2814bd83dda38b2eeaa5c /termios.scm.c
parentAdd sample fetch.scm. (diff)
downloadcalp-d9d646d6442392d60d5c9253706cceb1c9928f5b.tar.gz
calp-d9d646d6442392d60d5c9253706cceb1c9928f5b.tar.xz
Add termios bindings from C.
Diffstat (limited to 'termios.scm.c')
-rw-r--r--termios.scm.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/termios.scm.c b/termios.scm.c
new file mode 100644
index 00000000..939c3574
--- /dev/null
+++ b/termios.scm.c
@@ -0,0 +1,44 @@
+#include <libguile.h>
+#include <unistd.h>
+#include <termios.h>
+#include <stdio.h>
+
+static struct termios *oldt, *newt;
+
+SCM_DEFINE(termios_lflags_and, "c-lflags-disable!", 2, 0, 0,
+ (SCM _fd, SCM _bits),
+ "")
+{
+
+ int fd = scm_to_int (_fd);
+ int bits = scm_to_int (_bits);
+
+ printf("Setting bits [%x]\n", bits);
+
+ tcgetattr(fd, oldt);
+ *newt = *oldt;
+
+ // Make the terminal not echo back,
+ // along with enabling cononical mode
+ newt->c_lflag &= ~ bits;
+ tcsetattr(fd, TCSANOW, newt);
+ return SCM_UNSPECIFIED;
+}
+
+SCM_DEFINE(termios_restore, "c-lflag-restore!", 1, 0, 0,
+ (SCM _fd),
+ "")
+{
+ int fd = scm_to_int (_fd);
+ tcsetattr(fd, TCSANOW, oldt);
+ return SCM_UNSPECIFIED;
+}
+
+void init_termios (void) {
+ oldt = scm_gc_malloc(sizeof(*oldt), "Termios");
+ newt = scm_gc_malloc(sizeof(*newt), "Termios");
+
+#ifndef SCM_MAGIC_SNARFER
+#include "termios.x"
+#endif
+}