Use p_new instead of xmalloc()
[apps/madmutt.git] / pager.c
diff --git a/pager.c b/pager.c
index 982f7f3..a25490c 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -12,6 +12,7 @@
  */
 
 #include <lib-lib/lib-lib.h>
+#include <lib-crypt/crypt.h>
 
 #include <lib-ui/curses.h>
 #include <lib-ui/enter.h>
 #include "charset.h"
 #include "buffy.h"
 
-
 #include <imap/imap_private.h>
 
-#include <lib-crypt/crypt.h>
-
 #define ISHEADER(x) ((x) == MT_COLOR_HEADER || (x) == MT_COLOR_HDEFAULT)
 
-#define IsAttach(x) (x && (x)->bdy)
-#define IsRecvAttach(x) (x && (x)->bdy && (x)->fp)
-#define IsSendAttach(x) (x && (x)->bdy && !(x)->fp)
-#define IsMsgAttach(x) (x && (x)->fp && (x)->bdy && (x)->bdy->hdr)
-#define IsHeader(x) (x && (x)->hdr && !(x)->bdy)
-#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
-
-static const char *Not_available_in_this_menu =
-N_("Not available in this menu.");
-static const char *Mailbox_is_read_only = N_("Mailbox is read-only.");
-static const char *Function_not_permitted_in_attach_message_mode =
-N_("Function not permitted in attach-message mode.");
+#define IsAttach(x)      (x && (x)->bdy)
+#define IsRecvAttach(x)  (x && (x)->bdy && (x)->fp)
+#define IsSendAttach(x)  (x && (x)->bdy && !(x)->fp)
+#define IsMsgAttach(x)   (x && (x)->fp && (x)->bdy && (x)->bdy->hdr)
+#define IsHeader(x)      (x && (x)->hdr && !(x)->bdy)
+#define SW               (option(OPTMBOXPANE)?SidebarWidth:0)
 
 /* hack to return to position when returning from index to same message */
 static int TopLine = 0;
 static HEADER *OldHdr = NULL;
 
-#define CHECK_MODE(x)  if (!(x)) \
-                       { \
-                               mutt_flushinp (); \
-                               mutt_error _(Not_available_in_this_menu); \
-                               break; \
-                       }
-
-#define CHECK_READONLY if (Context->readonly) \
-                       { \
-                               mutt_flushinp (); \
-                               mutt_error _(Mailbox_is_read_only);     \
-                               break; \
-                       }
-
-#define CHECK_ATTACH if(option(OPTATTACHMSG)) \
-                    {\
-                       mutt_flushinp (); \
-                       mutt_error _(Function_not_permitted_in_attach_message_mode); \
-                       break; \
-                    }
+#define CHECK_MODE(x) \
+    if (!(x)) {                                         \
+        mutt_flushinp();                                \
+        mutt_error _("Not available in this menu.");    \
+        break;                                          \
+    }
+
+#define CHECK_READONLY \
+    if (Context->readonly) {                            \
+        mutt_flushinp();                                \
+        mutt_error _("Mailbox is read-only.");          \
+        break;                                          \
+    }
+
+#define CHECK_ATTACH \
+    if (option(OPTATTACHMSG)) {                         \
+        mutt_flushinp();                                \
+        mutt_error _("Function not permitted in attach-message mode."); \
+        break;                                          \
+    }
 
 struct q_class_t {
   int length;
@@ -121,37 +113,32 @@ static struct resize {
   int line;
   int SearchCompiled;
   int SearchBack;
-}     *Resize = NULL;
+} *Resize = NULL;
 #endif
 
 #define NumSigLines 4
 
-static int check_sig (const char *s, struct line_t *info, int n)
+static int check_sig(const char *s, struct line_t *info, int n)
 {
-  int count = 0;
+    int count = 0;
 
-  while (n > 0 && count <= NumSigLines) {
-    if (info[n].type != MT_COLOR_SIGNATURE)
-      break;
-    count++;
-    n--;
-  }
+    while (n > 0 && count <= NumSigLines) {
+        if (info[n].type != MT_COLOR_SIGNATURE)
+            break;
+        count++;
+        n--;
+    }
 
-  if (count == 0)
-    return (-1);
+    if (count == 0)
+        return -1;
 
-  if (count > NumSigLines) {
-    /* check for a blank line */
-    while (*s) {
-      if (!ISSPACE (*s))
-        return 0;
-      s++;
+    if (count > NumSigLines) {
+        /* check for a blank line */
+        s = skipspaces(s);
+        return *s ? -1 : 0;
     }
 
-    return (-1);
-  }
-
-  return (0);
+    return 0;
 }
 
 static void
@@ -174,9 +161,10 @@ resolve_color (struct line_t *lineInfo, int n, int cnt, int flags,
     }
     m = (lineInfo[n].syntax)[0].first;
     cnt += (lineInfo[n].syntax)[0].last;
-  }
-  else
+  } else {
     m = n;
+  }
+
   if (!(flags & M_SHOWCOLOR))
     def_color = ColorDefs[MT_COLOR_NORMAL];
   else if (lineInfo[m].type == MT_COLOR_HEADER)
