[PATCH 2/2] show: Simplify new text formatter code
Quoth Dmitry Kurochkin on Jan 31 at 3:37 am: > On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements > wrote: > > 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. > > --- > > Looks good to me. Two minor comments, which can be freely ignored, are > below. > > > notmuch-show.c | 88 > > +-- > > test/crypto|2 +- > > test/thread-naming | 16 +- > > 3 files changed, 32 insertions(+), 74 deletions(-) > > > > diff --git a/notmuch-show.c b/notmuch-show.c > > index 6a890b2..30f6501 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"; > > Others may disagree, but I would write this using the (? :) operator. > Not important, feel free to leave it as is. Normally I would, too, but when the condition is that long, I find it makes it more obtuse. > > > > + 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")) > >
Re: [PATCH 2/2] show: Simplify new text formatter code
Quoth Dmitry Kurochkin on Jan 31 at 3:37 am: On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements amdra...@mit.edu wrote: 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. --- Looks good to me. Two minor comments, which can be freely ignored, are below. notmuch-show.c | 88 +-- test/crypto|2 +- test/thread-naming | 16 +- 3 files changed, 32 insertions(+), 74 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 6a890b2..30f6501 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; Others may disagree, but I would write this using the (? :) operator. Not important, feel free to leave it as is. Normally I would, too, but when the condition is that long, I find it makes it more obtuse. + 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,20 @@ 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
[PATCH 2/2] show: Simplify new text formatter code
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements wrote: > 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. > --- Looks good to me. Two minor comments, which can be freely ignored, are below. > notmuch-show.c | 88 +-- > test/crypto|2 +- > test/thread-naming | 16 +- > 3 files changed, 32 insertions(+), 74 deletions(-) > > diff --git a/notmuch-show.c b/notmuch-show.c > index 6a890b2..30f6501 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"; Others may disagree, but I would write this using the (? :) operator. Not important, feel free to leave it as is. > > + 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,20 @@ 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); >
[PATCH 2/2] show: Simplify new text formatter code
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements wrote: > 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. > --- Looks good, works fine. Tomi
Re: [PATCH 2/2] show: Simplify new text formatter code
On Thu, 26 Jan 2012 01:55:26 -0500, Austin Clements amdra...@mit.edu wrote: 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. --- Looks good, works fine. Tomi ___ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch
[PATCH 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 | 88 +-- test/crypto|2 +- test/thread-naming | 16 +- 3 files changed, 32 insertions(+), 74 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 6a890b2..30f6501 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,20 @@ 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
[PATCH 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 | 88 +-- test/crypto|2 +- test/thread-naming | 16 +- 3 files changed, 32 insertions(+), 74 deletions(-) diff --git a/notmuch-show.c b/notmuch-show.c index 6a890b2..30f6501 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,20 @@ 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)); }