[PATCH v2 2/2] show: Simplify new text formatter code
This makes the text formatter take advantage of the new code structure. The previously duplicated header logic is now unified, several things that we used to compute repeatedly across different callbacks are now computed once, and the code is simpler overall and 32% shorter. Unifying the header logic causes this to format some dates slightly differently, so the two affected test cases are updated. --- notmuch-show.c | 85 +--- test/crypto|2 +- test/thread-naming | 16 +- 3 files changed, 30 insertions(+), 73 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 6a890b2..816e0f8 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node, GMimeObject *meta = node-envelope_part ? GMIME_OBJECT (node-envelope_part) : node-part; GMimeContentType *content_type = g_mime_object_get_content_type (meta); +const notmuch_bool_t leaf = GMIME_IS_PART (node-part); +const char *part_type; int i; if (node-envelope_file) { notmuch_message_t *message = node-envelope_file; - const char *headers[] = { - Subject, From, To, Cc, Bcc, Date - }; - const char *name, *value; - unsigned int i; - printf (\fmessage{ ); - printf (id:%s depth:%d match:%d filename:%s\n, + part_type = message; + printf (\f%s{ id:%s depth:%d match:%d filename:%s\n, + part_type, notmuch_message_get_message_id (message), indent, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH), notmuch_message_get_filename (message)); - - printf (\fheader{\n); - - printf (%s\n, _get_one_line_summary (ctx, message)); - - for (i = 0; i ARRAY_SIZE (headers); i++) { - name = headers[i]; - value = notmuch_message_get_header (message, name); - if (value strlen (value)) - printf (%s: %s\n, name, value); - } - printf (\fheader}\n); } else { GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta); const char *cid = g_mime_object_get_content_id (meta); + const char *filename = leaf ? + g_mime_part_get_filename (GMIME_PART (node-part)) : NULL; if (disposition strcmp (disposition-disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) - { - printf (\fattachment{ ID: %d, node-part_num); - - } else { - - printf (\fpart{ ID: %d, node-part_num); - } - - if (GMIME_IS_PART (node-part)) - { - const char *filename = g_mime_part_get_filename (GMIME_PART (node-part)); - if (filename) - printf (, Filename: %s, filename); - } + part_type = attachment; + else + part_type = part; + printf (\f%s{ ID: %d, part_type, node-part_num); + if (filename) + printf (, Filename: %s, filename); if (cid) printf (, Content-id: %s, cid); - printf (, Content-type: %s\n, g_mime_content_type_to_string (content_type)); } -if (node-envelope_part) { +if (GMIME_IS_MESSAGE (node-part)) { GMimeMessage *message = GMIME_MESSAGE (node-part); InternetAddressList *recipients; const char *recipients_string; printf (\fheader{\n); + if (node-envelope_file) + printf (%s\n, _get_one_line_summary (ctx, node-envelope_file)); printf (Subject: %s\n, g_mime_message_get_subject (message)); printf (From: %s\n, g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); @@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node, printf (Cc: %s\n, recipients_string); printf (Date: %s\n, g_mime_message_get_date_as_string (message)); printf (\fheader}\n); + + printf (\fbody{\n); } -if (!node-envelope_file) { +if (leaf) { if (g_mime_content_type_is_type (content_type, text, *) !g_mime_content_type_is_type (content_type, text, html)) { @@ -810,45 +793,19 @@ format_part_text (const void *ctx, mime_node_t *node, g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); show_text_part_content (node-part, stream_stdout); g_object_unref(stream_stdout); - } - else if (g_mime_content_type_is_type (content_type, multipart, *) || -g_mime_content_type_is_type (content_type, message, rfc822)) - { - /* Do nothing for multipart since its content will be printed -* when recursing. */ - } - else - { + } else { printf (Non-text part: %s\n, g_mime_content_type_to_string (content_type)); }
[PATCH v2 2/2] show: Simplify new text formatter code
This makes the text formatter take advantage of the new code structure. The previously duplicated header logic is now unified, several things that we used to compute repeatedly across different callbacks are now computed once, and the code is simpler overall and 32% shorter. Unifying the header logic causes this to format some dates slightly differently, so the two affected test cases are updated. --- notmuch-show.c | 85 +--- test/crypto|2 +- test/thread-naming | 16 +- 3 files changed, 30 insertions(+), 73 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 6a890b2..816e0f8 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -727,67 +727,48 @@ format_part_text (const void *ctx, mime_node_t *node, GMimeObject *meta = node->envelope_part ? GMIME_OBJECT (node->envelope_part) : node->part; GMimeContentType *content_type = g_mime_object_get_content_type (meta); +const notmuch_bool_t leaf = GMIME_IS_PART (node->part); +const char *part_type; int i; if (node->envelope_file) { notmuch_message_t *message = node->envelope_file; - const char *headers[] = { - "Subject", "From", "To", "Cc", "Bcc", "Date" - }; - const char *name, *value; - unsigned int i; - printf ("\fmessage{ "); - printf ("id:%s depth:%d match:%d filename:%s\n", + part_type = "message"; + printf ("\f%s{ id:%s depth:%d match:%d filename:%s\n", + part_type, notmuch_message_get_message_id (message), indent, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH), notmuch_message_get_filename (message)); - - printf ("\fheader{\n"); - - printf ("%s\n", _get_one_line_summary (ctx, message)); - - for (i = 0; i < ARRAY_SIZE (headers); i++) { - name = headers[i]; - value = notmuch_message_get_header (message, name); - if (value && strlen (value)) - printf ("%s: %s\n", name, value); - } - printf ("\fheader}\n"); } else { GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta); const char *cid = g_mime_object_get_content_id (meta); + const char *filename = leaf ? + g_mime_part_get_filename (GMIME_PART (node->part)) : NULL; if (disposition && strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) - { - printf ("\fattachment{ ID: %d", node->part_num); - - } else { - - printf ("\fpart{ ID: %d", node->part_num); - } - - if (GMIME_IS_PART (node->part)) - { - const char *filename = g_mime_part_get_filename (GMIME_PART (node->part)); - if (filename) - printf (", Filename: %s", filename); - } + part_type = "attachment"; + else + part_type = "part"; + printf ("\f%s{ ID: %d", part_type, node->part_num); + if (filename) + printf (", Filename: %s", filename); if (cid) printf (", Content-id: %s", cid); - printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type)); } -if (node->envelope_part) { +if (GMIME_IS_MESSAGE (node->part)) { GMimeMessage *message = GMIME_MESSAGE (node->part); InternetAddressList *recipients; const char *recipients_string; printf ("\fheader{\n"); + if (node->envelope_file) + printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file)); printf ("Subject: %s\n", g_mime_message_get_subject (message)); printf ("From: %s\n", g_mime_message_get_sender (message)); recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); @@ -800,9 +781,11 @@ format_part_text (const void *ctx, mime_node_t *node, printf ("Cc: %s\n", recipients_string); printf ("Date: %s\n", g_mime_message_get_date_as_string (message)); printf ("\fheader}\n"); + + printf ("\fbody{\n"); } -if (!node->envelope_file) { +if (leaf) { if (g_mime_content_type_is_type (content_type, "text", "*") && !g_mime_content_type_is_type (content_type, "text", "html")) { @@ -810,45 +793,19 @@ format_part_text (const void *ctx, mime_node_t *node, g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); show_text_part_content (node->part, stream_stdout); g_object_unref(stream_stdout); - } - else if (g_mime_content_type_is_type (content_type, "multipart", "*") || -g_mime_content_type_is_type (content_type, "message", "rfc822")) - { - /* Do nothing for multipart since its content will be printed -* when recursing. */ - } - else - { + } else { printf