diff -urNp -x '*.orig' slrn-1.0.3.org/doc/slrn.rc slrn-1.0.3/doc/slrn.rc --- slrn-1.0.3.org/doc/slrn.rc 2016-10-24 00:34:16.000000000 +0200 +++ slrn-1.0.3/doc/slrn.rc 2021-10-03 22:48:59.521057945 +0200 @@ -219,6 +219,11 @@ % display all the "X-"headers except "X-Trace:"). %visible_headers "From:,Subject:,Newsgroups:,Followup-To:,Reply-To:" +% If non-zero, visible headers are displayed in specific order. +% If 1, headers are arranged with respect to visible_headers order put above, +% If 2, the same as above with multiple matches sorted alphabetically. +%set visible_headers_sorting_method 2 + % If non-zero, #v+ and #v- will be interpreted as markers of verbatim lines. %set process_verbatim_marks 1 diff -urNp -x '*.orig' slrn-1.0.3.org/src/art.h slrn-1.0.3/src/art.h --- slrn-1.0.3.org/src/art.h 2016-10-24 00:34:16.000000000 +0200 +++ slrn-1.0.3/src/art.h 2021-10-03 22:48:59.521057945 +0200 @@ -46,6 +46,7 @@ extern int Slrn_Query_Next_Group; extern int Slrn_Auto_CC_To_Poster; extern int Slrn_Score_After_XOver; extern int Slrn_Use_Tmpdir; +extern int Slrn_Visible_Headers_Sorting_Mode; extern int Slrn_Wrap_Mode; extern int Slrn_Wrap_Width; extern int Slrn_Wrap_Method; diff -urNp -x '*.orig' slrn-1.0.3.org/src/art_misc.c slrn-1.0.3/src/art_misc.c --- slrn-1.0.3.org/src/art_misc.c 2016-10-24 00:34:16.000000000 +0200 +++ slrn-1.0.3/src/art_misc.c 2021-10-03 22:48:59.524391275 +0200 @@ -65,6 +65,8 @@ int Slrn_Wrap_Width = -1; static char *Super_Cite_Regexp = "^[^A-Za-z0-9]*\"\\([-_a-zA-Z/]+\\)\" == .+"; +int Slrn_Visible_Headers_Sorting_Mode = 2; + static void hide_article_lines (Slrn_Article_Type *a, unsigned int mask) /*{{{*/ { Slrn_Article_Line_Type *l; @@ -935,6 +937,157 @@ void _slrn_art_unhide_headers (Slrn_Arti /*}}}*/ +void _slrn_sort_visible_headers (Slrn_Article_Type *a) /*{{{*/ +{ + Slrn_Article_Line_Type *l, *lnext, *sorted, *sorted_last; + Slrn_Article_Line_Type *sorted_headers, *sorted_headers_last; + Visible_Header_Type *sortpos, *sortpos_better; + int is_better_match, sort_again; + char *colon, *colon_next; + + if (Slrn_Visible_Headers_Sorting_Mode < 1) return; + + sorted_headers = NULL; + sorted_headers_last = NULL; + sortpos = Visible_Headers; + + while (sortpos != NULL) + { + l = a->lines; + sorted = NULL; + sorted_last = NULL; + + while ((l != NULL) && (l->flags & HEADER_LINE)) + { + lnext = l->next; + if (0 == slrn_case_strncmp ((unsigned char *)l->buf, + (unsigned char *)sortpos->header, + sortpos->len)) + { + sortpos_better = sortpos->next; + is_better_match = 0; + while ((sortpos_better != NULL) && (is_better_match == 0)) + { + if (0 == slrn_case_strncmp ((unsigned char *)l->buf, + (unsigned char *)sortpos_better->header, + sortpos_better->len)) + { + if (sortpos_better->len >= sortpos->len) + is_better_match = 1; + } + sortpos_better = sortpos_better->next; + } + + if (is_better_match == 0) + { + if (l->prev != NULL) + l->prev->next = l->next; + else + a->lines = l->next; + + if (l->next != NULL) + l->next->prev = l->prev; + + if (sorted == NULL) + sorted = l; + else + { + sorted_last->next = l; + l->prev = sorted_last; + } + sorted_last = l; + } + } + l = lnext; + } + + if (Slrn_Visible_Headers_Sorting_Mode > 1) + { + if (sorted != sorted_last) + { + sort_again = 1; + while (sort_again) + { + sort_again = 0; + sorted->prev = NULL; + sorted_last->next = NULL; + l = sorted; + while (l != sorted_last) + { + lnext = l->next; + + colon = slrn_strbyte (l->buf, ':'); + if (colon != NULL) + *colon = 0; + + colon_next = slrn_strbyte (lnext->buf, ':'); + if (colon_next != NULL) + *colon_next = 0; + + if (0 < slrn_case_strcmp ((unsigned char *)l->buf, + (unsigned char *)lnext->buf)) + { + sort_again = 1; + if (l->prev != NULL) + l->prev->next = lnext; + else + sorted = lnext; + + lnext->prev = l->prev; + l->prev = lnext; + l->next = lnext->next; + lnext->next = l; + if (l->next != NULL) + l->next->prev = l; + else + sorted_last = l; + + lnext = l; + } + + if (colon != NULL) + *colon = ':'; + + if (colon_next != NULL) + *colon_next = ':'; + + l = lnext; + } + } + } + } + + if (sorted != NULL) + { + if (sorted_headers == NULL) + { + sorted_headers = sorted; + sorted_headers_last = sorted_last; + } + else + { + sorted_headers->prev = sorted_last; + sorted_last->next = sorted_headers; + sorted_headers = sorted; + } + } + sortpos = sortpos->next; + } + + if (sorted_headers != NULL) + { + sorted_headers_last->next = a->lines; + a->lines->prev = sorted_headers_last; + a->lines = sorted_headers; + a->cline = sorted_headers; + sorted_headers->prev = NULL; + } + + return; +} + +/*}}}*/ + int _slrn_art_unfold_header_lines (Slrn_Article_Type *a) /*{{{*/ { Slrn_Article_Line_Type *l; @@ -979,6 +1132,9 @@ int _slrn_art_unfold_header_lines (Slrn_ l = l->next; } + + _slrn_sort_visible_headers (a); + return 0; } diff -urNp -x '*.orig' slrn-1.0.3.org/src/startup.c slrn-1.0.3/src/startup.c --- slrn-1.0.3.org/src/startup.c 2021-10-03 22:48:59.367724784 +0200 +++ slrn-1.0.3/src/startup.c 2021-10-03 22:48:59.524391275 +0200 @@ -626,6 +626,7 @@ Slrn_Int_Var_Type Slrn_Int_Variables [] {"cc_followup", &Slrn_Auto_CC_To_Poster, NULL}, {"use_tmpdir", &Slrn_Use_Tmpdir, NULL}, {"sorting_method", &Slrn_Sorting_Mode, NULL}, + {"visible_headers_sorting_method", &Slrn_Visible_Headers_Sorting_Mode}, {"custom_sort_by_threads", &Slrn_Sort_By_Threads, NULL}, {"uncollapse_threads", &Slrn_Uncollapse_Threads, NULL}, {"read_active", &Slrn_List_Active_File, NULL},