aboutsummaryrefslogtreecommitdiff
path: root/src/text/action.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/text/action.c')
-rw-r--r--src/text/action.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/text/action.c b/src/text/action.c
new file mode 100644
index 0000000..3d63bce
--- /dev/null
+++ b/src/text/action.c
@@ -0,0 +1,64 @@
+#include <stdio.h> // fgets()
+#include <stdlib.h> // atoi()
+#include "../libsok/sok.h"
+#include "action.h"
+
+#define CASE_DIGIT \
+ case '0': \
+ case '1': \
+ case '2': \
+ case '3': \
+ case '4': \
+ case '5': \
+ case '6': \
+ case '7': \
+ case '8': \
+ case '9':
+
+static const sok_dir_t
+key_to_dir(const char c) {
+ switch (c) {
+ case 'k': return SOK_DIR_UP;
+ case 'h': return SOK_DIR_LEFT;
+ case 'j': return SOK_DIR_DOWN;
+ case 'l': return SOK_DIR_RIGHT;
+ default: return SOK_DIR_LAST;
+ }
+}
+
+action_t
+get_action(void) {
+ char buf[128];
+
+ // read input, check for error
+ if (!fgets(buf, sizeof(buf), stdin)) {
+ return (action_t) { .type = ACTION_QUIT };
+ }
+
+ switch (buf[0]) {
+ case EOF:
+ case 'q':
+ return (action_t) { .type = ACTION_QUIT };
+ case 'h':
+ case 'j':
+ case 'k':
+ case 'l':
+ return (action_t) {
+ .type = ACTION_MOVE,
+ .data = key_to_dir(buf[0])
+ };
+ case 'u':
+ return (action_t) { .type = ACTION_UNDO };
+ case 'n':
+ return (action_t) { .type = ACTION_NEXT };
+ CASE_DIGIT
+ return (action_t) {
+ .type = ACTION_WARP,
+ .data = atoi(buf),
+ };
+ case 's':
+ return (action_t) { .type = ACTION_SOLVE };
+ default:
+ return (action_t) { .type = ACTION_NONE };
+ }
+}