From: ak1 Date: Sun, 6 Feb 2005 20:09:24 +0000 (+0000) Subject: Andreas Krennmair: X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=170b2f011c6e3616b24ae69bd181c4915ba6eb67 Andreas Krennmair: rewrote handler for f=f attachments to produce nicer output. This needs further testing. git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@53 e385b8ad-14ed-0310-8656-cc95a2468c6d --- diff --git a/compile.sh b/compile.sh index e967ab5..995cf20 100755 --- a/compile.sh +++ b/compile.sh @@ -5,4 +5,4 @@ if [ `uname -s` = 'Darwin' ] ; then export CFLAGS="-I/sw/include" export LDFLAGS="-L/sw/lib" fi -./configure --enable-pgp --enable-smime --with-regex --enable-pop --enable-imap --enable-nntp --enable-imap-edit-threads --with-ssl --enable-hcache && make +CC="gcc -g" ./configure --enable-pgp --enable-smime --with-regex --enable-pop --enable-imap --enable-nntp --enable-imap-edit-threads --with-ssl --enable-hcache --enable-debug && make diff --git a/handler.c b/handler.c index 721d998..88a3183 100644 --- a/handler.c +++ b/handler.c @@ -961,6 +961,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 +992,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 +1192,132 @@ 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; + + width = COLS - 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) { + for (i=0;i',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"); */ + } + for (i=0;i',s); + if (option(OPTSTUFFQUOTED) && ql>0) state_putc(' ',s); + state_puts(oldpos,s); + /* fprintf(stderr,"print_flowed_line: `%s'\n",oldpos); */ + 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) { + 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); + } +} diff --git a/init.h b/init.h index 6f85c6f..10c1824 100644 --- a/init.h +++ b/init.h @@ -2929,6 +2929,13 @@ struct option_t MuttVars[] = { ** personal mailbox where you might have several unrelated messages with ** the subject ``hi'' which will get grouped together. */ + { "stuff_quoted", DT_BOOL, R_BOTH, OPTSTUFFQUOTED, 0 }, + /* + ** .pp + ** If set, attachments with flowed format will have their quoting ``stuffed'', + ** i.e. a space will be inserted between the quote characters and the actual + ** text. + */ { "suspend", DT_BOOL, R_NONE, OPTSUSPEND, 1 }, /* ** .pp diff --git a/mutt.h b/mutt.h index d5dba99..d11f1cc 100644 --- a/mutt.h +++ b/mutt.h @@ -458,6 +458,7 @@ enum OPTSPAMSEP, OPTSTATUSONTOP, OPTSTRICTTHREADS, + OPTSTUFFQUOTED, OPTSUSPEND, OPTTEXTFLOWED, OPTTHOROUGHSRC, diff --git a/pager.c b/pager.c index 721c029..cb281de 100644 --- a/pager.c +++ b/pager.c @@ -971,7 +971,7 @@ fill_buffer (FILE *f, long *last_pos, long offset, unsigned char *buf, unsigned char *fmt, size_t blen, int *buf_ready) { unsigned char *p; - static int b_read; + static int b_read = 0; if (*buf_ready == 0) {