NeoMutt  2025-09-05-43-g177ed6
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
dump.h File Reference

Dump all the config. More...

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
+ Include dependency graph for dump.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define CS_DUMP_NO_FLAGS   0
 No flags are set.
 
#define CS_DUMP_ONLY_CHANGED   (1 << 0)
 Only show config that the user has changed.
 
#define CS_DUMP_HIDE_SENSITIVE   (1 << 1)
 Obscure sensitive information like passwords.
 
#define CS_DUMP_NO_ESCAPING   (1 << 2)
 Do not escape special chars, or quote the string.
 
#define CS_DUMP_HIDE_NAME   (1 << 3)
 Do not print the name of the config item.
 
#define CS_DUMP_HIDE_VALUE   (1 << 4)
 Do not print the value of the config item.
 
#define CS_DUMP_SHOW_DEFAULTS   (1 << 5)
 Show the default value for the config item.
 
#define CS_DUMP_SHOW_DISABLED   (1 << 6)
 Show disabled config items, too.
 
#define CS_DUMP_SHOW_SYNONYMS   (1 << 7)
 Show synonyms and the config items they're linked to.
 
#define CS_DUMP_SHOW_DEPRECATED   (1 << 8)
 Show config items that aren't used any more.
 
#define CS_DUMP_SHOW_DOCS   (1 << 9)
 Show one-liner documentation for the config item.
 
#define CS_DUMP_LINK_DOCS   (1 << 10)
 Link to the online docs.
 

Typedefs

typedef uint16_t ConfigDumpFlags
 Flags for dump_config(), e.g. CS_DUMP_ONLY_CHANGED.
 

Functions

void dump_config_neo (struct ConfigSet *cs, struct HashElem *he, struct Buffer *value, struct Buffer *initial, ConfigDumpFlags flags, FILE *fp)
 Dump the config in the style of NeoMutt.
 
bool dump_config (struct ConfigSet *cs, struct HashElemArray *hea, ConfigDumpFlags flags, FILE *fp)
 Write all the config to a file.
 
size_t escape_string (struct Buffer *buf, const char *src)
 Write a string to a buffer, escaping special characters.
 
size_t pretty_var (const char *str, struct Buffer *buf)
 Escape and stringify a config item value.
 

Detailed Description

Dump all the config.

Authors
  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file dump.h.

Macro Definition Documentation

◆ CS_DUMP_NO_FLAGS

#define CS_DUMP_NO_FLAGS   0

No flags are set.

Definition at line 36 of file dump.h.

◆ CS_DUMP_ONLY_CHANGED

#define CS_DUMP_ONLY_CHANGED   (1 << 0)

Only show config that the user has changed.

Definition at line 37 of file dump.h.

◆ CS_DUMP_HIDE_SENSITIVE

#define CS_DUMP_HIDE_SENSITIVE   (1 << 1)

Obscure sensitive information like passwords.

Definition at line 38 of file dump.h.

◆ CS_DUMP_NO_ESCAPING

#define CS_DUMP_NO_ESCAPING   (1 << 2)

Do not escape special chars, or quote the string.

Definition at line 39 of file dump.h.

◆ CS_DUMP_HIDE_NAME

#define CS_DUMP_HIDE_NAME   (1 << 3)

Do not print the name of the config item.

Definition at line 40 of file dump.h.

◆ CS_DUMP_HIDE_VALUE

#define CS_DUMP_HIDE_VALUE   (1 << 4)

Do not print the value of the config item.

Definition at line 41 of file dump.h.

◆ CS_DUMP_SHOW_DEFAULTS

#define CS_DUMP_SHOW_DEFAULTS   (1 << 5)

Show the default value for the config item.

Definition at line 42 of file dump.h.

◆ CS_DUMP_SHOW_DISABLED

#define CS_DUMP_SHOW_DISABLED   (1 << 6)

Show disabled config items, too.

Definition at line 43 of file dump.h.

◆ CS_DUMP_SHOW_SYNONYMS

#define CS_DUMP_SHOW_SYNONYMS   (1 << 7)

Show synonyms and the config items they're linked to.

Definition at line 44 of file dump.h.

◆ CS_DUMP_SHOW_DEPRECATED

#define CS_DUMP_SHOW_DEPRECATED   (1 << 8)

Show config items that aren't used any more.

Definition at line 45 of file dump.h.

◆ CS_DUMP_SHOW_DOCS

