#ifndef KD_DECK_H #define KD_DECK_H #include #include #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