aboutsummaryrefslogtreecommitdiff
path: root/src/text/action.c
blob: 9d4cbbc4df281f1d2cbac98bc0bb65385c93413b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h> // fgets()
#include <stdlib.h> // atoi()
#include "../core/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 'r':
    return (action_t) { .type = ACTION_RESET };
  case 's':
    return (action_t) { .type = ACTION_SOLVE };
  default:
    return (action_t) { .type = ACTION_NONE };
  }
}