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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#ifndef KD_DECK_H
#define KD_DECK_H
#include <stddef.h>
#include <time.h>
#define KD_PATH_MAX 1024
#define KD_KEY_MAX 160
#define KD_VALUE_MAX 8192
#define KD_NEW_PER_DAY 5
#define KD_MAX_INTERVAL_DAYS 3650L
#define KD_NO_JUKUGO (-1)
typedef struct KDJukugo {
char id[64];
char front_path[KD_PATH_MAX];
char answer_path[KD_PATH_MAX];
} KDJukugo;
typedef struct KDCard {
char id[64];
char dir_path[KD_PATH_MAX];
char image_path[KD_PATH_MAX];
char answer_image_path[KD_PATH_MAX];
char url_path[KD_PATH_MAX];
char url[KD_VALUE_MAX];
int has_image;
int has_answer_image;
int has_url;
KDJukugo *jukugo;
size_t jukugo_count;
size_t jukugo_capacity;
} KDCard;
typedef struct KDStudyItem {
char key[KD_KEY_MAX];
size_t card_index;
int jukugo_index;
size_t review_index;
} KDStudyItem;
typedef struct KDReview {
char key[KD_KEY_MAX];
long interval_days;
long ease_milli;
long repetitions;
long lapses;
long due_epoch;
long last_epoch;
long introduced_day;
int relearning;
} KDReview;
typedef struct KDMessage {
char *text;
int is_warning;
} KDMessage;
typedef struct KDDeck {
char root_path[KD_PATH_MAX];
char state_path[KD_PATH_MAX];
KDCard *cards;
size_t card_count;
size_t card_capacity;
KDStudyItem *items;
size_t item_count;
size_t item_capacity;
KDReview *reviews;
size_t review_count;
size_t review_capacity;
KDMessage *messages;
size_t message_count;
size_t message_capacity;
} KDDeck;
void kd_deck_init(KDDeck *deck);
void kd_deck_free(KDDeck *deck);
int kd_deck_scan(KDDeck *deck, const char *root_path, const char *state_path);
int kd_deck_save(KDDeck *deck);
const char *kd_card_url(const KDCard *card);
long kd_today_key(time_t now);
size_t kd_new_today(const KDDeck *deck, time_t now);
size_t kd_count_due(const KDDeck *deck, time_t now);
size_t kd_count_unintroduced(const KDDeck *deck);
int kd_select_next(KDDeck *deck, time_t now, size_t *item_index);
int kd_find_kanji_item_by_number(const KDDeck *deck, const char *number,
size_t *item_index);
void kd_grade(KDDeck *deck, size_t item_index, int remembered, time_t now);
int kd_relearn_prompt(KDDeck *deck, size_t item_index, time_t now);
int kd_relearn_card(KDDeck *deck, size_t card_index, time_t now);
void kd_add_message(KDDeck *deck, int is_warning, const char *format, ...);
#endif
|