NeoMutt  2024-04-25-1-g3de005
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
node_condbool.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <assert.h>
32#include <stdio.h>
33#include "mutt/lib.h"
34#include "node_condbool.h"
35#include "definition.h"
36#include "helpers.h"
37#include "node.h"
38#include "node_expando.h"
39#include "parse.h"
40#include "render.h"
41
50struct ExpandoNode *node_condbool_new(const char *start, const char *end, int did, int uid)
51{
52 struct ExpandoNode *node = node_new();
53
54 node->type = ENT_CONDBOOL;
55 node->start = start;
56 node->end = end;
57
58 node->did = did;
59 node->uid = uid;
61
62 return node;
63}
64
68struct ExpandoNode *node_condbool_parse(const char *s, const char **parsed_until,
69 const struct ExpandoDefinition *defs,
71 struct ExpandoParseError *error)
72{
73 const struct ExpandoDefinition *definition = defs;
74
75 const char *format_end = skip_until_classic_expando(s);
76 const char *expando_end = skip_classic_expando(format_end, defs);
77 char expando[128] = { 0 };
78 const int expando_len = expando_end - format_end;
79 mutt_strn_copy(expando, format_end, expando_len, sizeof(expando));
80
81 while (definition && definition->short_name)
82 {
83 if (mutt_str_equal(definition->short_name, expando))
84 {
85 if (definition->parse)
86 {
87 return definition->parse(s, parsed_until, definition->did,
88 definition->uid, flags, error);
89 }
90 else
91 {
92 *parsed_until = expando_end;
93 return node_condbool_new(format_end, expando_end, definition->did,
94 definition->uid);
95 }
96 }
97
98 definition++;
99 }
100
101 error->position = format_end;
102 // L10N: e.g. "Unknown expando: %Q"
103 snprintf(error->message, sizeof(error->message), _("Unknown expando: %%%.*s"),
104 expando_len, format_end);
105 return NULL;
106}
107
111int node_condbool_render(const struct ExpandoNode *node,
112 const struct ExpandoRenderData *rdata, struct Buffer *buf,
113 int max_cols, void *data, MuttFormatFlags flags)
114{
115 assert(node->type == ENT_CONDBOOL);
116
117 const struct ExpandoRenderData *rd_match = find_get_number(rdata, node->did, node->uid);
118 if (rd_match)
119 {
120 const long num = rd_match->get_number(node, data, flags);
121 return (num != 0); // bool-ify
122 }
123
124 rd_match = find_get_string(rdata, node->did, node->uid);
125 if (rd_match)
126 {
127 struct Buffer *buf_str = buf_pool_get();
128 rd_match->get_string(node, data, flags, max_cols, buf_str);
129 const size_t len = buf_len(buf_str);
130 buf_pool_release(&buf_str);
131
132 return (len > 0); // bool-ify
133 }
134
135 return 0;
136}
size_t buf_len(const struct Buffer *buf)
Calculate the length of a Buffer.
Definition: buffer.c:490
Define an Expando format string.
uint8_t ExpandoParserFlags
Flags for expando_parse(), e.g. EP_CONDITIONAL.
Definition: definition.h:41
const char * skip_classic_expando(const char *str, const struct ExpandoDefinition *defs)
Skip over the text of an Expando.
Definition: helpers.c:145
const char * skip_until_classic_expando(const char *start)
Search through string until we reach an Expando character.
Definition: helpers.c:129
const struct ExpandoRenderData * find_get_number(const struct ExpandoRenderData *rdata, int did, int uid)
Find a get_number() callback function.
Definition: helpers.c:48
const struct ExpandoRenderData * find_get_string(const struct ExpandoRenderData *rdata, int did, int uid)
Find a get_string() callback function.
Definition: helpers.c:72
Shared code.
Expando Parsing.
struct ExpandoNode * node_condbool_parse(const char *s, const char **parsed_until, const struct ExpandoDefinition *defs, ExpandoParserFlags flags, struct ExpandoParseError *error)
Parse a CondBool format string - Implements ExpandoDefinition::parse() -.
Definition: node_condbool.c:68
int node_condbool_render(const struct ExpandoNode *node, const struct ExpandoRenderData *rdata, struct Buffer *buf, int max_cols, void *data, MuttFormatFlags flags)
Callback for every bool node - Implements ExpandoNode::render() -.
Convenience wrapper for the library headers.
#define _(a)
Definition: message.h:28
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:654
char * mutt_strn_copy(char *dest, const char *src, size_t len, size_t dsize)
Copy a sub-string into a buffer.
Definition: string.c:354
struct ExpandoNode * node_new(void)
Create a new empty ExpandoNode.
Definition: node.c:39
Basic Expando Node.
@ ENT_CONDBOOL
True/False boolean condition.
Definition: node.h:42
struct ExpandoNode * node_condbool_new(const char *start, const char *end, int did, int uid)
Create a new CondBool ExpandoNode.
Definition: node_condbool.c:50
Expando Node for a Conditional Boolean.
Expando Node for an Expando.
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
Render Expandos using Data.
uint8_t MuttFormatFlags
Flags for expando_render(), e.g. MUTT_FORMAT_FORCESUBJ.
Definition: render.h:32
String manipulation buffer.
Definition: buffer.h:36
char * data
Pointer to data.
Definition: buffer.h:37
Definition of a format string.
Definition: definition.h:52
short uid
Unique ID in domain.
Definition: definition.h:56
short did
Domain ID.
Definition: definition.h:55
struct ExpandoNode *(* parse)(const char *str, const char **parsed_until, int did, int uid, ExpandoParserFlags flags, struct ExpandoParseError *error)
Definition: definition.h:70
const char * short_name
Short Expando name, e.g. "n".
Definition: definition.h:53
Basic Expando Node.
Definition: node.h:69
int uid
Unique ID, e.g. ED_EMA_SIZE.
Definition: node.h:73
int(* render)(const struct ExpandoNode *node, const struct ExpandoRenderData *rdata, struct Buffer *buf, int max_cols, void *data, MuttFormatFlags flags)
Definition: node.h:96
const char * end
End of string data.
Definition: node.h:80
int did
Domain ID, e.g. ED_EMAIL.
Definition: node.h:72
enum ExpandoNodeType type
Type of Node, e.g. ENT_EXPANDO.
Definition: node.h:70
const char * start
Start of string data.
Definition: node.h:79
Buffer for parsing errors.
Definition: parse.h:34
char message[128]
Error message.
Definition: parse.h:35
const char * position
Position of error in original string.
Definition: parse.h:36
void(* get_string)(const struct ExpandoNode *node, void *data, MuttFormatFlags flags, int max_cols, struct Buffer *buf)
Definition: render.h:65
long(* get_number)(const struct ExpandoNode *node, void *data, MuttFormatFlags flags)
Definition: render.h:79