X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=rfc3676.c;h=b76108daaffac4cfe365289b1f63fb4e6a334cce;hp=3869b33cd524fa1cd2068df37b0d619d07301a06;hb=c228dbc78fa40b09da8bcf5c1650d6006c389ce4;hpb=fa54675b6ceb98bce1a8931b7cc5b70ecedf4225;ds=sidebyside diff --git a/rfc3676.c b/rfc3676.c index 3869b33..b76108d 100644 --- a/rfc3676.c +++ b/rfc3676.c @@ -32,9 +32,6 @@ #include "lib/str.h" #include "lib/debug.h" -typedef int handler_f (BODY *, STATE *); -typedef handler_f *handler_t; - #define FLOWED_MAX 77 static int get_quote_level (char *line) @@ -55,7 +52,7 @@ static void print_flowed_line (char *line, STATE * s, if (MaxLineLength > 0) { width = MaxLineLength - WrapMargin - ql - 1; - if (option (OPTSTUFFQUOTED)) + if (!(s->flags & M_REPLYING) && option (OPTSTUFFQUOTED)) --width; if (width < 0) width = MaxLineLength; @@ -66,7 +63,7 @@ static void print_flowed_line (char *line, STATE * s, else width = COLS - WrapMargin - ql - 1; - if (option (OPTSTUFFQUOTED)) + if (!(s->flags & M_REPLYING) && option (OPTSTUFFQUOTED)) --width; if (width < 0) width = COLS; @@ -77,7 +74,7 @@ static void print_flowed_line (char *line, STATE * s, if (s->prefix) state_puts(s->prefix,s); for (i=0;i',s); - if (option(OPTSTUFFQUOTED)) + if (!(s->flags & M_REPLYING) && option(OPTSTUFFQUOTED)) state_putc(' ',s); } state_putc('\n',s); @@ -91,43 +88,43 @@ static void print_flowed_line (char *line, STATE * s, /* only search a new position when we're not over * the end of the string w/ pos */ if (pos < line + len) { - /* fprintf(stderr,"if 1\n"); */ if (*pos == ' ') { - /* fprintf(stderr,"if 2: good luck! found a space\n"); */ + debug_print (4, ("f=f: found space directly at width\n")); *pos = '\0'; ++pos; } else { - /* fprintf(stderr,"if 2: else\n"); */ char *save = pos; + debug_print (4, ("f=f: need to search for space\n")); while (pos >= oldpos && *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"); */ + debug_print (4, ("f=f: no space found while searching " + "to left; going right\n")); pos = save; while (pos < line + len && *pos && *pos != ' ') { - /* fprintf(stderr,"pos(%p) < line+len(%p)\n",pos,line+len); */ ++pos; } - /* fprintf(stderr,"found a space pos = %p\n",pos); */ + debug_print (4, ("f=f: found space at pos %d\n", pos-line)); + } else { + debug_print (4, ("f=f: found space while searching to left\n")); } *pos = '\0'; ++pos; } } else { - /* fprintf(stderr,"if 1 else\n"); */ + debug_print (4, ("f=f: line completely fits on screen\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)) + if (!(s->flags & M_REPLYING) && option (OPTSTUFFQUOTED) && + (ql > 0 || s->prefix)) state_putc (' ', s); if (delsp && spaces && space_len > 0) { @@ -135,7 +132,7 @@ static void print_flowed_line (char *line, STATE * s, * to eliminate all spaces which were trailing due to DelSp */ for (i = 0; i < str_len (oldpos); i++) { if (oldpos[i] == ' ' && spaces[&(oldpos[i])-line] != 0) { - debug_print (4, ("DelSp: spaces[%d] forces space removal\n", + debug_print (4, ("f=f: DelSp: spaces[%d] forces space removal\n", &(oldpos[i])-line)); continue; } @@ -170,7 +167,7 @@ int rfc3676_handler (BODY * a, STATE * s) { t = NULL; } - debug_print (2, ("DelSp: %s\n", delsp ? "yes" : "no")); + debug_print (2, ("f=f: DelSp: %s\n", delsp ? "yes" : "no")); while (bytes > 0 && fgets (buf, sizeof (buf), s->fpin)) { buf_len = str_len (buf); @@ -232,7 +229,7 @@ int rfc3676_handler (BODY * a, STATE * s) { */ if (delsp && curline && *curline && curline_len-2 >= 0 && curline[curline_len-2] == ' ') { - debug_print (4, ("DelSp: marking spaces[%d] for later removal\n", + debug_print (4, ("f=f: DelSp: marking spaces[%d] for later removal\n", curline_len-2)); spaces[curline_len-2] = 1; } @@ -243,3 +240,83 @@ int rfc3676_handler (BODY * a, STATE * s) { mem_free (&curline); return (0); } + +void rfc3676_quote_line (STATE* s, char* dst, size_t dstlen, + const char* line) { + char quote[SHORT_STRING]; + int offset = 0, i = 0, count = 0; + regmatch_t pmatch[1]; + + quote[0] = '\0'; + + while (regexec ((regex_t *) QuoteRegexp.rx, &line[offset], + 1, pmatch, 0) == 0) + offset += pmatch->rm_eo; + + if (offset > 0) { + /* first count number of real quoting characters; + * read: non-spaces + * this maybe just plain wrong, but leaving spaces + * within quoting characters is what I consider + * more plain wrong... + */ + for (i = 0; i < offset; i++) + if (line[i] != ' ') + count++; + /* just make sure we're inside quote althoug we + * likely won't have more than SHORT_STRING quote levels... */ + i = (count > SHORT_STRING-1) ? SHORT_STRING-1 : count; + memset (quote, '>', i); + quote[i] = '\0'; + } + debug_print (4, ("f=f: quotelevel = %d, new prefix = '%s'\n", + i, NONULL (quote))); + snprintf (dst, dstlen, "%s%s%s", NONULL (s->prefix), NONULL (quote), + &line[offset]); +} + +void rfc3676_space_stuff (HEADER* hdr) { +#if DEBUG + int lc = 0; + size_t len = 0; + unsigned char c = '\0'; +#endif + FILE* in = NULL, *out = NULL; + char buf[LONG_STRING]; + char tmpfile[_POSIX_PATH_MAX]; + + if (!hdr || !hdr->content || !hdr->content->filename) + return; + + debug_print (2, ("f=f: postprocess %s\n", hdr->content->filename)); + if ((in = safe_fopen (hdr->content->filename, "r")) == NULL) + return; + mutt_mktemp (tmpfile); + if ((out = safe_fopen (tmpfile, "w+")) == NULL) { + fclose (in); + return; + } + + while (fgets (buf, sizeof (buf), in)) { + if (ascii_strncmp ("From ", buf, 4) == 0 || buf[0] == ' ') { + fputc (' ', out); +#if DEBUG + lc++; + len = str_len (buf); + if (len > 0) { + c = buf[len-1]; + buf[len-1] = '\0'; + } + debug_print (4, ("f=f: line %d needs space-stuffing: '%s'\n", + lc, buf)); + if (len > 0) + buf[len-1] = c; +#endif + } + fputs (buf, out); + } + fclose (in); + unlink (hdr->content->filename); + fclose (out); + str_replace (&hdr->content->filename, tmpfile); +}