NeoMutt  2024-11-14-138-ge5ca67
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
state.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <inttypes.h>
32#include <limits.h>
33#include <stdarg.h> // IWYU pragma: keep
34#include <stdio.h>
35#include <wchar.h>
36#include "state.h"
37#include "charset.h"
38#include "date.h"
39#include "random.h"
40
45const char *state_attachment_marker(void)
46{
47 static char marker[256] = { 0 };
48 if (!marker[0])
49 {
50 snprintf(marker, sizeof(marker), "\033]9;%" PRIu64 "\a", mutt_rand64());
51 }
52 return marker;
53}
54
60{
61 static char marker[256] = { 0 };
62 if (!marker[0])
63 {
64 snprintf(marker, sizeof(marker), "\033]8;%lld\a", (long long) mutt_date_now());
65 }
66 return marker;
67}
68
73void state_mark_attach(struct State *state)
74{
75 if (!state || !state->fp_out)
76 return;
77
79 {
81 }
82}
83
89{
90 if (!state || !state->fp_out)
91 return;
92
94 {
96 }
97}
98
104void state_attach_puts(struct State *state, const char *t)
105{
106 if (!state || !state->fp_out || !t)
107 return;
108
109 if (*t != '\n')
110 state_mark_attach(state);
111 while (*t)
112 {
113 state_putc(state, *t);
114 if ((*t++ == '\n') && *t)
115 if (*t != '\n')
116 state_mark_attach(state);
117 }
118}
119
127static int state_putwc(struct State *state, wchar_t wc)
128{
129 char mb[MB_LEN_MAX] = { 0 };
130
131 if (wcrtomb(mb, wc, NULL) == ICONV_ILLEGAL_SEQ)
132 return -1;
133
134 if (fputs(mb, state->fp_out) == EOF)
135 return -1;
136
137 return 0;
138}
139
147int state_putws(struct State *state, const wchar_t *ws)
148{
149 const wchar_t *p = ws;
150
151 while (p && (*p != L'\0'))
152 {
153 if (state_putwc(state, *p) < 0)
154 return -1;
155 p++;
156 }
157 return 0;
158}
159
165void state_prefix_putc(struct State *state, char c)
166{
167 if (state->flags & STATE_PENDINGPREFIX)
168 {
169 state_reset_prefix(state);
170 if (state->prefix)
171 state_puts(state, state->prefix);
172 }
173
174 state_putc(state, c);
175
176 if (c == '\n')
177 state_set_prefix(state);
178}
179
187int state_printf(struct State *state, const char *fmt, ...)
188{
189 int rc;
190 va_list ap;
191
192 va_start(ap, fmt);
193 rc = vfprintf(state->fp_out, fmt, ap);
194 va_end(ap);
195
196 return rc;
197}
198
205void state_prefix_put(struct State *state, const char *buf, size_t buflen)
206{
207 if (state->prefix)
208 {
209 while (buflen--)
210 state_prefix_putc(state, *buf++);
211 }
212 else
213 {
214 fwrite(buf, buflen, 1, state->fp_out);
215 }
216}
Time and date handling routines.
Conversion between different character encodings.
#define ICONV_ILLEGAL_SEQ
Error value for iconv() - Illegal sequence.
Definition: charset.h:96
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:456
void state_attach_puts(struct State *state, const char *t)
Write a string to the state.
Definition: state.c:104
void state_mark_attach(struct State *state)
Write a unique marker around content.
Definition: state.c:73
int state_printf(struct State *state, const char *fmt,...)
Write a formatted string to the State.
Definition: state.c:187
static int state_putwc(struct State *state, wchar_t wc)
Write a wide character to the state.
Definition: state.c:127
const char * state_attachment_marker(void)
Get a unique (per-run) ANSI string to mark PGP messages in an email.
Definition: state.c:45
void state_prefix_put(struct State *state, const char *buf, size_t buflen)
Write a prefixed fixed-string to the State.
Definition: state.c:205
void state_mark_protected_header(struct State *state)
Write a unique marker around protected headers.
Definition: state.c:88
int state_putws(struct State *state, const wchar_t *ws)
Write a wide string to the state.
Definition: state.c:147
const char * state_protected_header_marker(void)
Get a unique (per-run) ANSI string to mark protected headers in an email.
Definition: state.c:59
void state_prefix_putc(struct State *state, char c)
Write a prefixed character to the state.
Definition: state.c:165
Keep track when processing files.
#define STATE_PAGER
Output will be displayed in the Pager.
Definition: state.h:42
#define state_puts(STATE, STR)
Definition: state.h:58
#define state_set_prefix(state)
Definition: state.h:56
#define STATE_DISPLAY
Output is displayed to the user.
Definition: state.h:33
#define STATE_PENDINGPREFIX
Prefix to write, but character must follow.
Definition: state.h:35
#define state_reset_prefix(state)
Definition: state.h:57
#define state_putc(STATE, STR)
Definition: state.h:59
uint64_t mutt_rand64(void)
Create a 64-bit random number.
Definition: random.c:123
Random number/string functions.
Keep track when processing files.
Definition: state.h:48
StateFlags flags
Flags, e.g. STATE_DISPLAY.
Definition: state.h:52
FILE * fp_out
File to write to.
Definition: state.h:50
const char * prefix
String to add to the beginning of each output line.
Definition: state.h:51