X-Git-Url: https://git.cworth.org/git?p=mnemon;a=blobdiff_plain;f=mnemon.c;h=7f0526d8766beb410fd5a02caf6555817dba6f49;hp=c334f22d7ef0915289fd9ed20f229fe9b700bd42;hb=10d0f1e757ef8c22bf8c1d921b624296a25ab238;hpb=6aebbea659aa5e537d79796553f4fd4150d6384f diff --git a/mnemon.c b/mnemon.c index c334f22..7f0526d 100644 --- a/mnemon.c +++ b/mnemon.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -65,7 +66,8 @@ typedef enum { CHALLENGE_TYPE_TEXT, CHALLENGE_TYPE_IMAGE, CHALLENGE_TYPE_AUDIO, - CHALLENGE_TYPE_MIDI + CHALLENGE_TYPE_MIDI, + CHALLENGE_TYPE_TEXT_TO_SPEECH } challenge_type_t; typedef struct _category { @@ -295,6 +297,9 @@ category_print (category_t *category, case CHALLENGE_TYPE_MIDI: fprintf (file, "midi"); break; + case CHALLENGE_TYPE_TEXT_TO_SPEECH: + fprintf (file, "text-to-speech"); + break; } fprintf (file, "\n\n"); @@ -584,6 +589,7 @@ mnemon_load_category (mnemon_t *mnemon, char *path; category_t *category; int i; + struct stat st; path = xmalloc (strlen (mnemon->dir_name) + 1 + strlen (name) + 1); sprintf (path, "%s/%s", mnemon->dir_name, name); @@ -595,6 +601,12 @@ mnemon_load_category (mnemon_t *mnemon, exit (1); } + fstat (fileno(file), &st); + if (! S_ISREG(st.st_mode)) { + fprintf (stderr, "Error: File %s is not a regular file.\n", path); + exit (1); + } + category = mnemon_get_category (mnemon, name); #define READ_LINE do { \ @@ -665,6 +677,8 @@ mnemon_load_category (mnemon_t *mnemon, category->challenge_type = CHALLENGE_TYPE_AUDIO; } else if (strcmp (value, "midi") == 0) { category->challenge_type = CHALLENGE_TYPE_MIDI; + } else if (strcmp (value, "text-to-speech") == 0) { + category->challenge_type = CHALLENGE_TYPE_TEXT_TO_SPEECH; } else { fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n", value, path, line_count); @@ -1116,13 +1130,11 @@ mnemon_handle_response (mnemon_t *mnemon, (time_limit == 0.0 || response_time < time_limit)) { item->score++; - mnemon->to_master--; /* We reserve an item score of 0 for an item that has * never been asked. */ if (item->score == 0) { item->score = 1; mnemon->unlearned--; - mnemon->to_master--; printf ("You got it!"); } else if (item->score < 0) { printf ("Yes---just give me %d more.", @@ -1131,6 +1143,8 @@ mnemon_handle_response (mnemon_t *mnemon, printf ("On your first try, no less!"); } else { printf ("Masterful (%dx).", item->score); + if (mnemon->to_master) + mnemon->to_master--; } } else { if (! correct) @@ -1146,12 +1160,13 @@ mnemon_handle_response (mnemon_t *mnemon, printf (" Oops, you knew that, right? (%dx)\n ", item->score); mnemon->unlearned++; - /* We add three here, (rather than just 2 to track the - * change in the item's score below), as an extra - * penalty. If the user is forgetting stuff learned - * previously, then more time should be spent on mastering - * than learning new items. */ - mnemon->to_master += item->score + 3; + /* We increase to_master here as an extra penalty. If the + * user is forgetting stuff learned previously, then more + * time should be spent on mastering than learning new + * items. Note that we only do this during the initial + * phase while new items are still being introduced. */ + if (mnemon->to_introduce) + mnemon->to_master++; /* We go to -2 to force a little extra reinforcement * when re-learning an item, (otherwise, it will often * get asked again immediately where it is easy to get @@ -1159,7 +1174,6 @@ mnemon_handle_response (mnemon_t *mnemon, item->score = -2; } else { item->score--; - mnemon->to_master++; } } @@ -1208,6 +1222,9 @@ mnemon_show_challenge (mnemon_t *mnemon, case CHALLENGE_TYPE_MIDI: program = "timidity -Os"; break; + case CHALLENGE_TYPE_TEXT_TO_SPEECH: + program = "mnemon-tts"; + break; } xasprintf (&command, "%s %s/%s >/dev/null 2>&1 &", @@ -1335,11 +1352,22 @@ main (int argc, char *argv[]) mnemon_t mnemon; char *response; + void _load_categories() + { + if (argc > 1) { + int i; + for (i = 1; i < argc; i++) + mnemon_load_category (&mnemon, argv[i]); + } else { + mnemon_load (&mnemon); + } + } + srand (time (NULL)); mnemon_init (&mnemon); - mnemon_load (&mnemon); + _load_categories (); mnemon_do_challenges (&mnemon); @@ -1348,7 +1376,8 @@ main (int argc, char *argv[]) mnemon_fini (&mnemon); mnemon_init (&mnemon); - mnemon_load (&mnemon); + + _load_categories (); printf ("Great job.\nHere are your current results:\n"); mnemon_print_histogram (&mnemon, NULL, 0);