X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=handler.c;h=f82c717fd91217aa3b5dd526dc6553081e4feeab;hp=721d998d01044a0174a04ba8b648aece4484944d;hb=4ff362c6b720c1ae7c6fde8300567644905bd923;hpb=3d937534e7b1ee723f86594b5e4c64c95158a933 diff --git a/handler.c b/handler.c index 721d998..f82c717 100644 --- a/handler.c +++ b/handler.c @@ -16,6 +16,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include @@ -31,6 +35,7 @@ #include "copy.h" #include "charset.h" #include "mutt_crypt.h" +#include "lib.h" #define BUFI_SIZE 1000 @@ -961,6 +966,7 @@ static int flowed_visual_strlen (char *l, int i) return j; } +#if 0 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 ((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)) { @@ -1185,9 +1197,151 @@ static void text_plain_flowed_handler (BODY *a, STATE *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',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=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',s); + if (option(OPTSTUFFQUOTED) && (ql>0 || s->prefix)) state_putc(' ',s); + state_puts(oldpos,s); + /* fprintf(stderr,"print_flowed_line: `%s'\n",oldpos); */ + if (poslength; + 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'; - 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);