#define CS_DUMP_SHOW_DOCS   (1 << 9)

Show one-liner documentation for the config item.

Definition at line 46 of file dump.h.

◆ CS_DUMP_LINK_DOCS

#define CS_DUMP_LINK_DOCS   (1 << 10)

Link to the online docs.

Definition at line 47 of file dump.h.

Typedef Documentation

◆ ConfigDumpFlags

typedef uint16_t ConfigDumpFlags

Flags for dump_config(), e.g. CS_DUMP_ONLY_CHANGED.

Definition at line 35 of file dump.h.

Function Documentation

◆ dump_config_neo()

void dump_config_neo ( struct ConfigSet * cs,
struct HashElem * he,
struct Buffer * value,
struct Buffer * initial,
ConfigDumpFlags flags,
FILE * fp )

Dump the config in the style of NeoMutt.

Parameters
csConfig items
heHashElem representing config item
valueCurrent value of the config item
initialInitial value of the config item
flagsFlags, see ConfigDumpFlags
fpFile pointer to write to

Definition at line 108 of file dump.c.

110{
111 if (!he || !value || !fp)
112 return;
113
114 const char *name = he->key.strkey;
115
116 if ((flags & CS_DUMP_ONLY_CHANGED) &&
117 (!initial || mutt_str_equal(value->data, initial->data)))
118 {
119 return;
120 }
121
122 if (he->type == DT_SYNONYM)
123 {
124 const struct ConfigDef *cdef = he->data;
125 const char *syn = (const char *) cdef->initial;
126 fprintf(fp, "# synonym: %s -> %s\n", name, syn);
127 return;
128 }
129
130 if (flags & CS_DUMP_SHOW_DOCS)
131 {
132 const struct ConfigDef *cdef = he->data;
133 fprintf(fp, "# %s\n", cdef->docs);
134 }
135
136 bool show_name = !(flags & CS_DUMP_HIDE_NAME);
137 bool show_value = !(flags & CS_DUMP_HIDE_VALUE);
138
139 if (show_name && show_value)
140 fprintf(fp, "set ");
141 if (show_name)
142 {
143 if (flags & CS_DUMP_LINK_DOCS)
144 {
145 // Used to generate unique ids for the urls
146 static int seq_num = 1;
147
148 if (CONFIG_TYPE(he->type) == DT_MYVAR)
149 {
150 static const char *url = "https://neomutt.org/guide/configuration#set-myvar";
151 fprintf(fp, "\033]8;id=%d;%s\a%s\033]8;;\a", seq_num++, url, name);
152 }
153 else
154 {
155 char *fragment = mutt_str_dup(name);
156 for (char *underscore = fragment; (underscore = strchr(underscore, '_')); underscore++)
157 {
158 *underscore = '-';
159 }
160
161 static const char *url = "https://neomutt.org/guide/reference";
162 fprintf(fp, "\033]8;id=%d;%s#%s\a%s\033]8;;\a", seq_num++, url, fragment, name);
163 FREE(&fragment);
164 }
165 }
166 else
167 {
168 fprintf(fp, "%s", name);
169 }
170 }
171 if (show_name && show_value)
172 fprintf(fp, " = ");
173 if (show_value)
174 fprintf(fp, "%s", value->data);
175 if (show_name || show_value)
176 fprintf(fp, "\n");
177
178 if (flags & CS_DUMP_SHOW_DEFAULTS)
179 {
180 const struct ConfigSetType *cst = cs_get_type_def(cs, he->type);
181 if (cst)
182 fprintf(fp, "# %s %s %s\n", cst->name, name, value->data);
183 }
184
185 if (flags & CS_DUMP_SHOW_DOCS)
186 fprintf(fp, "\n");
187}
#define CS_DUMP_HIDE_VALUE
Do not print the value of the config item.
Definition dump.h:41
#define CS_DUMP_LINK_DOCS
Link to the online docs.
Definition dump.h:47
#define CS_DUMP_ONLY_CHANGED
Only show config that the user has changed.
Definition dump.h:37
#define CS_DUMP_HIDE_NAME
Do not print the name of the config item.
Definition dump.h:40
#define CS_DUMP_SHOW_DEFAULTS
Show the default value for the config item.
Definition dump.h:42
#define CS_DUMP_SHOW_DOCS
Show one-liner documentation for the config item.
Definition dump.h:46
const struct ConfigSetType * cs_get_type_def(const struct ConfigSet *cs, unsigned int type)
Get the definition for a type.
Definition set.c:198
#define FREE(x)
Definition memory.h:62
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition string.c:255
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:660
char * data
Pointer to data.
Definition buffer.h:37
const char * name
User-visible name.
Definition set.h:63
intptr_t initial
Initial value.
Definition set.h:65
const char * docs
One-liner description.
Definition set.h:81
const char * name
Name of the type, e.g. "String".
Definition set.h:95
union HashKey key
Key representing the data.
Definition hash.h:46
int type
Type of data stored in Hash Table, e.g. DT_STRING.
Definition hash.h:45
void * data
User-supplied data.
Definition hash.h:47
#define CONFIG_TYPE(t)
Definition types.h:49
@ DT_SYNONYM
synonym for another variable
Definition types.h:45
@ DT_MYVAR
a user-defined variable (my_foo)
Definition types.h:37
const char * strkey
String key.
Definition hash.h:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ dump_config()

