NeoMutt  2023-11-03-85-g512e01
Teaching an old dog new tricks
No Matches
rc.c File Reference

Parse lines from a runtime configuration (rc) file. More...

#include "config.h"
#include <stdio.h>
#include "mutt/lib.h"
#include "core/lib.h"
#include "extract.h"
+ Include dependency graph for rc.c:

Go to the source code of this file.


enum CommandResult parse_rc_buffer (struct Buffer *line, struct Buffer *token, struct Buffer *err)
 Parse a line of user config.
enum CommandResult parse_rc_line (const char *line, struct Buffer *err)
 Parse a line of user config.

Detailed Description

Parse lines from a runtime configuration (rc) file.

  • 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

Definition in file rc.c.

Function Documentation

◆ parse_rc_buffer()

enum CommandResult parse_rc_buffer ( struct Buffer line,
struct Buffer token,
struct Buffer err 

Parse a line of user config.

lineconfig line to read
tokenscratch buffer to be used by parser
errwhere to write error messages
Return values
CommandResultResult e.g. MUTT_CMD_SUCCESS

The reason for token is to avoid having to allocate and deallocate a lot of memory if we are parsing many lines. the caller can pass in the memory to use, which avoids having to create new space for every call to this function.

Definition at line 46 of file rc.c.

49 if (buf_len(line) == 0)
50 return 0;
54 buf_reset(err);
56 /* Read from the beginning of line->data */
57 buf_seek(line, 0);
59 SKIPWS(line->dptr);
60 while (*line->dptr)
61 {
62 if (*line->dptr == '#')
63 break; /* rest of line is a comment */
64 if (*line->dptr == ';')
65 {
66 line->dptr++;
67 continue;
68 }
71 struct Command *cmd = NULL;
72 size_t size = commands_array(&cmd);
73 size_t i;
74 for (i = 0; i < size; i++)
75 {
76 if (mutt_str_equal(token->data, cmd[i].name))
77 {
78 mutt_debug(LL_DEBUG1, "NT_COMMAND: %s\n", cmd[i].name);
79 rc = cmd[i].parse(token, line, cmd[i].data, err);
80 if ((rc == MUTT_CMD_WARNING) || (rc == MUTT_CMD_ERROR) || (rc == MUTT_CMD_FINISH))
81 goto finish; /* Propagate return code */
83 notify_send(NeoMutt->notify, NT_COMMAND, i, (void *) cmd);
84 break; /* Continue with next command */
85 }
86 }
87 if (i == size)
88 {
89 buf_printf(err, _("%s: unknown command"), buf_string(token));
91 break; /* Ignore the rest of the line */
92 }
93 }
95 return rc;
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:173
void buf_seek(struct Buffer *buf, size_t offset)
Set current read/write position to offset from beginning.
Definition: buffer.c:593
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:466
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:88
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:93
Error codes for command_t parse functions.
Definition: command.h:36
Success: Command worked.
Definition: command.h:39
Error: Can't help the user.
Definition: command.h:37
Warning: Help given to the user.
Definition: command.h:38
Finish: Stop processing this file.
Definition: command.h:40
size_t commands_array(struct Command **first)
Get Commands array.
Definition: command.c:75
int parse_extract_token(struct Buffer *dest, struct Buffer *tok, TokenFlags flags)
Extract one token from a string.
Definition: extract.c:48
No flags are set.
Definition: extract.h:45
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
Log at debug level 1.
Definition: logging2.h:43
#define _(a)
Definition: message.h:28
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:173
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:798
A Command has been executed, Command.
Definition: notify_type.h:42
#define SKIPWS(ch)
Definition: string2.h:45
char * dptr
Current read/write position.
Definition: buffer.h:36
char * data
Pointer to data.
Definition: buffer.h:35
enum CommandResult(* parse)(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err)
Definition: command.h:65
intptr_t data
Data or flags to pass to the command.
Definition: command.h:67
const char * name
Name of the command.
Definition: command.h:52
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct Notify * notify
Notifications handler.
Definition: neomutt.h:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_rc_line()

enum CommandResult parse_rc_line ( const char *  line,
struct Buffer err 

Parse a line of user config.

lineConfig line to read
errWhere to write error messages
Return values
CommandResultResult e.g. MUTT_CMD_SUCCESS

Definition at line 104 of file rc.c.

106 if (!line || (*line == '\0'))
107 return MUTT_CMD_ERROR;
109 struct Buffer *line_buffer = buf_pool_get();
110 struct Buffer *token = buf_pool_get();
112 buf_strcpy(line_buffer, line);
114 enum CommandResult rc = parse_rc_buffer(line_buffer, token, err);
116 buf_pool_release(&line_buffer);
117 buf_pool_release(&token);
118 return rc;
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition: buffer.c:407
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
enum CommandResult parse_rc_buffer(struct Buffer *line, struct Buffer *token, struct Buffer *err)
Parse a line of user config.
Definition: rc.c:46
String manipulation buffer.
Definition: buffer.h:34
+ Here is the call graph for this function:
+ Here is the caller graph for this function: