summaryrefslogtreecommitdiff
path: root/src/utils.c
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@calcurse.org>2016-10-09 18:11:33 +0200
committerLukas Fleischer <lfleischer@calcurse.org>2016-10-09 18:12:45 +0200
commit343d68596d0bf16d6e041d3a7871ceacbf54300b (patch)
tree425a3c6a56a56407904a7871fa95841dafd41829 /src/utils.c
parent1f39b5c6681536ef833a2e2e1312f2747be728f3 (diff)
downloadcalcurse-343d68596d0bf16d6e041d3a7871ceacbf54300b.zip
Factor out parse_datetime()
Create a new function that takes a time stamp and updates the date or time components of that time stamp according to a given date/time string. Use that function for updating the start time of an item. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c
index 14683fc..335f325 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1103,6 +1103,45 @@ int parse_duration(const char *string, unsigned *duration)
return 1;
}
+/*
+ * Converts a string containing a date or a time into a time stamp.
+ *
+ * Takes a date/time string and a time stamp. If the string only contains a
+ * date, the date of the time stamp is updated while the time remains
+ * untouched. If the string only contains a time, the time of the time stamp is
+ * updated and the date remains the same. If the string contains both a date
+ * and a time, the time stamp is updated to match the given string.
+ *
+ * Returns 1 on success and 0 on failure.
+ */
+int parse_datetime(const char *string, long *ts)
+{
+ char *t = mem_strdup(string);
+ char *p = strtok(t, " ");
+
+ unsigned int hour, minute;
+ int year, month, day;
+ struct date new_date;
+
+ while (p) {
+ if (parse_date(p, conf.input_datefmt, &year, &month, &day,
+ ui_calendar_get_slctd_day())) {
+ new_date.dd = day;
+ new_date.mm = month;
+ new_date.yyyy = year;
+ *ts = date2sec(new_date, 0, 0) + get_item_time(*ts);
+ } else if (parse_time(p, &hour, &minute) == 1) {
+ *ts = update_time_in_date(*ts, hour, minute);
+ } else {
+ return 0;
+ }
+ p = strtok(NULL, " ");
+ }
+
+ mem_free(t);
+ return 1;
+}
+
void file_close(FILE * f, const char *pos)
{
EXIT_IF((fclose(f)) != 0, _("Error when closing file at %s"), pos);