@@ -209,8 +197,7 @@ resolve_color (struct line_t *lineInfo, int n, int cnt, int flags,
         color = (lineInfo[m].syntax)[i].color;
         break;
       }
-      /* don't break here, as cnt might be 
-       * in the next chunk as well */
+      /* don't break here, as cnt might be in the next chunk as well */
     }
   }
 
@@ -274,7 +261,7 @@ static void append_line (struct line_t *lineInfo, int n, int cnt)
   int m;
 
   lineInfo[n + 1].type = lineInfo[n].type;
-  (lineInfo[n + 1].syntax)[0].color = (lineInfo[n].syntax)[0].color;
+  lineInfo[n + 1].syntax[0].color = lineInfo[n].syntax[0].color;
   lineInfo[n + 1].continuation = 1;
 
   /* find the real start of the line */
@@ -415,8 +402,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
            * go down after this point
            */
           q_list = tmp->next;
-        }
-        else {
+        } else {
           /* found another branch for which tmp is a shorter prefix */
 
           /* save the next sibling for later */
@@ -447,14 +433,12 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
         /* we found a shorter prefix, so certain quotes have changed classes */
         *force_redraw = 1;
         continue;
-      }
-      else {
+      } else {
         /* shorter, but not a substring of the current class: try next */
         q_list = q_list->next;
         continue;
       }
-    }
-    else {
+    } else {
       /* case 2: try subclassing the current top level node */
 
       /* tmp != NULL means we already found a shorter prefix at case 1 */
@@ -512,8 +496,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
 
                 /* next class to test */
                 q_list = tmp->next;
-              }
-              else {
+              } else {
                 /* found another branch for which tmp is a shorter prefix */
 
                 /* save the next sibling for later */
@@ -543,13 +526,11 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
               /* we found a shorter prefix, so we need a redraw */
               *force_redraw = 1;
               continue;
-            }
-            else {
+            } else {
               q_list = q_list->next;
               continue;
             }
-          }
-          else {
+          } else {
             /* longer than the current prefix: try subclassing it */
             if (tmp == NULL
                 && m_strncmp(tail_qptr, (q_list->prefix) + offset,
@@ -563,8 +544,7 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
               tail_qptr = (char *) qptr + offset;
 
               continue;
-            }
-            else {
+            } else {
               /* nope, try the next prefix */
               q_list = q_list->next;
               continue;
@@ -588,15 +568,13 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList,
           new_class_color (tmp, q_level);
 
           return tmp;
-        }
-        else {
+        } else {
           if (lindex != -1)
             shift_class_colors (*QuoteList, tmp, lindex, q_level);
 
           return class;
         }
-      }
-      else {
+      } else {
         /* nope, try the next prefix */
         q_list = q_list->next;
         continue;
@@ -646,8 +624,7 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
     else if (n > 0 && (buf[0] == ' ' || buf[0] == '\t')) {
       lineInfo[n].type = lineInfo[n - 1].type;  /* wrapped line */
       (lineInfo[n].syntax)[0].color = (lineInfo[n - 1].syntax)[0].color;
-    }
-    else {
+    } else {
       lineInfo[n].type = MT_COLOR_HDEFAULT;
       color_line = ColorHdrList;
       while (color_line) {
@@ -669,7 +646,7 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
     i = n + 1;
 
     lineInfo[n].type = MT_COLOR_SIGNATURE;
-    while (i < last && check_sig (buf, lineInfo, i - 1) == 0 &&
+    while (i < last && check_sig(buf, lineInfo, i - 1) == 0 &&
            (lineInfo[i].type == MT_COLOR_NORMAL ||
             lineInfo[i].type == MT_COLOR_QUOTED ||
             lineInfo[i].type == MT_COLOR_HEADER)) {
@@ -681,7 +658,7 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
       lineInfo[i++].type = MT_COLOR_SIGNATURE;
     }
   }
-  else if (check_sig (buf, lineInfo, n - 1) == 0)
+  else if (check_sig(buf, lineInfo, n - 1) == 0)
     lineInfo[n].type = MT_COLOR_SIGNATURE;
   else if (regexec ((regex_t *) QuoteRegexp.rx, buf, 1, pmatch, 0) == 0) {
     if (regexec ((regex_t *) Smileys.rx, buf, 1, smatch, 0) == 0) {
@@ -700,25 +677,24 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
                                                 pmatch[0].rm_so, force_redraw,
                                                 q_level);
           lineInfo[n].type = MT_COLOR_QUOTED;
-        }
-        else
+        } else {
           lineInfo[n].type = MT_COLOR_NORMAL;
+        }
 
         buf[smatch[0].rm_so] = c;
-      }
-      else
+      } else {
         lineInfo[n].type = MT_COLOR_NORMAL;
-    }
-    else {
+      }
+    else {
       if (q_classify && lineInfo[n].quote == NULL)
         lineInfo[n].quote = classify_quote (QuoteList, buf + pmatch[0].rm_so,
                                             pmatch[0].rm_eo - pmatch[0].rm_so,
                                             force_redraw, q_level);
       lineInfo[n].type = MT_COLOR_QUOTED;
     }
-  }
-  else
+  } else {
     lineInfo[n].type = MT_COLOR_NORMAL;
+  }
 
   /* body patterns */
   if (lineInfo[n].type == MT_COLOR_NORMAL ||
@@ -755,9 +731,9 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
             }
             found = 1;
             null_rx = 0;
-          }
-          else
+          } else {
             null_rx = 1;        /* empty regexp; don't add it, but keep looking */
+          }
         }
         color_line = color_line->next;
       }
@@ -765,24 +741,24 @@ resolve_types (char *buf, char *rawbuf, struct line_t *lineInfo, int n, int last
       if (null_rx)
         offset++;               /* avoid degenerate cases */
       else
-        offset = (lineInfo[n].syntax)[i].last;
+        offset = lineInfo[n].syntax[i].last;
     } while (found || null_rx);
   }
 }
 
-static int is_ansi (unsigned char *buf)
+static int is_ansi(unsigned char *buf)
 {
-  while (*buf && (isdigit (*buf) || *buf == ';'))
-    buf++;
-  return (*buf == 'm');
+    while (isdigit(*buf) || *buf == ';')
+        buf++;
+    return (*buf == 'm');
 }
 
-static int check_attachment_marker (char *p)
+static int check_attachment_marker(char *p)
 {
-  char *q = AttachmentMarker;
+    char *q = AttachmentMarker;
 
-  for (; *p == *q && *q && *p && *q != '\a' && *p != '\a'; p++, q++);
-  return (int) (*p - *q);
+    for (; *p == *q && *q && *p && *q != '\a' && *p != '\a'; p++, q++);
+    return (int)(*p - *q);
 }
 
 static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a)
@@ -847,8 +823,7 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a)
         if (buf[pos + 1] != '9')
           a->bg = buf[pos + 1] - '0';
         pos += 3;
-      }
-      else {
+      } else {
         while (pos < x && buf[pos] != ';')
           pos++;
         pos++;
@@ -867,9 +842,9 @@ static int trim_incomplete_mbyte(unsigned char *buf, size_t len) {
   p_clear(&mbstate, 1);
   for (; len > 0; buf += k, len -= k) {
     k = mbrtowc (NULL, (char *) buf, len, &mbstate);
-    if (k == -2) 
-      break; 
-    else if (k == -1 || k == 0) 
+    if (k == -2)
+      break;
+    if (k == -1 || k == 0)
       k = 1;
   }
   *buf = '\0';
@@ -910,9 +885,9 @@ fill_buffer (FILE * f, off_t *last_pos, off_t offset, unsigned char *buf,
         else if (*(p + 1)) {    /* bold or overstrike */
           *(fmt - 1) = *(p + 1);
           p += 2;
-        }
-        else                    /* ^H */
+        } else {                  /* ^H */
           *fmt++ = *p++;
+        }
       }
       else if (*p == '\033' && *(p + 1) == '[' && is_ansi (p + 2)) {
         while (*p++ != 'm')     /* skip ANSI sequence */
@@ -922,9 +897,9 @@ fill_buffer (FILE * f, off_t *last_pos, off_t offset, unsigned char *buf,
                && check_attachment_marker ((char *) p) == 0) {
         while (*p++ != '\a')    /* skip pseudo-ANSI sequence */
           ;
-      }
-      else
+      } else {
         *fmt++ = *p++;
+      }
     }
     *fmt = 0;
   }
@@ -1008,8 +983,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
         else if (wc == '_' || wc1 == '_') {
           special |= A_UNDERLINE;
           wc = (wc1 == '_') ? wc : wc1;
-        }
-        else {
+        } else {
           /* special = 0; / * overstrike: nothing to do! */
           wc = wc1;
         }
@@ -1062,8 +1036,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
       col += 4;
       if (pa)
         printw ("\\%03o", wc);
-    }
-    else {
+    } else {
       if (col + 1 > wrap_cols)
         break;
       ++col;
@@ -1094,7 +1067,6 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf,
  *     0       normal exit, line was not displayed
  *     >0      normal exit, line was displayed
  */
-
 static int
 display_line (FILE * f, off_t *last_pos, struct line_t **lineInfo, int n,
               int *last, int *max, int flags, struct q_class_t **QuoteList,
@@ -1230,9 +1202,8 @@ display_line (FILE * f, off_t *last_pos, struct line_t **lineInfo, int n,
   }
 
   /* now chose a good place to break the line */
-  cnt =
-    format_line (lineInfo, n, buf, flags, 0, b_read, &ch, &vch, &col,
-                 &special);
+  cnt = format_line(lineInfo, n, buf, flags, 0, b_read, &ch, &vch, &col,
+                    &special);
   buf_ptr = buf + cnt;
 
   /* move the break point only if smart_wrap is set */
@@ -1249,9 +1220,9 @@ display_line (FILE * f, off_t *last_pos, struct line_t **lineInfo, int n,
           buf_ptr = buf + cnt;
         else
           cnt = ch + 1;
-      }
-      else
+      } else {
         buf_ptr = buf + cnt;    /* a very long word... */
+      }
     }
     if (!(flags & M_PAGER_NSKIP))
       /* skip leading blanks on the next line too */
@@ -1367,7 +1338,6 @@ static struct mapping_t PagerNewsHelpExtra[] = {
 #endif
 
 
-
 /* This pager is actually not so simple as it once was.  It now operates in
    two modes: one for viewing messages and the other for viewing help.  These
    can be distinguished by whether or not ``hdr'' is NULL.  The ``hdr'' arg
@@ -1378,8 +1348,8 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
 {
   static char searchbuf[STRING];
   char buffer[LONG_STRING];
-  char helpstr[SHORT_STRING * 2];
-  char tmphelp[SHORT_STRING * 2];
+  char helpstr[STRING * 2];
+  char tmphelp[STRING * 2];
   int maxLine, lastLine = 0;
   struct line_t *lineInfo;
   struct q_class_t *QuoteList = NULL;
@@ -1442,10 +1412,10 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
     (lineInfo[i].syntax)[0].first = (lineInfo[i].syntax)[0].last = -1;
   }
 
-  mutt_compile_help (helpstr, sizeof (helpstr), MENU_PAGER, PagerHelp);
+  mutt_compile_help (helpstr, sizeof(helpstr), MENU_PAGER, PagerHelp);
   if (IsHeader (extra)) {
     m_strcpy(tmphelp, sizeof(tmphelp), helpstr);
-    mutt_compile_help (buffer, sizeof (buffer), MENU_PAGER,
+    mutt_compile_help (buffer, sizeof(buffer), MENU_PAGER,
 #ifdef USE_NNTP
                        (Context
                         && (Context->magic == M_NNTP)) ? PagerNewsHelpExtra :
@@ -1455,8 +1425,8 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
   }
   if (!InHelp) {
     m_strcpy(tmphelp, sizeof(tmphelp), helpstr);
-    mutt_make_help (buffer, sizeof (buffer), _("Help"), MENU_PAGER, OP_HELP);
-    snprintf (helpstr, sizeof (helpstr), "%s %s", tmphelp, buffer);
+    mutt_make_help (buffer, sizeof(buffer), _("Help"), MENU_PAGER, OP_HELP);
+    snprintf (helpstr, sizeof(helpstr), "%s %s", tmphelp, buffer);
   }
 
   while (ch != -1) {
@@ -1484,8 +1454,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
         bodylen = helpoffset - bodyoffset;
         if (!option (OPTHELP))
           bodylen++;
-      }
-      else {
+      } else {
         helpoffset = 0;
         indexoffset = 1;
         statusoffset = LINES - 2;
@@ -1672,9 +1641,9 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
       else
         topline = TopLine;
       continue;
-    }
-    else
+    } else {
       OldHdr = NULL;
+    }
 
     ch = km_dokey (MENU_PAGER);
     if (ch != -1)
@@ -1704,8 +1673,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
 
         ch = -1;
         rc = OP_REFORMAT_WINCH;
-      }
-      else {
+      } else {
         for (i = 0; i < maxLine; i++) {
           lineInfo[i].offset = 0;
           lineInfo[i].type = -1;
@@ -1751,8 +1719,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
       else if (option (OPTPAGERSTOP)) {
         /* emulate "less -q" and don't go on to the next message. */
         mutt_error _("Bottom of message is shown.");
-      }
-      else {
+      } else {
         /* end of the current message, so display the next message. */
         rc = OP_MAIN_NEXT_UNDELETED;
         ch = -1;
@@ -1809,8 +1776,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra)
       else if (option (OPTPAGERSTOP)) {
         /* emulate "less -q" and don't go on to the next message. */
         mutt_error _("Bottom of message is shown.");
-      }
-      else {
+      } else {
         /* end of the current message, so display the next message. */
         rc = OP_MAIN_NEXT_UNDELETED;
         ch = -1;