NeoMutt  2025-12-11-1039-g550ac6
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
node_conddate.c File Reference

Expando Node for a Conditional Date. More...

#include "config.h"
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mutt/lib.h"
#include "node_conddate.h"
#include "helpers.h"
#include "node.h"
#include "parse.h"
#include "render.h"
Include dependency graph for node_conddate.c:

Go to the source code of this file.

Functions

struct NodeCondDatePrivatenode_conddate_private_new (int count, char period)
 Create new CondDate private data.
void node_conddate_private_free (void **ptr)
 Free CondDate private data - Implements ExpandoNode::ndata_free().
time_t cutoff_number (char period, int count)
 Calculate the cutoff time for n units.
time_t cutoff_this (char period)
 Calculate the cutoff time of this unit.
int node_conddate_render (const struct ExpandoNode *node, const struct ExpandoRenderCallback *erc, struct Buffer *buf, int max_cols, void *data, MuttFormatFlags flags)
 Render a CondDate Node - Implements ExpandoNode::render() -.
struct ExpandoNodenode_conddate_new (int count, char period, int did, int uid)
 Create a new CondDate ExpandoNode.
struct ExpandoNodenode_conddate_parse (const char *str, int did, int uid, const char **parsed_until, struct ExpandoParseError *err)
 Parse a CondDate format string.

Detailed Description

Expando Node for a Conditional Date.

Authors
  • Tóth János
  • Richard Russon
  • Thomas Klausner

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 node_conddate.c.

Function Documentation

◆ node_conddate_private_new()

struct NodeCondDatePrivate * node_conddate_private_new ( int count,
char period )

Create new CondDate private data.

Parameters
countNumber of 'units' to count
periodUnits, e.g. 'd' Day or 'm' Month
Return values
ptrNew CondDate private data

Definition at line 49 of file node_conddate.c.

50{
52
53 priv->count = count;
54 priv->period = period;
55
56 return priv;
57}
#define MUTT_MEM_CALLOC(n, type)
Definition memory.h:52
Private data for a Conditional Date -.
int count
Number of 'units' to count.
char period
Units, e.g. 'd' Day or 'm' Month.
Here is the caller graph for this function:

◆ node_conddate_private_free()

void node_conddate_private_free ( void ** ptr)

Free CondDate private data - Implements ExpandoNode::ndata_free().

Parameters
ptrData to free

Definition at line 63 of file node_conddate.c.

64{
65 if (!ptr || !*ptr)
66 return;
67
68 FREE(ptr);
69}
#define FREE(x)
Free memory and set the pointer to NULL.
Definition memory.h:68
Here is the caller graph for this function:

◆ cutoff_number()

time_t cutoff_number ( char period,
int count )

Calculate the cutoff time for n units.

Parameters
periodTime period, from [ymwdHM]
countNumber of time periods
Return values
numCutoff time

Calculate the cutoff time for, say, 3 months, or 2 hours.

Definition at line 79 of file node_conddate.c.

80{
81 time_t t = mutt_date_now();
82 struct tm tm = { 0 };
83 localtime_r(&t, &tm);
84
85 switch (period)
86 {
87 case 'y':
88 tm.tm_year -= count;
89 break;
90
91 case 'm':
92 tm.tm_mon -= count;
93 break;
94
95 case 'w':
96 tm.tm_mday -= (7 * count);
97 break;
98
99 case 'd':
100 tm.tm_mday -= count;
101 break;
102
103 case 'H':
104 tm.tm_hour -= count;
105 break;
106
107 case 'M':
108 tm.tm_min -= count;
109 break;
110
111 default:
112 break;
113 }
114
115 return mktime(&tm);
116}
time_t mutt_date_now(void)
Return the number of seconds since the Unix epoch.
Definition date.c:459
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cutoff_this()

time_t cutoff_this ( char period)

Calculate the cutoff time of this unit.

Parameters
periodTime period, from [ymwdHM]
Return values
numCutoff time

Calculate the cutoff time of, say, this day (today), this month.

Definition at line 125 of file node_conddate.c.

126{
127 time_t t = mutt_date_now();
128 struct tm tm = { 0 };
129 localtime_r(&t, &tm);
130
131 switch (period)
132 {
133 case 'y':
134 tm.tm_mon = 0; // January
136
137 case 'm':
138 tm.tm_mday = 1; // 1st of the month
140
141 case 'd':
142 tm.tm_hour = 0; // Beginning of day (Midnight)
144
145 case 'H':
146 tm.tm_min = 0; // Beginning of hour
148
149 case 'M':
150 tm.tm_sec = 0; // Beginning of minute
151 break;
152
153 case 'w':
154 tm.tm_hour = 0; // Beginning of day (Midnight)
155 tm.tm_min = 0; // Beginning of hour
156 tm.tm_sec = 0; // Beginning of minute
157 int bow = 0; // Beginning of week
158 if (tm.tm_wday == 0)
159 bow = 6; // LCOV_EXCL_LINE
160 else
161 bow = tm.tm_wday - 1; // LCOV_EXCL_LINE
162 tm.tm_mday -= bow;
163 break;
164
165 default:
166 break;
167 }
168
169 return mktime(&tm);
170}
#define FALLTHROUGH
Definition lib.h:117
Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_conddate_new()

