#include // fgets() #include // 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 }; } }