#include "copy.h"
#include "charset.h"
#include "mutt_crypt.h"
+#include "state.h"
+#include "attach.h"
#include "lib.h"
#include "lib/mem.h"
#include "lib/str.h"
#include "lib/debug.h"
-#define BUFI_SIZE 1000
-#define BUFO_SIZE 2000
-
-
typedef void handler_f (BODY *, STATE *);
typedef handler_f *handler_t;
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
};
-static void state_prefix_put (const char *d, size_t dlen, STATE * s)
-{
- if (s->prefix)
- while (dlen--)
- state_prefix_putc (*d++, s);
- else
- fwrite (d, dlen, 1, s->fpout);
-}
-
-void mutt_convert_to_state (iconv_t cd, char *bufi, size_t * l, STATE * s)
-{
- char bufo[BUFO_SIZE];
- ICONV_CONST char *ib;
- char *ob;
- size_t ibl, obl;
-
- if (!bufi) {
- if (cd != (iconv_t) (-1)) {
- ob = bufo, obl = sizeof (bufo);
- iconv (cd, 0, 0, &ob, &obl);
- if (ob != bufo)
- state_prefix_put (bufo, ob - bufo, s);
- }
- if (Quotebuf[0] != '\0')
- state_prefix_putc ('\n', s);
- return;
- }
-
- if (cd == (iconv_t) (-1)) {
- state_prefix_put (bufi, *l, s);
- *l = 0;
- return;
- }
-
- ib = bufi, ibl = *l;
- for (;;) {
- ob = bufo, obl = sizeof (bufo);
- mutt_iconv (cd, &ib, &ibl, &ob, &obl, 0, "?");
- if (ob == bufo)
- break;
- state_prefix_put (bufo, ob - bufo, s);
- }
- memmove (bufi, ib, ibl);
- *l = ibl;
-}
-
void mutt_decode_xbit (STATE * s, long len, int istext, iconv_t cd)
{
int c, ch;
int bytes = a->length;
char buf[LONG_STRING];
char *curline = strdup ("");
- char *t;
+ char *t = NULL;
unsigned int curline_len = 1;
unsigned int quotelevel = 0, newql = 0;
int first_line = 1;
newql = get_quote_level (buf);
- if ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r'))) {
- *t = '\0';
+ if (bytes == 0 || ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r')))) {
+ if (t)
+ *t = '\0';
if (str_len (curline) > 0 && curline[str_len (curline) - 1] == ' '
&& newql == quotelevel
&& strcmp (curline + quotelevel, "-- ") != 0) {
quotelevel = newql;
}
}
- else if (bytes == 0) {
- /* in case there's no line end it's likely the last line
- * so append to current (if any) */
- if (buf[newql] == ' ')
- curline[str_len (curline) - 1] = '\0';
- curline = realloc (curline, curline_len + str_len (buf));
- if (curline_len == 1)
- *curline = '\0';
- curline_len += str_len (buf);
- str_ncat (curline, curline_len, buf + newql,
- str_len (buf + newql));
- break;
- }
}
if (curline) {
print_flowed_line (curline, s, quotelevel);