From 92dc069fc4f80c0c2afd542beb012695ad702581 Mon Sep 17 00:00:00 2001
From: Lars Henriksen <LarsHenriksen@get2net.dk>
Date: Sat, 23 May 2020 21:12:44 +0200
Subject: Include start day in error message for recurrence rule

Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 src/calcurse.h |  1 +
 src/recur.c    | 12 ++++++++----
 src/ui-day.c   | 19 +++++++++++--------
 src/utils.c    | 16 ++++++++++++++++
 4 files changed, 36 insertions(+), 12 deletions(-)

(limited to 'src')

diff --git a/src/calcurse.h b/src/calcurse.h
index 0c959a9..25c63a0 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1269,6 +1269,7 @@ long overflow_mul(long, long, long *);
 time_t next_wday(time_t, int);
 int wday_per_year(int, int);
 int wday_per_month(int, int, int);
+char *day_ins(char **, time_t);
 
 /* vars.c */
 extern int col, row;
diff --git a/src/recur.c b/src/recur.c
index 510fddb..d028d09 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -518,8 +518,10 @@ char *recur_apoint_scan(FILE *f, struct tm start, struct tm end,
 	/* Does it occur on the start day? */
 	if (!recur_item_find_occurrence(tstart, tend - tstart, rpt, NULL,
 					update_time_in_date(tstart, 0, 0),
-					NULL))
-		return _("recurrence error: not on start day");
+					NULL)) {
+		char *fmt = _("recurrence error: not on start day (%s)");
+		return day_ins(&fmt, tstart);
+	}
 
 	/* Filter item. */
 	if (filter) {
@@ -589,8 +591,10 @@ char *recur_event_scan(FILE * f, struct tm start, int id,
 	/* Does it occur on the start day? */
 	if (!recur_item_find_occurrence(tstart, -1, rpt, NULL,
 					update_time_in_date(tstart, 0, 0),
-					NULL))
-		return _("recurrence error: not on start day");
+					NULL)) {
+		char *fmt = _("recurrence error: not on start day (%s)");
+		return day_ins(&fmt, tstart);
+	}
 
 	/* Filter item. */
 	if (filter) {
diff --git a/src/ui-day.c b/src/ui-day.c
index 5a8d960..bd83cac 100644
--- a/src/ui-day.c
+++ b/src/ui-day.c
@@ -175,8 +175,8 @@ static void update_start_time(time_t *start, long *dur, struct rpt *rpt, int mov
 	time_t newtime;
 	const char *msg_wrong_time =
 	    _("Invalid time: start time must come before end time!");
-	const char *msg_match =
-		_("Repetition must begin on start day.");
+	char *msg_match =
+		_("Repetition must begin on start day (%s).");
 	const char *msg_enter = _("Press [Enter] to continue");
 	char *msg;
 
@@ -188,7 +188,9 @@ static void update_start_time(time_t *start, long *dur, struct rpt *rpt, int mov
 				newtime, *dur, rpt, NULL,
 				update_time_in_date(newtime, 0, 0),
 				NULL)) {
-			msg = (char *)msg_match;
+			msg = day_ins(&msg_match, newtime);
+			status_mesg(msg, msg_enter);
+			mem_free(msg);
 		} else {
 			if (move) {
 				*start = newtime;
@@ -200,9 +202,8 @@ static void update_start_time(time_t *start, long *dur, struct rpt *rpt, int mov
 					break;
 				}
 			}
-			msg = (char *)msg_wrong_time;
+			status_mesg(msg_wrong_time, msg_enter);
 		}
-		status_mesg(msg, msg_enter);
 		keys_wgetch(win[KEY].p);
 	}
 	return;
@@ -858,12 +859,14 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
 	 * RFC5545 and ensures that the recurrence set is non-empty (unless it
 	 * is an exception day).
 	 */
-	const char *msg_match =
-		_("Repetition must begin on start day; any change discarded.");
+	char *msg_match =
+		_("Repetition must begin on start day (%s); any change discarded.");
 	if (!recur_item_find_occurrence(start, dur, &nrpt, NULL,
 					update_time_in_date(start, 0, 0),
 					NULL)) {
-		status_mesg(msg_match, msg_cont);
+		mem_free(outstr);
+		outstr = day_ins(&msg_match, start);
+		status_mesg(outstr, msg_cont);
 		keys_wgetch(win[KEY].p);
 		goto cleanup;
 	}
diff --git a/src/utils.c b/src/utils.c
index 5322db1..8c539c3 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -2067,3 +2067,19 @@ int wday_per_month(int month, int year, int weekday)
 
 	return last_wday / 7 + (last_wday % 7 > 0);
 }
+
+/*
+ * Return allocated string with day of 't' inserted in 'template' in the user's
+ * preferred format; template must be a "printf" template with exactly one
+ * string conversion (%s).
+ */
+char *day_ins(char **template, time_t t)
+{
+	char *day, *msg;
+
+	day = date_sec2date_str(update_time_in_date(t, 0 , 0),
+				DATEFMT(conf.input_datefmt));
+	asprintf(&msg, *template, day);
+	mem_free(day);
+	return msg;
+}
-- 
cgit v1.2.3-70-g09d2