diff options
Diffstat (limited to 'src/text/action.c')
-rw-r--r-- | src/text/action.c | 64 |
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 }; + } +} |