diff options
author | Lukas Fleischer <lfleischer@calcurse.org> | 2016-10-09 18:11:33 +0200 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2016-10-09 18:12:45 +0200 |
commit | 343d68596d0bf16d6e041d3a7871ceacbf54300b (patch) | |
tree | 425a3c6a56a56407904a7871fa95841dafd41829 | |
parent | 1f39b5c6681536ef833a2e2e1312f2747be728f3 (diff) | |
download | calcurse-343d68596d0bf16d6e041d3a7871ceacbf54300b.tar.gz calcurse-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>
-rw-r--r-- | src/calcurse.h | 1 | ||||
-rw-r--r-- | src/ui-day.c | 30 | ||||
-rw-r--r-- | src/utils.c | 39 |
3 files changed, 45 insertions, 25 deletions
diff --git a/src/calcurse.h b/src/calcurse.h index c8f7bb9..3810db2 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -1136,6 +1136,7 @@ int check_time(unsigned, unsigned); int parse_time(const char *, unsigned *, unsigned *); int parse_duration(const char *, unsigned *); int parse_date_duration(const char *, unsigned *); +int parse_datetime(const char *, long *); void file_close(FILE *, const char *); void psleep(unsigned); int fork_exec(int *, int *, const char *, const char *const *); diff --git a/src/ui-day.c b/src/ui-day.c index b651ca5..0c31b3c 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -67,36 +67,16 @@ static int day_edit_time(int time) const char *enter_str = _("Press [Enter] to continue"); const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - unsigned int hour, minute; - int year, month, day; - struct date new_date; + long ts = time; for (;;) { status_mesg(msg_time, ""); if (updatestring(win[STA].p, &input, 0, 1) != GETSTRING_VALID) return 0; - char *inputcpy = mem_strdup(input); - char *p = strtok(inputcpy, " "); - 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; - time = date2sec(new_date, 0, 0) + - get_item_time(time); - } else if (parse_time(p, &hour, &minute) == 1) { - time = update_time_in_date(time, hour, minute); - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); - break; - } - p = strtok(NULL, " "); - } - mem_free(inputcpy); - if (!p) - return time; + if (parse_datetime(input, &ts)) + return ts; + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); } } 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); |