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

Fix timeradd

wow i am stupid for writing this code
jD91mZM2 6 роки тому
батько
коміт
b517629371
2 змінених файлів з 21 додано та 11 видалено
  1. 1 1
      include/bits/sys/time.h
  2. 20 10
      tests/time/macros.c

+ 1 - 1
include/bits/sys/time.h

@@ -2,7 +2,7 @@
 #define _BITS_SYS_TIME
 
 #define timeradd(x,y,res) (void) (\
-        (res)->tv_sec = (x)->tv_sec + (y)->tv_sec + ((x)->tv_usec + (y)->tv_usec / 1000000), \
+        (res)->tv_sec = (x)->tv_sec + (y)->tv_sec + (((x)->tv_usec + (y)->tv_usec) / 1000000), \
         (res)->tv_usec = ((x)->tv_usec + (y)->tv_usec) % 1000000 \
     )
 #define timersub(x,y,res) (void) ( \

+ 20 - 10
tests/time/macros.c

@@ -2,10 +2,12 @@
 #include <sys/time.h>
 
 int main() {
-    struct timeval x = { .tv_sec = 0, .tv_usec = 15 };
-    struct timeval y = { .tv_sec = 0, .tv_usec = 0 };
-    struct timeval one = { .tv_sec = 0, .tv_usec = 1 };
-    struct timeval max_usec = { .tv_sec = 0, .tv_usec = 999999 };
+    struct timeval x = { .tv_usec = 15 };
+    struct timeval y = { 0 };
+    struct timeval z = { 0 };
+    struct timeval one_usec = { .tv_usec = 1 };
+    struct timeval max_usec = { .tv_usec = 999999 };
+    struct timeval one_sec = { .tv_sec = 1 };
 
     assert(!timerisset(&y));
     assert(timerisset(&x));
@@ -13,14 +15,22 @@ int main() {
     assert(!timerisset(&x));
 
     assert(timercmp(&x, &y, ==));
-    timeradd(&y, &one, &y);
-    assert(!timercmp(&x, &y, ==));
-    assert(timercmp(&x, &y, <));
+    timeradd(&y, &one_usec, &z);
+    assert(!timercmp(&x, &z, ==));
+    assert(timercmp(&x, &z, <));
 
-    timeradd(&y, &max_usec, &y);
+    timeradd(&z, &max_usec, &y);
     assert(y.tv_sec == 1);
     assert(y.tv_usec == 0);
-    timersub(&y, &one, &y);
-    assert(y.tv_sec == 0);
+    timersub(&y, &one_usec, &z);
+    assert(z.tv_sec == 0);
+    assert(z.tv_usec == 999999);
+    timeradd(&z, &one_sec, &y);
+    assert(y.tv_sec == 1);
+    assert(y.tv_usec == 999999);
+    for (int i = 0; i < 3; i += 1) {
+        timersub(&y, &one_sec, &y);
+    }
+    assert(y.tv_sec == -2);
     assert(y.tv_usec == 999999);
 }