Переглянути джерело

(#9) Reimplement parse_time with strtof

rexim 5 роки тому
батько
коміт
4d1ef5013f
1 змінених файлів з 22 додано та 21 видалено
  1. 22 21
      main.c

+ 22 - 21
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)