#include <sys/types.h>
#include <sys/time.h>
+#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
/* 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, '=');
category_print (category, file);
+ fsync (fileno (file));
fclose (file);
err = rename (lock_filename, filename);
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];
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);
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,
(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));
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;
}