From 519107dc47a97cd6ae39eef7ba5fbceef59da3ed Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Sat, 9 Aug 2014 12:56:13 +0200
Subject: Extend date formats for filters

Allow for specifying both date and time in all dates and date ranges
used in filters.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/args.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 48 insertions(+), 14 deletions(-)

diff --git a/src/args.c b/src/args.c
index d0047ff..810f787 100644
--- a/src/args.c
+++ b/src/args.c
@@ -329,6 +329,40 @@ static int parse_datearg(const char *str)
 	return -1;
 }
 
+static int parse_datetimearg(const char *str)
+{
+	char *date = mem_strdup(str);
+	char *time;
+	unsigned hour, min;
+	long ret;
+
+	time = strchr(date, ' ');
+	if (time) {
+		/* Date and time. */
+		*time = '\0';
+		time++;
+
+		if (!parse_time(time, &hour, &min))
+			return -1;
+		ret = parse_datearg(date);
+		if (!ret)
+			return -1;
+		ret += hour * HOURINSEC + min * MININSEC;
+
+		return ret;
+	}
+
+	ret = parse_datearg(date);
+	if (!ret) {
+		/* No date specified, use time only. */
+		if (!parse_time(time, &hour, &min))
+			return -1;
+		return get_today() + hour * HOURINSEC + min * MININSEC;
+	}
+
+	return ret;
+}
+
 static int parse_daterange(const char *str, long *date_from, long *date_to)
 {
 	int ret = 0;
@@ -342,7 +376,7 @@ static int parse_daterange(const char *str, long *date_from, long *date_to)
 	p++;
 
 	if (*s != '\0') {
-		*date_from = parse_datearg(s);
+		*date_from = parse_datetimearg(s);
 		if (*date_from == -1)
 			goto cleanup;
 	} else {
@@ -350,7 +384,7 @@ static int parse_daterange(const char *str, long *date_from, long *date_to)
 	}
 
 	if (*p != '\0') {
-		*date_to = parse_datearg(p);
+		*date_to = parse_datetimearg(p);
 		if (*date_to == -1)
 			goto cleanup;
 	} else {
@@ -486,7 +520,7 @@ int parse_args(int argc, char **argv)
 			if (is_all_digit(optarg)) {
 				range = atoi(optarg);
 			} else {
-				from = parse_datearg(optarg);
+				from = parse_datetimearg(optarg);
 				EXIT_IF(from == -1, _("invalid date: %s"),
 					optarg);
 			}
@@ -526,7 +560,7 @@ int parse_args(int argc, char **argv)
 			query = 1;
 			break;
 		case 's':
-			from = parse_datearg(optarg);
+			from = parse_datetimearg(optarg);
 			EXIT_IF(from == -1, _("invalid date: %s"), optarg);
 			filter.type_mask |= TYPE_MASK_CAL;
 			query = 1;
@@ -578,22 +612,22 @@ int parse_args(int argc, char **argv)
 			filter.regex = &reg;
 			break;
 		case OPT_FILTER_START_FROM:
-			filter.start_from = parse_datearg(optarg);
+			filter.start_from = parse_datetimearg(optarg);
 			EXIT_IF(filter.start_from == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_START_TO:
-			filter.start_to = parse_datearg(optarg);
+			filter.start_to = parse_datetimearg(optarg);
 			EXIT_IF(filter.start_to == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_START_AFTER:
-			filter.start_from = parse_datearg(optarg) + 1;
+			filter.start_from = parse_datetimearg(optarg) + 1;
 			EXIT_IF(filter.start_from == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_START_BEFORE:
-			filter.start_to = parse_datearg(optarg) - 1;
+			filter.start_to = parse_datetimearg(optarg) - 1;
 			EXIT_IF(filter.start_to == -1,
 				_("invalid date: %s"), optarg);
 			break;
@@ -603,22 +637,22 @@ int parse_args(int argc, char **argv)
 				_("invalid date range: %s"), optarg);
 			break;
 		case OPT_FILTER_END_FROM:
-			filter.end_from = parse_datearg(optarg);
+			filter.end_from = parse_datetimearg(optarg);
 			EXIT_IF(filter.end_from == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_END_TO:
-			filter.end_to = parse_datearg(optarg);
+			filter.end_to = parse_datetimearg(optarg);
 			EXIT_IF(filter.end_to == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_END_AFTER:
-			filter.end_from = parse_datearg(optarg) + 1;
+			filter.end_from = parse_datetimearg(optarg) + 1;
 			EXIT_IF(filter.end_from == -1,
 				_("invalid date: %s"), optarg);
 			break;
 		case OPT_FILTER_END_BEFORE:
-			filter.end_to = parse_datearg(optarg) - 1;
+			filter.end_to = parse_datetimearg(optarg) - 1;
 			EXIT_IF(filter.end_to == -1,
 				_("invalid date: %s"), optarg);
 			break;
@@ -639,11 +673,11 @@ int parse_args(int argc, char **argv)
 			filter.uncompleted = 1;
 			break;
 		case OPT_FROM:
-			from = parse_datearg(optarg);
+			from = parse_datetimearg(optarg);
 			EXIT_IF(from == -1, _("invalid date: %s"), optarg);
 			break;
 		case OPT_TO:
-			to = parse_datearg(optarg);
+			to = parse_datetimearg(optarg);
 			EXIT_IF(to == -1, _("invalid date: %s"), optarg);
 			break;
 		case OPT_DAYS:
-- 
cgit v1.2.3-70-g09d2