Andreas Krennmair:
[apps/madmutt.git] / handler.c
index 721d998..f82c717 100644 (file)
--- a/handler.c
+++ b/handler.c
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */ 
 
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */ 
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -31,6 +35,7 @@
 #include "copy.h"
 #include "charset.h"
 #include "mutt_crypt.h"
 #include "copy.h"
 #include "charset.h"
 #include "mutt_crypt.h"
+#include "lib.h"
 
 
 #define BUFI_SIZE 1000
 
 
 #define BUFI_SIZE 1000
@@ -961,6 +966,7 @@ static int flowed_visual_strlen (char *l, int i)
   return j;
 }
 
   return j;
 }
 
+#if 0
 static void text_plain_flowed_handler (BODY *a, STATE *s)
 {
   char line[LONG_STRING];
 static void text_plain_flowed_handler (BODY *a, STATE *s)
 {
   char line[LONG_STRING];
@@ -991,13 +997,19 @@ static void text_plain_flowed_handler (BODY *a, STATE *s)
   if (s->prefix)
     add = 1;
   
   if (s->prefix)
     add = 1;
   
+  /*
   if ((flowed_max = FLOWED_MAX) > COLS - 3)
     flowed_max = COLS - 3;
   if (flowed_max > COLS - WrapMargin)
     flowed_max = COLS - WrapMargin;
   if (flowed_max <= 0)
     flowed_max = COLS;
   if ((flowed_max = FLOWED_MAX) > COLS - 3)
     flowed_max = COLS - 3;
   if (flowed_max > COLS - WrapMargin)
     flowed_max = COLS - WrapMargin;
   if (flowed_max <= 0)
     flowed_max = COLS;
-    
+    */
+  flowed_max = COLS - WrapMargin;
+  if (flowed_max <= 0)
+    flowed_max = COLS;
+  
+  fprintf(stderr,"flowed_max = %d\n",flowed_max);
 
   while (bytes > 0 && fgets (line, sizeof (line), s->fpin))
   {
 
   while (bytes > 0 && fgets (line, sizeof (line), s->fpin))
   {
@@ -1185,9 +1197,151 @@ static void text_plain_flowed_handler (BODY *a, STATE *s)
     state_putc ('\n', s);
   
 }
     state_putc ('\n', s);
   
 }
+#endif
 
 
+static int get_quote_level(char * line) {
+  int quoted;
+  for (quoted = 0; line[quoted] == '>'; quoted++);
+  return quoted;
+}
 
 
+static void print_flowed_line(char * line, STATE *s,int ql) {
+  int width;
+  char * pos, * oldpos;
+  char * t;
+  int len = strlen(line);
+  int i;
 
 
+  if (MaxLineLength > 0) {
+    width = MaxLineLength - WrapMargin - ql - 1;
+    if (option(OPTSTUFFQUOTED))
+      --width;
+    if (width < 0)
+      width = MaxLineLength;
+  } else {
+    width = COLS - SidebarWidth - WrapMargin - ql - 1;
+    if (option(OPTSTUFFQUOTED))
+      --width;
+    if (width < 0)
+      width = COLS;
+  }
+
+  /* fprintf(stderr,"print_flowed_line will print `%s' with ql = %d\n",line,ql); */
+
+  if (strlen(line)==0) {
+    if (s->prefix)
+      state_puts(s->prefix,s);
+    for (i=0;i<ql;++i) state_putc('>',s);
+    if (option(OPTSTUFFQUOTED))
+      state_putc(' ',s);
+    state_putc('\n',s);
+    return;
+  }
+
+  pos=line+ql+width;
+  oldpos=line+ql;
+  if (ql>0 && ISBLANK(*oldpos)) ++oldpos;
+
+  /* fprintf(stderr,"oldpos = %p line+len = %p\n",oldpos,line+len); */
+
+  for (;oldpos<line+len;pos+=width) {
+    /* fprintf(stderr,"outer for loop\n"); */
+    if (pos<line+len) { /* only search a new position when we're not over the end of the string w/ pos */
+      /* fprintf(stderr,"if 1\n"); */
+      if (*pos == ' ') {
+        /* fprintf(stderr,"if 2: good luck! found a space\n"); */
+        *pos = '\0';
+        ++pos;
+      } else {
+        /* fprintf(stderr,"if 2: else\n"); */
+        char * save = pos;
+        while (pos>=oldpos && !isspace(*pos)) {
+          /* fprintf(stderr,"pos(%p) > oldpos(%p)\n",pos,oldpos); */
+          --pos;
+        }
+        if (pos < oldpos) {
+          /* fprintf(stderr,"wow, no space found, searching the other direction\n"); */
+          pos = save;
+          while (pos < line+len && *pos && !isspace(*pos)) {
+            /* fprintf(stderr,"pos(%p) < line+len(%p)\n",pos,line+len); */
+            ++pos;
+          }
+          /* fprintf(stderr,"found a space pos = %p\n",pos); */
+        }
+        *pos = '\0';
+        ++pos;
+      }
+    } else {
+      /* fprintf(stderr,"if 1 else\n"); */
+    }
+    if (s->prefix)
+      state_puts(s->prefix,s);
+    for (i=0;i<ql;++i)
+      state_putc('>',s);
+    if (option(OPTSTUFFQUOTED) && (ql>0 || s->prefix)) state_putc(' ',s);
+    state_puts(oldpos,s);
+    /* fprintf(stderr,"print_flowed_line: `%s'\n",oldpos); */
+    if (pos<line+len)
+      state_putc(' ',s);
+    state_putc('\n',s);
+    oldpos = pos;
+  }
+  /*state_puts(line,s);
+  state_putc('\n',s);*/
+}
+
+static void text_plain_flowed_handler (BODY *a, STATE *s)
+{
+  int bytes = a->length;
+  char buf[LONG_STRING];
+  char * curline = strdup("");
+  char * t;
+  unsigned int curline_len = 1;
+  unsigned int quotelevel = 0, newql = 0;
+  int append_next_line = 0;
+  int first_line = 1;
+
+  while (bytes > 0 && fgets(buf,sizeof(buf),s->fpin)) {
+
+    /* fprintf(stderr,"read `%s'",buf); */
+    bytes -= strlen(buf);
+
+    newql = get_quote_level(buf);
+
+    if ((t=strrchr(buf,'\n')) || (t=strrchr(buf,'\r'))) {
+      *t = '\0';
+      if (strlen(curline)>0 && curline[strlen(curline)-1]==' ' && newql==quotelevel && strcmp(curline+quotelevel,"-- ")!=0) {
+        if (buf[newql]==' ')
+          curline[strlen(curline)-1] = '\0';
+
+        curline = realloc(curline,curline_len+strlen(buf));
+        if (curline_len == 1) *curline = '\0';
+        curline_len+=strlen(buf);
+        safe_strncat(curline,curline_len,buf+newql,strlen(buf+newql));
+      } else {
+        if (first_line) {
+          first_line = 0;
+        } else {
+          print_flowed_line(curline,s,quotelevel);
+        }
+        FREE(&curline);
+        curline_len = 1;
+        curline = realloc(curline,curline_len+strlen(buf));
+        if (curline_len == 1) *curline = '\0';
+        curline_len+=strlen(buf);
+        safe_strncat(curline,curline_len,buf,strlen(buf));
+        quotelevel = newql;
+      }
+    } else {
+      append_next_line = 1;
+      /* @todo: add handling of very long lines */
+    }
+  }
+  if (curline) {
+    print_flowed_line(curline,s,quotelevel);
+    FREE(&curline);
+  }
+}
 
 
 
 
 
 
@@ -1725,11 +1879,21 @@ void mutt_decode_attachment (BODY *b, STATE *s)
 
   Quotebuf[0] = '\0';
 
 
   Quotebuf[0] = '\0';
 
-  if (istext && s->flags & M_CHARCONV)
+  if (istext)
   {
   {
-    char *charset = mutt_get_parameter ("charset", b->parameter);
-    if (charset && Charset)
-      cd = mutt_iconv_open (Charset, charset, M_ICONV_HOOK_FROM);
+    if(s->flags & M_CHARCONV)
+    {
+      char *charset = mutt_get_parameter ("charset", b->parameter);
+      if (!option (OPTSTRICTMIME) && !charset)
+        charset = mutt_get_first_charset (AssumedCharset);
+      if (charset && Charset)
+        cd = mutt_iconv_open (Charset, charset, M_ICONV_HOOK_FROM);
+    }
+    else
+    {
+      if (b->file_charset)
+        cd = mutt_iconv_open (Charset, b->file_charset, M_ICONV_HOOK_FROM);
+    }
   }
 
   fseek (s->fpin, b->offset, 0);
   }
 
   fseek (s->fpin, b->offset, 0);