bool dump_config ( struct ConfigSet * cs,
struct HashElemArray * hea,
ConfigDumpFlags flags,
FILE * fp )

Write all the config to a file.

Parameters
csConfigSet to dump
heaArray of Config HashElem to dump
flagsFlags, see ConfigDumpFlags
fpFile to write config to

Definition at line 196 of file dump.c.

198{
199 if (!cs || !hea || !fp)
200 return false;
201
202 bool result = true;
203
204 struct Buffer *value = buf_pool_get();
205 struct Buffer *initial = buf_pool_get();
206 struct Buffer *tmp = buf_pool_get();
207
208 struct HashElem **hep = NULL;
209 ARRAY_FOREACH(hep, hea)
210 {
211 struct HashElem *he = *hep;
212 buf_reset(value);
213 buf_reset(initial);
214 const int type = CONFIG_TYPE(he->type);
215
216 /* If necessary, get the current value */
217 if ((flags & CS_DUMP_ONLY_CHANGED) || !(flags & CS_DUMP_HIDE_VALUE) ||
218 (flags & CS_DUMP_SHOW_DEFAULTS))
219 {
220 int rc = cs_he_string_get(cs, he, value);
221 if (CSR_RESULT(rc) != CSR_SUCCESS)
222 {
223 result = false; /* LCOV_EXCL_LINE */
224 break; /* LCOV_EXCL_LINE */
225 }
226
227 const struct ConfigDef *cdef = he->data;
228 if ((type == DT_STRING) && (cdef->type & D_SENSITIVE) &&
229 (flags & CS_DUMP_HIDE_SENSITIVE) && !buf_is_empty(value))
230 {
231 buf_reset(value);
232 buf_addstr(value, "***");
233 }
234
235 if (((type == DT_PATH) || IS_MAILBOX(he->type)) && (buf_at(value, 0) == '/'))
236 mutt_pretty_mailbox(value->data, value->dsize);
237
238 // Quote/escape the values of config options NOT of these types
239 if ((type != DT_BOOL) && (type != DT_NUMBER) && (type != DT_LONG) &&
240 (type != DT_QUAD) && (type != DT_ENUM) && (type != DT_SORT) &&
241 !(flags & CS_DUMP_NO_ESCAPING))
242 {
243 buf_reset(tmp);
244 pretty_var(value->data, tmp);
245 buf_strcpy(value, tmp->data);
246 }
247 }
248
249 /* If necessary, get the default value */
251 {
252 int rc = cs_he_initial_get(cs, he, initial);
253 if (CSR_RESULT(rc) != CSR_SUCCESS)
254 {
255 result = false; /* LCOV_EXCL_LINE */
256 break; /* LCOV_EXCL_LINE */
257 }
258
259 if (((type == DT_PATH) || IS_MAILBOX(he->type)) && (buf_at(initial, 0) == '/'))
260 mutt_pretty_mailbox(initial->data, initial->dsize);
261
262 // Quote/escape the values of config options NOT of these types
263 if ((type != DT_BOOL) && (type != DT_NUMBER) && (type != DT_LONG) &&
264 (type != DT_QUAD) && (type != DT_ENUM) && (type != DT_SORT) &&
265 !(flags & CS_DUMP_NO_ESCAPING))
266 {
267 buf_reset(tmp);
268 pretty_var(initial->data, tmp);
269 buf_strcpy(initial, tmp->data);
270 }
271 }
272
273 dump_config_neo(cs, he, value, initial, flags, fp);
274 }
275
276 buf_pool_release(&value);
278 buf_pool_release(&tmp);
279
280 return result;
281}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition array.h:214
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition buffer.c:76
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition buffer.c:291
char buf_at(const struct Buffer *buf, size_t offset)
Return the character at the given offset.
Definition buffer.c:668
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
Definition buffer.c:226
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition buffer.c:395
size_t pretty_var(const char *str, struct Buffer *buf)
Escape and stringify a config item value.
Definition dump.c:85
void dump_config_neo(struct ConfigSet *cs, struct HashElem *he, struct Buffer *value, struct Buffer *initial, ConfigDumpFlags flags, FILE *fp)
Dump the config in the style of NeoMutt.
Definition dump.c:108
void mutt_pretty_mailbox(char *buf, size_t buflen)
Shorten a mailbox path using '~' or '='.
Definition muttlib.c:439
#define CS_DUMP_NO_ESCAPING
Do not escape special chars, or quote the string.
Definition dump.h:39
#define CS_DUMP_HIDE_SENSITIVE
Obscure sensitive information like passwords.
Definition dump.h:38
int cs_he_string_get(const struct ConfigSet *cs, struct HashElem *he, struct Buffer *result)
Get a config item as a string.
Definition set.c:691
int cs_he_initial_get(const struct ConfigSet *cs, struct HashElem *he, struct Buffer *result)
Get the initial, or parent, value of a config item.
Definition set.c:557
#define CSR_RESULT(x)
Definition set.h:50
#define CSR_SUCCESS
Action completed successfully.
Definition set.h:33
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:82
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:96
String manipulation buffer.
Definition buffer.h:36
size_t dsize
Length of data.
Definition buffer.h:39
uint32_t type
Variable type, e.g. DT_STRING.
Definition set.h:64
The item stored in a Hash Table.
Definition hash.h:44
#define IS_MAILBOX(flags)
Definition types.h:121
@ DT_NUMBER
a number
Definition types.h:38
@ DT_BOOL
boolean option
Definition types.h:32
@ DT_QUAD
quad-option (no/yes/ask-no/ask-yes)
Definition types.h:40
@ DT_STRING
a string
Definition types.h:44
@ DT_SORT
sorting methods
Definition types.h:43
@ DT_LONG
a number (long)
Definition types.h:35
@ DT_ENUM
an enumeration
Definition types.h:33
@ DT_PATH
a path to a file/directory
Definition types.h:39
#define D_SENSITIVE
Contains sensitive value, e.g. password.
Definition types.h:80
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ escape_string()

