summaryrefslogtreecommitdiff
path: root/include/kd_deck.h
blob: 13401b14c147f473484822f283b2bc83e3a20551 (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
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