]> git.cworth.org Git - mnemon/blobdiff - mnemon.c
Add support for running a session against specific input files.
[mnemon] / mnemon.c
index c334f22d7ef0915289fd9ed20f229fe9b700bd42..7f0526d8766beb410fd5a02caf6555817dba6f49 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -26,6 +26,7 @@
 
 #include <sys/types.h>
 #include <sys/time.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <errno.h>
@@ -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);