diff options
| author | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-10-11 19:21:34 -0500 |
|---|---|---|
| committer | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-10-11 19:21:34 -0500 |
| commit | f1ae8c36c94a26e8aff2339e241542f430c96913 (patch) | |
| tree | 998bc5dceffa7ddd691953717e966502dc4ff622 /include/kd_deck.h | |
Diffstat (limited to 'include/kd_deck.h')
| -rw-r--r-- | include/kd_deck.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/include/kd_deck.h b/include/kd_deck.h new file mode 100644 index 0000000..13401b1 --- /dev/null +++ b/include/kd_deck.h @@ -0,0 +1,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 |
