CLI: time assignments for filter options
Explanation. There is an important difference between "to <date>" (e.g. to 15/11/2018) and "to <date time>" (e.g. to "15/11/2018 13:30"): <date> is a time span (of 24 hours), while <date time> is a point in time. "To <date>" really means "to the end of <date>", while "before <date>" means "before the beginning of <date>". There are 24 hours between the two, whereas there is only one second between "before <date time>" and "to <date time>". Similar for from/after. An earlier commit introduced parse_datearg() that only accepts a date without a time. Hence, a date should be treated as a time span from midnight to one second before next midnight. The commit also fixes an error detection bug (filter.start_from/to and filter.end_from/to were updated too early). Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
parent
42e296c840
commit
4ba2cc46d7
25
src/args.c
25
src/args.c
@ -315,6 +315,8 @@ static int parse_daterange(const char *str, time_t *date_from, time_t *date_to)
|
|||||||
*date_to = parse_datearg(p);
|
*date_to = parse_datearg(p);
|
||||||
if (*date_to == -1)
|
if (*date_to == -1)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
/* One second before next midnight. */
|
||||||
|
*date_to = date_sec_change(*date_to, 0, 1) - 1;
|
||||||
} else {
|
} else {
|
||||||
*date_to = -1;
|
*date_to = -1;
|
||||||
}
|
}
|
||||||
@ -604,7 +606,9 @@ int parse_args(int argc, char **argv)
|
|||||||
filter.regex = ®
|
filter.regex = ®
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
|
/* Assume that the date argument is midnight of the given day. */
|
||||||
case OPT_FILTER_START_FROM:
|
case OPT_FILTER_START_FROM:
|
||||||
|
/* Midnight. */
|
||||||
filter.start_from = parse_datearg(optarg);
|
filter.start_from = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.start_from == -1,
|
EXIT_IF(filter.start_from == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
@ -614,18 +618,24 @@ int parse_args(int argc, char **argv)
|
|||||||
filter.start_to = parse_datearg(optarg);
|
filter.start_to = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.start_to == -1,
|
EXIT_IF(filter.start_to == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* Next midnight less one second. */
|
||||||
|
filter.start_to = date_sec_change(filter.start_to, 0, 1) - 1;
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_START_AFTER:
|
case OPT_FILTER_START_AFTER:
|
||||||
filter.start_from = parse_datearg(optarg) + 1;
|
filter.start_from = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.start_from == -1,
|
EXIT_IF(filter.start_from == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* Next midnight (belongs to the next day). */
|
||||||
|
filter.start_from = date_sec_change(filter.start_from, 0, 1);
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_START_BEFORE:
|
case OPT_FILTER_START_BEFORE:
|
||||||
filter.start_to = parse_datearg(optarg) - 1;
|
filter.start_to = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.start_to == -1,
|
EXIT_IF(filter.start_to == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* One second before midnight. */
|
||||||
|
filter.start_to--;
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_START_RANGE:
|
case OPT_FILTER_START_RANGE:
|
||||||
@ -635,6 +645,7 @@ int parse_args(int argc, char **argv)
|
|||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_END_FROM:
|
case OPT_FILTER_END_FROM:
|
||||||
|
/* Midnight. */
|
||||||
filter.end_from = parse_datearg(optarg);
|
filter.end_from = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.end_from == -1,
|
EXIT_IF(filter.end_from == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
@ -644,18 +655,24 @@ int parse_args(int argc, char **argv)
|
|||||||
filter.end_to = parse_datearg(optarg);
|
filter.end_to = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.end_to == -1,
|
EXIT_IF(filter.end_to == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* Next midnight less one second. */
|
||||||
|
filter.end_to = date_sec_change(filter.end_to, 0, 1) - 1;
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_END_AFTER:
|
case OPT_FILTER_END_AFTER:
|
||||||
filter.end_from = parse_datearg(optarg) + 1;
|
filter.end_from = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.end_from == -1,
|
EXIT_IF(filter.end_from == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* Next midnight (belongs to the next day). */
|
||||||
|
filter.end_from = date_sec_change(filter.end_from, 0, 1);
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_END_BEFORE:
|
case OPT_FILTER_END_BEFORE:
|
||||||
filter.end_to = parse_datearg(optarg) - 1;
|
filter.end_to = parse_datearg(optarg);
|
||||||
EXIT_IF(filter.end_to == -1,
|
EXIT_IF(filter.end_to == -1,
|
||||||
_("invalid date: %s"), optarg);
|
_("invalid date: %s"), optarg);
|
||||||
|
/* One second before midnight. */
|
||||||
|
filter.end_to--;
|
||||||
filter_opt = 1;
|
filter_opt = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_FILTER_END_RANGE:
|
case OPT_FILTER_END_RANGE:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user