NeoMutt  2023-05-17-16-g61469c
Teaching an old dog new tricks
rc.c File Reference

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

#include "config.h"
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include "mutt/lib.h"
#include "config/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. More...
enum CommandResult parse_rc_line (const char *line, struct Buffer *err)
 Parse a line of user config. More...

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 50 of file rc.c.

53 if (buf_len(line) == 0)
54 return 0;
58 buf_reset(err);
60 /* Read from the beginning of line->data */
61 buf_seek(line, 0);
63 SKIPWS(line->dptr);
64 while (*line->dptr)
65 {
66 if (*line->dptr == '#')
67 break; /* rest of line is a comment */
68 if (*line->dptr == ';')
69 {
70 line->dptr++;
71 continue;
72 }
75 struct Command *cmd = NULL;
76 size_t size = commands_array(&cmd);
77 size_t i;
78 for (i = 0; i < size; i++)
79 {
80 if (mutt_str_equal(token->data, cmd[i].name))
81 {
82 mutt_debug(LL_DEBUG1, "NT_COMMAND: %s\n", cmd[i].name);
83 rc = cmd[i].parse(token, line, cmd[i].data, err);
84 if ((rc == MUTT_CMD_WARNING) || (rc == MUTT_CMD_ERROR) || (rc == MUTT_CMD_FINISH))
85 goto finish; /* Propagate return code */
87 notify_send(NeoMutt->notify, NT_COMMAND, i, (void *) cmd);
88 break; /* Continue with next command */
89 }
90 }
91 if (i == size)
92 {
93 buf_printf(err, _("%s: unknown command"), NONULL(token->data));
95 break; /* Ignore the rest of the line */
96 }
97 }
99 return rc;
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:171
void buf_seek(struct Buffer *buf, size_t offset)
Set current read/write position to offset from beginning.
Definition: buffer.c:526
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:414
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:86
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:47
No flags are set.
Definition: extract.h:44
#define mutt_debug(LEVEL,...)
Definition: logging2.h:84
Log at debug level 1.
Definition: logging2.h:40
#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:171
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 NONULL(x)
Definition: string2.h:37
#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:37
struct Notify * notify
Notifications handler.
Definition: neomutt.h:38
+ 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 108 of file rc.c.

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