Rocco Rutte:
[apps/madmutt.git] / handler.c
index 505fb38..4ba746c 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -26,6 +26,8 @@
 #include "copy.h"
 #include "charset.h"
 #include "mutt_crypt.h"
+#include "state.h"
+#include "attach.h"
 #include "lib.h"
 
 #include "lib/mem.h"
 #include "lib/str.h"
 #include "lib/debug.h"
 
-#define BUFI_SIZE 1000
-#define BUFO_SIZE 2000
-
-
 typedef void handler_f (BODY *, STATE *);
 typedef handler_f *handler_t;
 
@@ -62,52 +60,6 @@ int Index_64[128] = {
   41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
 };
 
-static void state_prefix_put (const char *d, size_t dlen, STATE * s)
-{
-  if (s->prefix)
-    while (dlen--)
-      state_prefix_putc (*d++, s);
-  else
-    fwrite (d, dlen, 1, s->fpout);
-}
-
-void mutt_convert_to_state (iconv_t cd, char *bufi, size_t * l, STATE * s)
-{
-  char bufo[BUFO_SIZE];
-  ICONV_CONST char *ib;
-  char *ob;
-  size_t ibl, obl;
-
-  if (!bufi) {
-    if (cd != (iconv_t) (-1)) {
-      ob = bufo, obl = sizeof (bufo);
-      iconv (cd, 0, 0, &ob, &obl);
-      if (ob != bufo)
-        state_prefix_put (bufo, ob - bufo, s);
-    }
-    if (Quotebuf[0] != '\0')
-      state_prefix_putc ('\n', s);
-    return;
-  }
-
-  if (cd == (iconv_t) (-1)) {
-    state_prefix_put (bufi, *l, s);
-    *l = 0;
-    return;
-  }
-
-  ib = bufi, ibl = *l;
-  for (;;) {
-    ob = bufo, obl = sizeof (bufo);
-    mutt_iconv (cd, &ib, &ibl, &ob, &obl, 0, "?");
-    if (ob == bufo)
-      break;
-    state_prefix_put (bufo, ob - bufo, s);
-  }
-  memmove (bufi, ib, ibl);
-  *l = ibl;
-}
-
 void mutt_decode_xbit (STATE * s, long len, int istext, iconv_t cd)
 {
   int c, ch;
@@ -242,7 +194,7 @@ void mutt_decode_quoted (STATE * s, long len, int istext, iconv_t cd)
     if (fgets (line, MIN ((ssize_t) sizeof (line), len + 1), s->fpin) == NULL)
       break;
 
-    linelen = mutt_strlen (line);
+    linelen = str_len (line);
     len -= linelen;
 
     /*
@@ -369,15 +321,15 @@ void mutt_decode_uuencoded (STATE * s, long len, int istext, iconv_t cd)
   while (len > 0) {
     if ((fgets (tmps, sizeof (tmps), s->fpin)) == NULL)
       return;
-    len -= mutt_strlen (tmps);
-    if ((!safe_strncmp (tmps, "begin", 5)) && ISSPACE (tmps[5]))
+    len -= str_len (tmps);
+    if ((!str_ncmp (tmps, "begin", 5)) && ISSPACE (tmps[5]))
       break;
   }
   while (len > 0) {
     if ((fgets (tmps, sizeof (tmps), s->fpin)) == NULL)
       return;
-    len -= mutt_strlen (tmps);
-    if (!safe_strncmp (tmps, "end", 3))
+    len -= str_len (tmps);
+    if (!str_ncmp (tmps, "end", 3))
       break;
     pt = tmps;
     linelen = decode_byte (*pt);
@@ -517,7 +469,7 @@ static void enriched_wrap (struct enriched_state *stte)
   stte->indent_len = 0;
   if (stte->s->prefix) {
     state_puts (stte->s->prefix, stte->s);
-    stte->indent_len += mutt_strlen (stte->s->prefix);
+    stte->indent_len += str_len (stte->s->prefix);
   }
 
   if (stte->tag_level[RICH_EXCERPT]) {
@@ -525,11 +477,11 @@ static void enriched_wrap (struct enriched_state *stte)
     while (x) {
       if (stte->s->prefix) {
         state_puts (stte->s->prefix, stte->s);
-        stte->indent_len += mutt_strlen (stte->s->prefix);
+        stte->indent_len += str_len (stte->s->prefix);
       }
       else {
         state_puts ("> ", stte->s);
-        stte->indent_len += mutt_strlen ("> ");
+        stte->indent_len += str_len ("> ");
       }
       x--;
     }
@@ -559,7 +511,7 @@ static void enriched_flush (struct enriched_state *stte, int wrap)
     stte->line_used += stte->buff_used;
     if (stte->line_used > stte->line_max) {
       stte->line_max = stte->line_used;
-      safe_realloc (&stte->line, stte->line_max + 1);
+      mem_realloc (&stte->line, stte->line_max + 1);
     }
     strcat (stte->line, stte->buffer);  /* __STRCAT_CHECKED__ */
     stte->line_len += stte->word_len;
@@ -576,7 +528,7 @@ static void enriched_putc (int c, struct enriched_state *stte)
   if (stte->tag_level[RICH_PARAM]) {
     if (stte->tag_level[RICH_COLOR]) {
       if (stte->param_used + 1 >= stte->param_len)
-        safe_realloc (&stte->param, (stte->param_len += STRING));
+        mem_realloc (&stte->param, (stte->param_len += STRING));
 
       stte->param[stte->param_used++] = c;
     }
@@ -586,7 +538,7 @@ static void enriched_putc (int c, struct enriched_state *stte)
   /* see if more space is needed (plus extra for possible rich characters) */
   if (stte->buff_len < stte->buff_used + 3) {
     stte->buff_len += LONG_STRING;
-    safe_realloc (&stte->buffer, stte->buff_len + 1);
+    mem_realloc (&stte->buffer, stte->buff_len + 1);
   }
 
   if ((!stte->tag_level[RICH_NOFILL] && ISSPACE (c)) || c == '\0') {
@@ -631,9 +583,9 @@ static void enriched_puts (char *s, struct enriched_state *stte)
 {
   char *c;
 
-  if (stte->buff_len < stte->buff_used + mutt_strlen (s)) {
+  if (stte->buff_len < stte->buff_used + str_len (s)) {
     stte->buff_len += LONG_STRING;
-    safe_realloc (&stte->buffer, stte->buff_len + 1);
+    mem_realloc (&stte->buffer, stte->buff_len + 1);
   }
   c = s;
   while (*c) {
@@ -727,15 +679,15 @@ void text_enriched_handler (BODY * a, STATE * s)
     ((s->flags & M_DISPLAY) ? (COLS - 4) : ((COLS - 4) <
                                             72) ? (COLS - 4) : 72);
   stte.line_max = stte.WrapMargin * 4;
-  stte.line = (char *) safe_calloc (1, stte.line_max + 1);
-  stte.param = (char *) safe_calloc (1, STRING);
+  stte.line = (char *) mem_calloc (1, stte.line_max + 1);
+  stte.param = (char *) mem_calloc (1, STRING);
 
   stte.param_len = STRING;
   stte.param_used = 0;
 
   if (s->prefix) {
     state_puts (s->prefix, s);
-    stte.indent_len += mutt_strlen (s->prefix);
+    stte.indent_len += str_len (s->prefix);
   }
 
   while (state != DONE) {
@@ -819,9 +771,9 @@ void text_enriched_handler (BODY * a, STATE * s)
 
   state_putc ('\n', s);         /* add a final newline */
 
-  FREE (&(stte.buffer));
-  FREE (&(stte.line));
-  FREE (&(stte.param));
+  mem_free (&(stte.buffer));
+  mem_free (&(stte.line));
+  mem_free (&(stte.param));
 }
 
 /*
@@ -845,7 +797,7 @@ static void print_flowed_line (char *line, STATE * s, int ql)
 {
   int width;
   char *pos, *oldpos;
-  int len = mutt_strlen (line);
+  int len = str_len (line);
   int i;
 
   if (MaxLineLength > 0) {
@@ -869,7 +821,7 @@ static void print_flowed_line (char *line, STATE * s, int ql)
 
   /* fprintf(stderr,"print_flowed_line will print `%s' with ql = %d\n",line,ql); */
 
-  if (mutt_strlen (line) == 0) {
+  if (str_len (line) == 0) {
     if (option (OPTQUOTEEMPTY)) {
       if (s->prefix)
         state_puts(s->prefix,s);
@@ -950,24 +902,24 @@ static void text_plain_flowed_handler (BODY * a, STATE * s)
 
   while (bytes > 0 && fgets (buf, sizeof (buf), s->fpin)) {
 
-    bytes -= mutt_strlen (buf);
+    bytes -= str_len (buf);
 
     newql = get_quote_level (buf);
 
     if ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r'))) {
       *t = '\0';
-      if (mutt_strlen (curline) > 0 && curline[mutt_strlen (curline) - 1] == ' '
+      if (str_len (curline) > 0 && curline[str_len (curline) - 1] == ' '
           && newql == quotelevel
           && strcmp (curline + quotelevel, "-- ") != 0) {
         if (buf[newql] == ' ')
-          curline[mutt_strlen (curline) - 1] = '\0';
+          curline[str_len (curline) - 1] = '\0';
 
-        curline = realloc (curline, curline_len + mutt_strlen (buf));
+        curline = realloc (curline, curline_len + str_len (buf));
         if (curline_len == 1)
           *curline = '\0';
-        curline_len += mutt_strlen (buf);
-        safe_strncat (curline, curline_len, buf + newql,
-                      mutt_strlen (buf + newql));
+        curline_len += str_len (buf);
+        str_ncat (curline, curline_len, buf + newql,
+                      str_len (buf + newql));
       }
       else {
         if (first_line) {
@@ -976,13 +928,13 @@ static void text_plain_flowed_handler (BODY * a, STATE * s)
         else {
           print_flowed_line (curline, s, quotelevel);
         }
-        FREE (&curline);
+        mem_free (&curline);
         curline_len = 1;
-        curline = realloc (curline, curline_len + mutt_strlen (buf));
+        curline = realloc (curline, curline_len + str_len (buf));
         if (curline_len == 1)
           *curline = '\0';
-        curline_len += mutt_strlen (buf);
-        safe_strncat (curline, curline_len, buf, mutt_strlen (buf));
+        curline_len += str_len (buf);
+        str_ncat (curline, curline_len, buf, str_len (buf));
         quotelevel = newql;
       }
     }
@@ -990,19 +942,19 @@ static void text_plain_flowed_handler (BODY * a, STATE * s)
       /* in case there's no line end it's likely the last line
        * so append to current (if any) */
       if (buf[newql] == ' ')
-        curline[mutt_strlen (curline) - 1] = '\0';
-      curline = realloc (curline, curline_len + mutt_strlen (buf));
+        curline[str_len (curline) - 1] = '\0';
+      curline = realloc (curline, curline_len + str_len (buf));
       if (curline_len == 1)
         *curline = '\0';
-      curline_len += mutt_strlen (buf);
-      safe_strncat (curline, curline_len, buf + newql,
-                    mutt_strlen (buf + newql));
+      curline_len += str_len (buf);
+      str_ncat (curline, curline_len, buf + newql,
+                    str_len (buf + newql));
       break;
     }
   }
   if (curline) {
     print_flowed_line (curline, s, quotelevel);
-    FREE (&curline);
+    mem_free (&curline);
   }
 }
 
@@ -1053,7 +1005,7 @@ static void alternative_handler (BODY * a, STATE * s)
     }
     else {
       wild = 1;
-      btlen = mutt_strlen (t->data);
+      btlen = str_len (t->data);
     }
 
     if (a && a->parts)
@@ -1310,11 +1262,11 @@ void autoview_handler (BODY * a, STATE * s)
   snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
   rfc1524_mailcap_lookup (a, type, entry, M_AUTOVIEW);
 
-  fname = safe_strdup (a->filename);
+  fname = str_dup (a->filename);
   mutt_sanitize_filename (fname, 1);
   rfc1524_expand_filename (entry->nametemplate, fname, tempfile,
                            sizeof (tempfile));
-  FREE (&fname);
+  mem_free (&fname);
 
   if (entry->command) {
     strfcpy (command, entry->command, sizeof (command));
@@ -1602,7 +1554,7 @@ void mutt_body_handler (BODY * b, STATE * s)
         handler = mutt_signed_handler;
     }
     else if ((WithCrypto & APPLICATION_PGP)
-             && safe_strcasecmp ("encrypted", b->subtype) == 0) {
+             && str_casecmp ("encrypted", b->subtype) == 0) {
       p = mutt_get_parameter ("protocol", b->parameter);
 
       if (!p)