]> git.cworth.org Git - mnemon/blobdiff - mnemon.c
Recognize '-' as a numeric characeter as well
[mnemon] / mnemon.c
index 4c5acd26287ce381e13a25efa86c81eb800536da..33f2c260132a6efff082da9989da5ca6be6ef739 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -26,6 +26,7 @@
 
 #include <sys/types.h>
 #include <sys/time.h>
+#include <unistd.h>
 #include <dirent.h>
 #include <errno.h>
 #include <string.h>
@@ -577,7 +578,7 @@ mnemon_load_category (mnemon_t              *mnemon,
 
        /* An initial digit means we hit an item. Trigger the
         * spaghetti machine. */
-       if (*line >= '0' && *line <= '9')
+       if ((*line >= '0' && *line <= '9') || *line == '-')
            goto PARSE_BIN;
 
        equal = strchr (line, '=');
@@ -730,6 +731,7 @@ mnemon_save (mnemon_t *mnemon)
 
        category_print (category, file);
 
+       fsync (fileno (file));
        fclose (file);
 
        err = rename (lock_filename, filename);
@@ -863,9 +865,20 @@ mnemon_select_item (mnemon_t        *mnemon,
     category_t *category;
 
     bin_index = rand_within_exponential (mnemon->num_bins);
-
     bin = &mnemon->bins[bin_index];
 
+    /* The most intuitive understanding of the to_introduce counter is
+     * that it's tracking never-before-learned items as they are
+     * pulled from the bin with score 0. But that bin can become
+     * empty. So the refined rule is that we decrement to_introduce
+     * whenever we pull from the lowest-indexed bin with a
+     * non-negative score. */
+    if (mnemon->to_introduce && bin->score >=0 &&
+       (bin_index == 0 || mnemon->bins[bin_index-1].score < 0))
+    {
+       mnemon->to_introduce--;
+    }
+
     item_index = rand_within (bin->num_items);
 
     item = bin->items[item_index];
@@ -1146,12 +1159,10 @@ mnemon_do_challenges (mnemon_t *mnemon)
        mnemon_select_item (mnemon, &bin, &item_index, &category);
        item = bin->items[item_index];
 
-       if (bin->score == 0)
-           mnemon->to_introduce--;
-
        while (1) {
            if (category->time_limit > 0.0) {
-               readline ("The next one is timed. Press enter when ready:");
+               response = readline ("The next one is timed. Press enter when ready:");
+               free (response);
            }
                
            printf ("%s\n", item->challenge);
@@ -1166,10 +1177,12 @@ mnemon_do_challenges (mnemon_t *mnemon)
                return;
            }
 
-           if (response[0] == '/')
+           if (response[0] == '/') {
                mnemon_handle_command (mnemon, response + 1);
-           else
+               free (response);
+           } else {
                break;
+           }
        }
 
        mnemon_handle_response (mnemon, bin, item_index,
@@ -1177,17 +1190,17 @@ mnemon_do_challenges (mnemon_t *mnemon)
                                (end.tv_sec + end.tv_usec / 1e6) -
                                (start.tv_sec + start.tv_usec / 1e6),
                                category->time_limit);
+       free (response);
     } while (mnemon->to_introduce ||
             mnemon->unlearned ||
             mnemon->to_master > 0);
-
-    printf ("Great job.\n");
 }
 
 int
 main (int argc, char *argv[])
 {
     mnemon_t mnemon;
+    char *response;
 
     srand (time (NULL));
 
@@ -1201,5 +1214,15 @@ main (int argc, char *argv[])
 
     mnemon_fini (&mnemon);
 
+    mnemon_init (&mnemon);
+    mnemon_load (&mnemon);
+
+    printf ("Great job.\nHere are your current results:\n");
+    mnemon_print_histogram (&mnemon, NULL, 0);
+    response = readline ("Press enter to quit.\n");
+    free (response);
+
+    mnemon_fini (&mnemon);
+
     return 0;
 }