+ printf ("}");
+}
+
+static void
+show_message (void *ctx,
+ const notmuch_show_format_t *format,
+ notmuch_message_t *message,
+ int indent)
+{
+ fputs (format->message_start, stdout);
+ if (format->message)
+ format->message(ctx, message, indent);
+
+ fputs (format->header_start, stdout);
+ if (format->header)
+ format->header(ctx, message);
+ fputs (format->header_end, stdout);
+
+ fputs (format->body_start, stdout);
+ if (format->part)
+ show_message_body (notmuch_message_get_filename (message),
+ format);
+ fputs (format->body_end, stdout);
+
+ fputs (format->message_end, stdout);
+}
+
+
+static void
+show_messages (void *ctx,
+ const notmuch_show_format_t *format,
+ notmuch_messages_t *messages,
+ int indent,
+ notmuch_show_params_t *params)
+{
+ notmuch_message_t *message;
+ notmuch_bool_t match;
+ int first_set = 1;
+ int next_indent;
+
+ fputs (format->message_set_start, stdout);
+
+ for (;
+ notmuch_messages_valid (messages);
+ notmuch_messages_move_to_next (messages))
+ {
+ if (!first_set)
+ fputs (format->message_set_sep, stdout);
+ first_set = 0;
+
+ fputs (format->message_set_start, stdout);
+
+ message = notmuch_messages_get (messages);
+
+ match = notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH);
+
+ next_indent = indent;
+
+ if (match || params->entire_thread) {
+ show_message (ctx, format, message, indent);
+ next_indent = indent + 1;
+
+ fputs (format->message_set_sep, stdout);
+ }
+
+ show_messages (ctx,
+ format,
+ notmuch_message_get_replies (message),
+ next_indent,
+ params);
+
+ notmuch_message_destroy (message);
+
+ fputs (format->message_set_end, stdout);
+ }
+
+ fputs (format->message_set_end, stdout);
+}
+
+/* Formatted output of single message */
+static int
+do_show_single (void *ctx,
+ notmuch_query_t *query,
+ const notmuch_show_format_t *format,
+ notmuch_show_params_t *params)
+{
+ notmuch_messages_t *messages;
+ notmuch_message_t *message;
+
+ if (notmuch_query_count_messages (query) != 1) {
+ fprintf (stderr, "Error: search term did not match precisely one message.\n");
+ return 1;
+ }
+
+ messages = notmuch_query_search_messages (query);
+ message = notmuch_messages_get (messages);
+
+ if (message == NULL) {
+ fprintf (stderr, "Error: Cannot find matching message.\n");
+ return 1;
+ }
+
+ /* Special case for --format=raw of full single message, just cat out file */
+ if (params->raw) {
+
+ const char *filename;
+ FILE *file;
+ size_t size;
+ char buf[4096];
+
+ filename = notmuch_message_get_filename (message);
+ if (filename == NULL) {
+ fprintf (stderr, "Error: Cannot message filename.\n");
+ return 1;
+ }