remove cryptglue.c
[apps/madmutt.git] / state.c
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
4  *
5  * This file is part of mutt-ng, see http://www.muttng.org/.
6  * It's licensed under the GNU General Public License,
7  * please see the file GPL in the top level source directory.
8  */
9
10 #include <lib-lib/lib-lib.h>
11
12 #include <lib-mime/rfc3676.h>
13
14 #include "mutt.h"
15 #include "state.h"
16
17 static void state_prefix_put (const char *d, ssize_t dlen, STATE * s)
18 {
19   if (s->prefix)
20     while (dlen--)
21       state_prefix_putc (*d++, s);
22   else
23     fwrite (d, dlen, 1, s->fpout);
24 }
25
26 void mutt_convert_to_state (iconv_t cd, char *bufi, ssize_t * l, STATE * s)
27 {
28   char bufo[BUFO_SIZE];
29   const char *ib;
30   char *ob;
31   ssize_t ibl, obl;
32
33   if (!bufi) {
34     if (cd != MUTT_ICONV_ERROR) {
35       ob = bufo, obl = sizeof (bufo);
36       my_iconv(cd, 0, 0, &ob, &obl);
37       if (ob != bufo)
38         state_prefix_put (bufo, ob - bufo, s);
39     }
40     if (Quotebuf[0] != '\0')
41       state_prefix_putc ('\n', s);
42     return;
43   }
44
45   if (cd == MUTT_ICONV_ERROR) {
46     state_prefix_put (bufi, *l, s);
47     *l = 0;
48     return;
49   }
50
51   ib = bufi, ibl = *l;
52   for (;;) {
53     ob = bufo, obl = sizeof (bufo);
54     mutt_iconv (cd, &ib, &ibl, &ob, &obl, 0, "?");
55     if (ob == bufo)
56       break;
57     state_prefix_put (bufo, ob - bufo, s);
58   }
59   memmove (bufi, ib, ibl);
60   *l = ibl;
61 }
62
63 void state_prefix_putc (char c, STATE * s)
64 {
65   if (s->flags & M_PENDINGPREFIX) {
66     int i;
67
68     i = m_strlen(Quotebuf);
69     Quotebuf[i++] = c;
70     Quotebuf[i] = '\0';
71     if (i == sizeof (Quotebuf) - 1 || c == '\n') {
72       char buf[2 * STRING];
73       int j = 0, offset = 0;
74       regmatch_t pmatch[1];
75
76       state_reset_prefix (s);
77       while (regexec
78              ((regex_t *) QuoteRegexp.rx, &Quotebuf[offset], 1, pmatch,
79               0) == 0)
80         offset += pmatch->rm_eo;
81
82       if (!option (OPTQUOTEEMPTY) && Quotebuf[offset] == '\n') {
83         buf[0] = '\n';
84         buf[1] = '\0';
85       }
86       else if (!option (OPTTEXTFLOWED) && option (OPTQUOTEQUOTED) && offset) {
87         for (i = 0; i < offset; i++)
88           if (Quotebuf[i] != ' ')
89             j = i;
90         m_strncpy(buf, sizeof(buf), Quotebuf, j + 1);
91         m_strcpy(buf + j + 1, sizeof(buf) - j - 1, Quotebuf + j);
92       }
93       else
94         snprintf (buf, sizeof (buf), "%s%s", NONULL (s->prefix), Quotebuf);
95
96       state_puts (buf, s);
97     }
98   }
99   else
100     state_putc (c, s);
101
102   if (c == '\n') {
103     state_set_prefix (s);
104     Quotebuf[0] = '\0';
105   }
106 }
107
108 int state_printf (STATE * s, const char *fmt, ...)
109 {
110   int rv;
111   va_list ap;
112
113   va_start (ap, fmt);
114   rv = vfprintf (s->fpout, fmt, ap);
115   va_end (ap);
116
117   return rv;
118 }
119
120 void state_mark_attach (STATE * s)
121 {
122   if ((s->flags & M_DISPLAY) && !m_strcmp(Pager, "builtin"))
123     state_puts (AttachmentMarker, s);
124 }
125
126 void state_attach_puts (const char *t, STATE * s)
127 {
128   if (*t != '\n')
129     state_mark_attach (s);
130   while (*t) {
131     state_putc (*t, s);
132     if (*t++ == '\n' && *t)
133       if (*t != '\n')
134         state_mark_attach (s);
135   }
136 }