X-Git-Url: https://git.cworth.org/git?p=mnemon;a=blobdiff_plain;f=mnemon.c;fp=mnemon.c;h=87e1fd08b6530089cca9d12270405d0b1569d1c7;hp=74eb2c0a036034f44cba334861845afc863d1e6b;hb=4afda67e5f06fd1a8e77459355a325a42cd2d594;hpb=f8f80304015cb290a550fdb7624a2531d8a10b06 diff --git a/mnemon.c b/mnemon.c index 74eb2c0..87e1fd0 100644 --- a/mnemon.c +++ b/mnemon.c @@ -35,6 +35,12 @@ #include #include +#define ASSERT_NOT_REACHED \ +do { \ + static const int NOT_REACHED = 0; \ + assert (NOT_REACHED); \ +} while (0) + typedef int bool_t; typedef struct _item { @@ -57,7 +63,8 @@ typedef enum { typedef enum { CHALLENGE_TYPE_TEXT, - CHALLENGE_TYPE_IMAGE + CHALLENGE_TYPE_IMAGE, + CHALLENGE_TYPE_AUDIO } 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_AUDIO: + fprintf (file, "audio"); + break; } 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; + } 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); @@ -1143,26 +1155,51 @@ mnemon_handle_response (mnemon_t *mnemon, } 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; + 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. */ - 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 -mnemon_hide_image (mnemon_t *mnemon) +mnemon_hide_challenge (mnemon_t *mnemon, challenge_type_t challenge_type) { 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. */ @@ -1223,28 +1260,14 @@ mnemon_do_challenges (mnemon_t *mnemon) 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); - if (category->challenge_type == CHALLENGE_TYPE_IMAGE) - mnemon_hide_image (mnemon); + mnemon_hide_challenge (mnemon, category->challenge_type); /* Terminate on EOF */ if (response == NULL) {