]> git.cworth.org Git - mnemon/blobdiff - mnemon.c
Add support for audio challenges as well.
[mnemon] / mnemon.c
index 74eb2c0a036034f44cba334861845afc863d1e6b..87e1fd08b6530089cca9d12270405d0b1569d1c7 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
 #include <readline/readline.h>
 #include <readline/history.h>
 
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#define ASSERT_NOT_REACHED             \
+do {                                   \
+    static const int NOT_REACHED = 0;  \
+    assert (NOT_REACHED);              \
+} while (0)
+
 typedef int bool_t;
 
 typedef struct _item {
 typedef int bool_t;
 
 typedef struct _item {
@@ -57,7 +63,8 @@ typedef enum {
 
 typedef enum {
     CHALLENGE_TYPE_TEXT,
 
 typedef enum {
     CHALLENGE_TYPE_TEXT,
-    CHALLENGE_TYPE_IMAGE
+    CHALLENGE_TYPE_IMAGE,
+    CHALLENGE_TYPE_AUDIO
 } challenge_type_t;
 
 typedef struct _category {
 } challenge_type_t;
 
 typedef struct _category {
@@ -278,6 +285,9 @@ category_print (category_t  *category,
     case CHALLENGE_TYPE_IMAGE:
        fprintf (file, "image");
        break;
     case CHALLENGE_TYPE_IMAGE:
        fprintf (file, "image");
        break;
+    case CHALLENGE_TYPE_AUDIO:
+       fprintf (file, "audio");
+       break;
     }
     fprintf (file, "\n\n");
 
     }
     fprintf (file, "\n\n");
 
@@ -642,6 +652,8 @@ mnemon_load_category (mnemon_t              *mnemon,
                category->challenge_type = CHALLENGE_TYPE_TEXT;
            } else if (strcmp (value, "image") == 0) {
                category->challenge_type = CHALLENGE_TYPE_IMAGE;
                category->challenge_type = CHALLENGE_TYPE_TEXT;
            } else if (strcmp (value, "image") == 0) {
                category->challenge_type = CHALLENGE_TYPE_IMAGE;
+           } else if (strcmp (value, "audio") == 0) {
+               category->challenge_type = CHALLENGE_TYPE_AUDIO;
            } else {
                fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n",
                         value, path, line_count);
            } else {
                fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n",
                         value, path, line_count);
@@ -1143,26 +1155,51 @@ mnemon_handle_response (mnemon_t        *mnemon,
 }
 
 static void
 }
 
 static void
-mnemon_show_image (mnemon_t *mnemon, const char *filename)
+mnemon_show_challenge (mnemon_t *mnemon,
+                      challenge_type_t challenge_type,
+                      const char *challenge)
 {
 {
+    const char *program;
     char *command;
 
     char *command;
 
+    if (challenge_type == CHALLENGE_TYPE_TEXT) {
+       printf ("%s\n", challenge);
+       return;
+    }
+
     /* XXX: Yes, shelling out to system is total cheese. The planned
      * fix here is to bring graphical display in process, (or at least
      * have a custom external program that accepts image filenames on
      * stdin.
      */
     /* XXX: Yes, shelling out to system is total cheese. The planned
      * fix here is to bring graphical display in process, (or at least
      * have a custom external program that accepts image filenames on
      * stdin.
      */
-    xasprintf (&command, "xli -gamma 2.2 %s >/dev/null 2>&1 &",
-              filename);
+    switch (challenge_type) {
+    case CHALLENGE_TYPE_TEXT:
+       ASSERT_NOT_REACHED;
+       break;
+    case CHALLENGE_TYPE_IMAGE:
+       program = "xli -gamma 2.2";
+       break;
+    case CHALLENGE_TYPE_AUDIO:
+       program = "play";
+       break;
+    }
+
+    xasprintf (&command, "%s %s/%s >/dev/null 2>&1 &",
+              program,
+              mnemon->dir_name,
+              challenge);
     system (command);
     free (command);
 }
 
 static void
     system (command);
     free (command);
 }
 
 static void
-mnemon_hide_image (mnemon_t *mnemon)
+mnemon_hide_challenge (mnemon_t *mnemon, challenge_type_t challenge_type)
 {
     char * command;
 
 {
     char * command;
 
+    if (challenge_type != CHALLENGE_TYPE_IMAGE)
+       return;
+
     /* XXX: And this is just embarrassing (obviously wrong in several
      * ways). Hopefully I'll amend away any commit that includes this.
      */
     /* XXX: And this is just embarrassing (obviously wrong in several
      * ways). Hopefully I'll amend away any commit that includes this.
      */
@@ -1223,28 +1260,14 @@ mnemon_do_challenges (mnemon_t *mnemon)
                free (response);
            }
 
                free (response);
            }
 
-           switch (category->challenge_type) {
-           case CHALLENGE_TYPE_TEXT:
-               printf ("%s\n", item->challenge);
-               break;
-           case CHALLENGE_TYPE_IMAGE:
-               {
-                   char *absolute_filename;
-
-                   xasprintf (&absolute_filename, "%s/%s",
-                              mnemon->dir_name, item->challenge);
-                   mnemon_show_image (mnemon, absolute_filename);
-                   free (absolute_filename);
-               }
-               break;
-           }
+           mnemon_show_challenge (mnemon, category->challenge_type,
+                                  item->challenge);
 
            gettimeofday (&start, NULL);
            response = readline ("> ");
            gettimeofday (&end, NULL);
 
 
            gettimeofday (&start, NULL);
            response = readline ("> ");
            gettimeofday (&end, NULL);
 
-           if (category->challenge_type == CHALLENGE_TYPE_IMAGE)
-               mnemon_hide_image (mnemon);
+           mnemon_hide_challenge (mnemon, category->challenge_type);
 
            /* Terminate on EOF */
            if (response == NULL) {
 
            /* Terminate on EOF */
            if (response == NULL) {