struct ExpandoNode * node_conddate_new ( int count,
char period,
int did,
int uid )

Create a new CondDate ExpandoNode.

Parameters
countNumber of 'units' to count
periodUnits, e.g. 'd' Day or 'm' Month
didDomain ID
uidUnique ID
Return values
ptrNew CondDate ExpandoNode

Definition at line 205 of file node_conddate.c.

206{
207 struct ExpandoNode *node = node_new();
208 node->type = ENT_CONDDATE;
209 node->did = did;
210 node->uid = uid;
212
213 node->ndata = node_conddate_private_new(count, period);
215
216 return node;
217}
int node_conddate_render(const struct ExpandoNode *node, const struct ExpandoRenderCallback *erc, struct Buffer *buf, int max_cols, void *data, MuttFormatFlags flags)
Render a CondDate Node - Implements ExpandoNode::render() -.
struct ExpandoNode * node_new(void)
Create a new empty ExpandoNode.
Definition node.c:39
@ ENT_CONDDATE
True/False date condition.
Definition node.h:43
struct NodeCondDatePrivate * node_conddate_private_new(int count, char period)
Create new CondDate private data.
void node_conddate_private_free(void **ptr)
Free CondDate private data - Implements ExpandoNode::ndata_free().
Basic Expando Node.
Definition node.h:67
int uid
Unique ID, e.g. ED_EMA_SIZE.
Definition node.h:70
void * ndata
Private node data.
Definition node.h:77
int(* render)(const struct ExpandoNode *node, const struct ExpandoRenderCallback *erc, struct Buffer *buf, int max_cols, void *data, MuttFormatFlags flags)
Definition node.h:92
int did
Domain ID, e.g. ED_EMAIL.
Definition node.h:69
enum ExpandoNodeType type
Type of Node, e.g. ENT_EXPANDO.
Definition node.h:68
void(* ndata_free)(void **ptr)
Function to free the private node data.
Definition node.h:78
Here is the call graph for this function:
Here is the caller graph for this function:

◆ node_conddate_parse()

struct ExpandoNode * node_conddate_parse ( const char * str,
int did,
int uid,
const char ** parsed_until,
struct ExpandoParseError * err )

Parse a CondDate format string.

Parameters
[in]strString to parse
[in]didDomain ID
[in]uidUnique ID
[out]parsed_untilFirst character after parsed string
[out]errBuffer for errors

Definition at line 227 of file node_conddate.c.

230{
231 if (!str || (str[0] == '\0') || !parsed_until || !err)
232 return NULL;
233
234 int count = 0;
235 char period = '\0';
236
237 str++;
238
239 if (mutt_isdigit(*str))
240 {
241 unsigned short number = 0;
242 const char *end_ptr = mutt_str_atous(str, &number);
243
244 // NOTE(g0mb4): str is NOT NUL-terminated
245 if (!end_ptr || (number == USHRT_MAX))
246 {
247 err->position = str;
248 snprintf(err->message, sizeof(err->message), _("Invalid number: %s"), str);
249 return NULL;
250 }
251
252 count = number;
253 str = end_ptr;
254 };
255
256 // Allowed periods: year, month, week, day, hour, minute
257 if (!strchr("ymwdHM", *str))
258 {
259 err->position = str;
260 snprintf(err->message, sizeof(err->message),
261 // L10N: The 'ymwdHM' should not be translated
262 _("Invalid time period: '%c', must be one of 'ymwdHM'"), *str);
263 return NULL;
264 }
265
266 period = *str;
267 *parsed_until = str + 1;
268
269 return node_conddate_new(count, period, did, uid);
270}
const char * mutt_str_atous(const char *str, unsigned short *dst)
Convert ASCII string to an unsigned short.
Definition atoi.c:269
bool mutt_isdigit(int arg)
Wrapper for isdigit(3).
Definition ctype.c:66
#define _(a)
Definition message.h:28
struct ExpandoNode * node_conddate_new(int count, char period, int did, int uid)
Create a new CondDate ExpandoNode.
char message[1024]
Error message.
Definition parse.h:38
const char * position
Position of error in original string.
Definition parse.h:39
Here is the call graph for this function:
Here is the caller graph for this function: