{
int i = bin - mnemon->bins;
+ bin_fini (bin);
+
memmove (bin, bin + 1, (mnemon->num_bins - i) * sizeof (bin_t));
mnemon->num_bins--;
}
printf ("\n");
do {
- do {
- mnemon_select_item (mnemon, &bin, &item_index);
- } while (bin->count == 0 && to_introduce == 0);
+ mnemon_select_item (mnemon, &bin, &item_index);
if (bin->count == 0)
to_introduce--;
correct = (strcmp (response, item->response) == 0);
bin_remove_item (bin, item_index);
- if (bin->num_items == 0)
+
+ /* If the bin is now empty, we must remove it. Also if we just
+ * picked the last word we'll ever pick from the bin with
+ * count 0, then we can remove that as well. */
+ if (bin->num_items == 0 ||
+ (bin->count == 0 && to_introduce == 0))
+ {
mnemon_remove_bin (mnemon, bin);
+ }
if (correct) {
item->count++;
} else if (item->count < 0) {
printf ("Yes---just give me %d more.",
- item->count);
+ } else if (item->count == 1) {
+ printf ("On your first try, no less!");
} else {
printf ("Masterful.");
}
} else {
printf (" %s is the correct answer.",
item->response);
+ if (item->count >= 0)
+ unlearned++;
item->count--;
/* Penalize an incorrect response by forcing the count
* negative. */
if (item->count >= 0) {
item->count = -1;
- unlearned++;
printf ( " Oops, you knew that, right?\n ");
}
}
printf (" (");
if (to_introduce)
- printf ("%d to come. ", to_introduce);
+ printf ("%d to come.", to_introduce);
+ if (to_introduce && unlearned)
+ printf (" ");
if (unlearned)
printf ("%d still unlearned.", unlearned);
if (to_introduce == 0 && unlearned == 0)