NeoMutt  2022-04-29-145-g9b6a0e
Teaching an old dog new tricks
DOXYGEN
state.c
Go to the documentation of this file.
1 
29 #include "config.h"
30 #include <inttypes.h>
31 #include <limits.h>
32 #include <stdarg.h>
33 #include <stdio.h>
34 #include <wchar.h>
35 #include "mutt/lib.h"
36 #include "config/lib.h"
37 #include "core/lib.h"
38 
43 const char *state_attachment_marker(void)
44 {
45  static char marker[256] = { 0 };
46  if (!marker[0])
47  {
48  snprintf(marker, sizeof(marker), "\033]9;%" PRIu64 "\a", mutt_rand64());
49  }
50  return marker;
51 }
52 
58 {
59  static char marker[256] = { 0 };
60  if (!marker[0])
61  {
62  snprintf(marker, sizeof(marker), "\033]8;%lld\a", (long long) mutt_date_epoch());
63  }
64  return marker;
65 }
66 
71 void state_mark_attach(struct State *s)
72 {
73  if (!s || !s->fp_out)
74  return;
75  const char *const c_pager = cs_subset_string(NeoMutt->sub, "pager");
76  if ((s->flags & MUTT_DISPLAY) && (!c_pager || mutt_str_equal(c_pager, "builtin")))
77  {
79  }
80 }
81 
87 {
88  const char *const c_pager = cs_subset_string(NeoMutt->sub, "pager");
89  if ((s->flags & MUTT_DISPLAY) && (!c_pager || mutt_str_equal(c_pager, "builtin")))
90  {
92  }
93 }
94 
100 void state_attach_puts(struct State *s, const char *t)
101 {
102  if (!s || !s->fp_out || !t)
103  return;
104 
105  if (*t != '\n')
107  while (*t)
108  {
109  state_putc(s, *t);
110  if ((*t++ == '\n') && *t)
111  if (*t != '\n')
113  }
114 }
115 
123 static int state_putwc(struct State *s, wchar_t wc)
124 {
125  char mb[MB_LEN_MAX] = { 0 };
126  int rc;
127 
128  rc = wcrtomb(mb, wc, NULL);
129  if (rc < 0)
130  return rc;
131  if (fputs(mb, s->fp_out) == EOF)
132  return -1;
133  return 0;
134 }
135 
143 int state_putws(struct State *s, const wchar_t *ws)
144 {
145  const wchar_t *p = ws;
146 
147  while (p && (*p != L'\0'))
148  {
149  if (state_putwc(s, *p) < 0)
150  return -1;
151  p++;
152  }
153  return 0;
154 }
155 
161 void state_prefix_putc(struct State *s, char c)
162 {
163  if (s->flags & MUTT_PENDINGPREFIX)
164  {
166  if (s->prefix)
167  state_puts(s, s->prefix);
168  }
169 
170  state_putc(s, c);
171 
172  if (c == '\n')
173  state_set_prefix(s);
174 }
175 
183 int state_printf(struct State *s, const char *fmt, ...)
184 {
185  int rc;
186  va_list ap;
187 
188  va_start(ap, fmt);
189  rc = vfprintf(s->fp_out, fmt, ap);
190  va_end(ap);
191 
192  return rc;
193 }
194 
201 void state_prefix_put(struct State *s, const char *buf, size_t buflen)
202 {
203  if (s->prefix)
204  {
205  while (buflen--)
206  state_prefix_putc(s, *buf++);
207  }
208  else
209  fwrite(buf, buflen, 1, s->fp_out);
210 }
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:317
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
time_t mutt_date_epoch(void)
Return the number of seconds since the Unix epoch.
Definition: date.c:427
Convenience wrapper for the library headers.
int state_putws(struct State *s, const wchar_t *ws)
Write a wide string to the state.
Definition: state.c:143
int state_printf(struct State *s, const char *fmt,...)
Write a formatted string to the State.
Definition: state.c:183
void state_prefix_put(struct State *s, const char *buf, size_t buflen)
Write a prefixed fixed-string to the State.
Definition: state.c:201
void state_prefix_putc(struct State *s, char c)
Write a prefixed character to the state.
Definition: state.c:161
const char * state_protected_header_marker(void)
Get a unique (per-run) ANSI string to mark protected headers in an email.
Definition: state.c:57
void state_mark_attach(struct State *s)
Write a unique marker around content.
Definition: state.c:71
const char * state_attachment_marker(void)
Get a unique (per-run) ANSI string to mark PGP messages in an email.
Definition: state.c:43
void state_attach_puts(struct State *s, const char *t)
Write a string to the state.
Definition: state.c:100
void state_mark_protected_header(struct State *s)
Write a unique marker around protected headers.
Definition: state.c:86
static int state_putwc(struct State *s, wchar_t wc)
Write a wide character to the state.
Definition: state.c:123
#define state_puts(STATE, STR)
Definition: state.h:56
#define state_set_prefix(state)
Definition: state.h:54
#define MUTT_PENDINGPREFIX
Prefix to write, but character must follow.
Definition: state.h:34
#define state_reset_prefix(state)
Definition: state.h:55
#define state_putc(STATE, STR)
Definition: state.h:57
#define MUTT_DISPLAY
Output is displayed to the user.
Definition: state.h:32
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:784
uint64_t mutt_rand64(void)
Create a 64-bit random number.
Definition: random.c:129
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
Keep track when processing files.
Definition: state.h:46
StateFlags flags
Flags, e.g. MUTT_DISPLAY.
Definition: state.h:50
FILE * fp_out
File to write to.
Definition: state.h:48
char * prefix
String to add to the beginning of each output line.
Definition: state.h:49