X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=pager.c;h=d3a4b4ee883363f5e0b67251735f10e71381cc57;hb=a8477ebaa09990b3688164cbe5cf661c4189541d;hp=8c01daa73af7122ebcbc8c3c8473f4d08a16c012;hpb=9a1805afc94b21d8766e6e67ef57f92aaf966e84;p=apps%2Fmadmutt.git diff --git a/pager.c b/pager.c index 8c01daa..d3a4b4e 100644 --- a/pager.c +++ b/pager.c @@ -39,6 +39,7 @@ #include "lib/intl.h" #include "lib/str.h" #include "lib/rx.h" +#include "lib/debug.h" #include #include @@ -380,7 +381,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList, if (length <= q_list->length) { /* case 1: check the top level nodes */ - if (safe_strncmp (qptr, q_list->prefix, length) == 0) { + if (str_ncmp (qptr, q_list->prefix, length) == 0) { if (length == q_list->length) return q_list; /* same prefix: return the current class */ @@ -469,7 +470,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList, /* tmp != NULL means we already found a shorter prefix at case 1 */ if (tmp == NULL - && safe_strncmp (qptr, q_list->prefix, q_list->length) == 0) { + && str_ncmp (qptr, q_list->prefix, q_list->length) == 0) { /* ok, it's a subclass somewhere on this branch */ ptr = q_list; @@ -481,7 +482,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList, while (q_list) { if (length <= q_list->length) { - if (safe_strncmp (tail_qptr, (q_list->prefix) + offset, tail_lng) + if (str_ncmp (tail_qptr, (q_list->prefix) + offset, tail_lng) == 0) { /* same prefix: return the current class */ if (length == q_list->length) @@ -565,7 +566,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList, else { /* longer than the current prefix: try subclassing it */ if (tmp == NULL - && safe_strncmp (tail_qptr, (q_list->prefix) + offset, + && str_ncmp (tail_qptr, (q_list->prefix) + offset, q_list->length - offset) == 0) { /* still a subclass: go down one level */ ptr = q_list; @@ -671,17 +672,17 @@ resolve_types (char *buf, char *raw, struct line_t *lineInfo, int n, int last, } } } - else if (safe_strncmp ("\033[0m", raw, 4) == 0) /* a little hack... */ + else if (str_ncmp ("\033[0m", raw, 4) == 0) /* a little hack... */ lineInfo[n].type = MT_COLOR_NORMAL; #if 0 - else if (safe_strncmp ("[-- ", buf, 4) == 0) + else if (str_ncmp ("[-- ", buf, 4) == 0) lineInfo[n].type = MT_COLOR_ATTACHMENT; #else else if (check_attachment_marker ((char *) raw) == 0) lineInfo[n].type = MT_COLOR_ATTACHMENT; #endif - else if (safe_strcmp ("-- \n", buf) == 0 - || safe_strcmp ("-- \r\n", buf) == 0) { + else if (str_cmp ("-- \n", buf) == 0 + || str_cmp ("-- \r\n", buf) == 0) { i = n + 1; lineInfo[n].type = MT_COLOR_SIGNATURE; @@ -877,6 +878,24 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a) return pos; } +/* trim tail of buf so that it contains complete multibyte characters */ +static int trim_incomplete_mbyte(unsigned char *buf, size_t len) { + mbstate_t mbstate; + size_t k; + + memset (&mbstate, 0, sizeof (mbstate)); + for (; len > 0; buf += k, len -= k) { + k = mbrtowc (NULL, (char *) buf, len, &mbstate); + if (k == -2) + break; + else if (k == -1 || k == 0) + k = 1; + } + *buf = '\0'; + + return len; +} + static int fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, unsigned char *fmt, size_t blen, int *buf_ready) @@ -896,6 +915,11 @@ fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, b_read = (int) (*last_pos - offset); *buf_ready = 1; + /* incomplete mbyte characters trigger a segfault in regex processing for + * certain versions of glibc. Trim them if necessary. */ + if (b_read == blen - 2) + b_read -= trim_incomplete_mbyte(buf, b_read); + /* copy "buf" to "fmt", but without bold and underline controls */ p = buf; while (*p) { @@ -915,7 +939,7 @@ fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, } else if (*p == '\033' && *(p + 1) == ']' && check_attachment_marker ((char *) p) == 0) { - dprint (2, (debugfile, "fill_buffer: Seen attachment marker.\n")); + debug_print (2, ("seen attachment marker.\n")); while (*p++ != '\a') /* skip pseudo-ANSI sequence */ ; } @@ -974,8 +998,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf, k = mbrtowc (&wc, (char *) buf + ch, cnt - ch, &mbstate); if (k == -2 || k == -1) { - dprint (1, (debugfile, "%s:%d: mbrtowc returned %d; errno = %d.\n", - __FILE__, __LINE__, k, errno)); + debug_print (1, ("mbrtowc returned %d; errno = %d.\n", k, errno)); if (col + 4 > wrap_cols) break; col += 4; @@ -1245,7 +1268,11 @@ display_line (FILE * f, long *last_pos, struct line_t **lineInfo, int n, /* skip trailing blanks */ while (ch && (buf[ch] == ' ' || buf[ch] == '\t' || buf[ch] == '\r')) ch--; - cnt = ch + 1; + /* a very long word with leading spaces causes infinite wrapping */ + if ((!ch) && (flags & M_PAGER_NSKIP)) + buf_ptr = buf + cnt; + else + cnt = ch + 1; } else buf_ptr = buf + cnt; /* a very long word... */ @@ -1650,9 +1677,11 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), option (OPTSTATUSONTOP) ? 0 : SidebarWidth); SETCOLOR (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STATUS); mutt_paddstr (COLS - (option (OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); SETCOLOR (MT_COLOR_NORMAL); + BKGDSET (MT_COLOR_NORMAL); } /* if we're not using the index, update every time */ if (index == 0) @@ -2298,7 +2327,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) else followup_to = extra->hdr->env->followup_to; - if (!followup_to || safe_strcasecmp (followup_to, "poster") || + if (!followup_to || str_casecmp (followup_to, "poster") || query_quadoption (OPT_FOLLOWUPTOPOSTER, _("Reply by mail as poster prefers?")) != M_YES) { if (extra->ctx && extra->ctx->magic == M_NNTP