From b82a3b9276bd32c5a4f13fcf9661a7a65b3505aa Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <lfleischer@calcurse.org>
Date: Wed, 13 Dec 2017 09:06:32 +0100
Subject: Allow for passing negative arguments to -d

When specifying date ranges using -d, allow for passing negative values
to indicate that the date range should start a certain number of days
ago.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 src/args.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

(limited to 'src')

diff --git a/src/args.c b/src/args.c
index a860ed9..175c6b4 100644
--- a/src/args.c
+++ b/src/args.c
@@ -390,7 +390,7 @@ int parse_args(int argc, char **argv)
 	int status = 0, gc = 0, import = 0, export = 0, daemon = 0;
 	/* Query ranges */
 	time_t from = -1, to = -1;
-	int range = -1;
+	int range = 0;
 	int limit = INT_MAX;
 	/* Filters */
 	struct item_filter filter = { 0, NULL, NULL, -1, -1, -1, -1, 0, 0, 0 };
@@ -476,8 +476,11 @@ int parse_args(int argc, char **argv)
 			cfile = optarg;
 			break;
 		case 'd':
-			if (is_all_digit(optarg)) {
+			if (is_all_digit(optarg) ||
+			    (*optarg == '-' && is_all_digit(optarg + 1))) {
 				range = atoi(optarg);
+				EXIT_IF(range == 0, _("invalid range: %s"),
+					optarg);
 			} else {
 				from = parse_datetimearg(optarg);
 				EXIT_IF(from == -1, _("invalid date: %s"),
@@ -704,17 +707,18 @@ int parse_args(int argc, char **argv)
 		goto cleanup;
 	}
 
-	if (from == -1) {
-		struct date day = { 0, 0, 0 };
-		from = get_sec_date(day);
-	}
+	EXIT_IF(to >= 0 && range > 0, _("cannot specify a range and an end date"));
+	EXIT_IF(from >= 0 && range < 0, _("cannot specify a negative range and a start date"));
 
-	if (to == -1 && range == -1)
+	if (from == -1)
+		from = get_today();
+	if (to == -1)
 		to = date_sec_change(from, 0, 1);
-	else if (to == -1 && range >= 0)
+
+	if (range > 0)
 		to = date_sec_change(from, 0, range);
-	else if (to >= 0 && range >= 0)
-		EXIT_IF(to >= 0, _("cannot specify a range and an end date"));
+	else if (range < 0)
+		from = date_sec_change(to, 0, range);
 
 	io_init(cfile, datadir);
 	io_check_dir(path_dir);
-- 
cgit v1.2.3-70-g09d2