diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2011-10-05 09:06:18 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2011-10-06 12:37:06 +0200 |
commit | 0acbc06c4308576c50e7c4929f35fd09ff069ac7 (patch) | |
tree | afb7dd5fd516484e37b09b790030ba83fc75d1f8 /src/utils.c | |
parent | d874f7ff974934aa9e8265e0deb7c03a2dab235c (diff) | |
download | calcurse-0acbc06c4308576c50e7c4929f35fd09ff069ac7.zip |
src/utils.c: Introduce parse_{time,duration}()
These helpers can be used in a fashion similar to parse_date(). In
addition to check_time(), parse_time() and parse_duration() support
short forms such as "23:" (instead of "23:00") and ":45" (instead of
"00:45").
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src/utils.c')
-rw-r--r-- | src/utils.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c index 398233c..510f4dd 100644 --- a/src/utils.c +++ b/src/utils.c @@ -689,6 +689,91 @@ parse_date (const char *date_string, enum datefmt datefmt, int *year, return 1; } +/* + * Converts a time string into hours and minutes. Short forms like "23:" + * (23:00) or ":45" (0:45) are allowed. + * + * Returns 1 on success and 0 on failure. + */ +int +parse_time (const char *string, unsigned *hour, unsigned *minute) +{ + const char *p; + unsigned in[2] = {0, 0}, n = 0; + + if (!string) + return 0; + + /* parse string into in[], read up to two integers */ + for (p = string; *p; p++) + { + if (*p == ':') + { + if ((++n) > 1) + return 0; + } + else if ((*p >= '0') && (*p <= '9')) + in[n] = in[n] * 10 + (int)(*p - '0'); + else + return 0; + } + + if (n != 1 || in[0] >= DAYINHOURS || in[1] >= HOURINMIN) + return 0; + + *hour = in[0]; + *minute = in[1]; + return 1; +} + +/* + * Converts a duration string into minutes. Both "hh:mm" (e.g. "23:42") and + * "mmm" (e.g. "100") formats are accepted. Short forms like "23:" (23:00) or + * ":45" (0:45) are allowed as well. + * + * Returns 1 on success and 0 on failure. + */ +int +parse_duration (const char *string, unsigned *duration) +{ + const char *p; + unsigned in[2] = {0, 0}, n = 0; + + if (!string || *string == '\0') + return 0; + + /* parse string into in[], read up to two integers */ + for (p = string; *p; p++) + { + if (*p == ':') + { + if ((++n) > 1) + return 0; + } + else if ((*p >= '0') && (*p <= '9')) + in[n] = in[n] * 10 + (int)(*p - '0'); + else + return 0; + } + + if (n == 0) + { + if (in[0] > 999) + return 0; + *duration = in[0]; + } + else if (n == 1) + { + if (in[0] > DAYINHOURS || in[1] >= HOURINMIN) + return 0; + *duration = in[0] * HOURINMIN + in[1]; + } + else + return 0; + + return 1; +} + void str_toupper (char *s) { |