size_t escape_string ( struct Buffer * buf,
const char * src )

Write a string to a buffer, escaping special characters.

Parameters
bufBuffer to write to
srcString to write
Return values
numBytes written to buffer

Definition at line 48 of file dump.c.

49{
50 if (!buf || !src)
51 return 0;
52
53 size_t len = 0;
54 for (; *src; src++)
55 {
56 switch (*src)
57 {
58 case '\007':
59 len += buf_addstr(buf, "\\g");
60 break;
61 case '\n':
62 len += buf_addstr(buf, "\\n");
63 break;
64 case '\r':
65 len += buf_addstr(buf, "\\r");
66 break;
67 case '\t':
68 len += buf_addstr(buf, "\\t");
69 break;
70 default:
71 if ((*src == '\\') || (*src == '"'))
72 len += buf_addch(buf, '\\');
73 len += buf_addch(buf, src[0]);
74 }
75 }
76 return len;
77}
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
Definition buffer.c:241
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ pretty_var()

size_t pretty_var ( const char * str,
struct Buffer * buf )

Escape and stringify a config item value.

Parameters
strString to escape
bufBuffer to write to
Return values
numNumber of bytes written to buffer

Definition at line 85 of file dump.c.

86{
87 if (!buf || !str)
88 return 0;
89
90 int len = 0;
91
92 len += buf_addch(buf, '"');
93 len += escape_string(buf, str);
94 len += buf_addch(buf, '"');
95
96 return len;
97}
size_t escape_string(struct Buffer *buf, const char *src)
Write a string to a buffer, escaping special characters.
Definition dump.c:48
+ Here is the call graph for this function:
+ Here is the caller graph for this function: