blob: 3d63bcef257a7066f21f94ad3ee7ed9eca881e87 (
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
|
#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 };
}
}
|