+ /* fprintf(stderr,"print_flowed_line will print `%s' with ql = %d\n",line,ql); */
+
+ if (safe_strlen (line) == 0) {
+ if (option (OPTQUOTEEMPTY)) {
+ 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 -= safe_strlen (buf);
+
+ newql = get_quote_level (buf);
+
+ if ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r'))) {
+ *t = '\0';
+ if (safe_strlen (curline) > 0 && curline[safe_strlen (curline) - 1] == ' '
+ && newql == quotelevel
+ && strcmp (curline + quotelevel, "-- ") != 0) {
+ if (buf[newql] == ' ')
+ curline[safe_strlen (curline) - 1] = '\0';
+
+ curline = realloc (curline, curline_len + safe_strlen (buf));
+ if (curline_len == 1)
+ *curline = '\0';
+ curline_len += safe_strlen (buf);
+ safe_strncat (curline, curline_len, buf + newql,
+ safe_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 + safe_strlen (buf));
+ if (curline_len == 1)
+ *curline = '\0';
+ curline_len += safe_strlen (buf);
+ safe_strncat (curline, curline_len, buf, safe_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);
+ }
+}