summaryrefslogtreecommitdiff
path: root/include/kd_deck.h
diff options
context:
space:
mode:
authorDoan Luu Duc Tai <doan@luuduct.ai>2026-10-11 19:21:34 -0500
committerDoan Luu Duc Tai <doan@luuduct.ai>2026-10-11 19:21:34 -0500
commitf1ae8c36c94a26e8aff2339e241542f430c96913 (patch)
tree998bc5dceffa7ddd691953717e966502dc4ff622 /include/kd_deck.h
Initial commitHEADmain
Diffstat (limited to 'include/kd_deck.h')
-rw-r--r--include/kd_deck.h96
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