From 0ee7e02d9b96cb12a5efc40fb001ae493861db46 Mon Sep 17 00:00:00 2001 From: Danil Kolumbet Date: Sat, 17 Oct 2020 23:18:39 +0300 Subject: [PATCH 1/3] (tsoding#9) Add support for human readable time intervals --- main.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 0fada01..fb3090e 100644 --- a/main.c +++ b/main.c @@ -126,6 +126,35 @@ typedef enum { MODE_CLOCK, } Mode; +float parse_time(const char *time) +{ + float result = 0.0f; + size_t len = strlen(time); + for(size_t i = len - 1; i > 0; --i) { + float base; + switch (time[i]) { + case 's': base = 1.0f; break; + case 'm': base = 60.0f; break; + case 'h': base = 60.0f * 60.0f; break; + default: continue; + } + float exponent = 1.0f; + for (size_t j = 1; j <= i + 1; j++) { + if(isdigit(time[i - j])) { + result += (time[i - j] - '0') * base * exponent; + exponent *= 10.0f; + } else { + break; + } + } + } + if(result > 0.0f) { + return result; + } else { + return strtof(time, NULL); + } +} + int main(int argc, char **argv) { Mode mode = MODE_ASCENDING; @@ -139,7 +168,7 @@ int main(int argc, char **argv) mode = MODE_CLOCK; } else { mode = MODE_COUNTDOWN; - displayed_time = strtof(argv[i], NULL); + displayed_time = parse_time(argv[i]); } } From e62f31d02903e6ef88bd340e1b68d56900b6c948 Mon Sep 17 00:00:00 2001 From: Danil Kolumbet Date: Sat, 17 Oct 2020 23:26:29 +0300 Subject: [PATCH 2/3] (tsoding#9) Fix loop condition --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index fb3090e..b2370db 100644 --- a/main.c +++ b/main.c @@ -139,7 +139,7 @@ float parse_time(const char *time) default: continue; } float exponent = 1.0f; - for (size_t j = 1; j <= i + 1; j++) { + for (size_t j = 1; j <= i; j++) { if(isdigit(time[i - j])) { result += (time[i - j] - '0') * base * exponent; exponent *= 10.0f; From 4d1ef5013f629c88afcf81fb01b5d744e63a42b8 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 19 Oct 2020 19:03:26 +0700 Subject: [PATCH 3/3] (#9) Reimplement parse_time with strtof --- main.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/main.c b/main.c index b2370db..a1daf1d 100644 --- a/main.c +++ b/main.c @@ -129,30 +129,31 @@ typedef enum { float parse_time(const char *time) { float result = 0.0f; - size_t len = strlen(time); - for(size_t i = len - 1; i > 0; --i) { - float base; - switch (time[i]) { - case 's': base = 1.0f; break; - case 'm': base = 60.0f; break; - case 'h': base = 60.0f * 60.0f; break; - default: continue; + + while (*time) { + char *endptr = NULL; + float x = strtof(time, &endptr); + + if (time == endptr) { + fprintf(stderr, "`%s` is not a number\n", time); + exit(1); } - float exponent = 1.0f; - for (size_t j = 1; j <= i; j++) { - if(isdigit(time[i - j])) { - result += (time[i - j] - '0') * base * exponent; - exponent *= 10.0f; - } else { - break; - } + + switch (*endptr) { + case '\0': + case 's': result += x; break; + case 'm': result += x * 60.0f; break; + case 'h': result += x * 60.0f * 60.0f; break; + default: + fprintf(stderr, "`%c` is an unknown time unit\n", *endptr); + exit(1); } + + time = endptr; + if (*time) time += 1; } - if(result > 0.0f) { - return result; - } else { - return strtof(time, NULL); - } + + return result; } int main(int argc, char **argv)