]> Cypherpunks repositories - keks.git/commitdiff
Revised and corrected work with TAI64
authorSergey Matveev <stargrave@stargrave.org>
Wed, 20 Nov 2024 14:02:25 +0000 (17:02 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 20 Nov 2024 14:02:25 +0000 (17:02 +0300)
cyac/lib/dectai.c
cyac/lib/enctai.c
cyac/lib/err.c
cyac/lib/err.h
cyac/lib/leapsecs.c
cyac/lib/leapsecs.h

index e0d0b9d4a16feef58a0b698afa015b1c4280dd5d881c29e215ab4e6dcd23b188..1768c95704a4c622d28fb8fd586a78376fdab8d72fbfaa0b12c83e899fed50b2 100644 (file)
@@ -48,11 +48,16 @@ enum YACErr
 YACTimespecToUTC(struct timespec *ts)
 {
     int64_t v = (int64_t)(ts->tv_sec);
+    enum YACErr err = YACErrNo;
     {
-        int64_t diff = 0;
+        int64_t diff = 10;
         for (int64_t i = 0; i < YACLeapsecsN; i++) {
-            if (v > (YACLeapsecs[i] + YACLeapsecsN - i)) {
-                diff = 10 + YACLeapsecsN - i;
+            if (v < YACLeapsecs[i]) {
+                break;
+            }
+            diff++;
+            if (v == YACLeapsecs[i]) {
+                err = YACErrTAI64IsLeap;
                 break;
             }
         }
@@ -62,5 +67,5 @@ YACTimespecToUTC(struct timespec *ts)
         return YACErrTAI64InPast;
     }
     ts->tv_sec = (time_t)v;
-    return YACErrNo;
+    return err;
 }
index f9956f8e2b75ac603a8cf0c89f2ea2cbb5cf2e419c89d303d6498228ba50e60f..e175e30e7e6b3c3f29a6af108f4fd5b9a709c3389bbfa377acad0cfe943895ba 100644 (file)
@@ -39,14 +39,16 @@ bool
 YACTimespecToTAI(struct timespec *ts)
 {
     int64_t v = (int64_t)(ts->tv_sec);
-    int64_t diff = 10;
-    for (int64_t i = 0; i < YACLeapsecsN; i++) {
-        if (v > YACLeapsecs[i]) {
-            diff += YACLeapsecsN - i;
+    int64_t i = 0;
+    for (; i < YACLeapsecsN; i++) {
+        if (v < YACLeapsecs[i]) {
             break;
         }
     }
-    v += diff;
+    v += (int64_t)10 + i;
+    if (v == YACLeapsecs[i]) {
+        v++;
+    }
     if (((uint64_t)1 << ((sizeof(time_t) * 8) - 1)) < (uint64_t)v) {
         return false;
     }
index 8e199c57d8ea16b6e47d1dccdfcf8b9c1209a65251cd505786cea9faf8248330..c95194286c967d17e0a0f03f849707daefd337fa2c5f7ad1755cc9a8637eb934 100644 (file)
@@ -32,6 +32,8 @@ YACErr2Str(const enum YACErr err)
         return "TAI64BadAsec";
     case YACErrTAI64InPast:
         return "TAI64InPast";
+    case YACErrTAI64IsLeap:
+        return "TAI64IsLeap";
     case YACErrMapBadKey:
         return "MapBadKey";
     case YACErrMapNoVal:
index f3b8c28bb644e2eafe776713f82272a28911a0aa357a95c7b6227f0b1941ea29..00726a68ee584efecb600c2202dc8531331999e014a7b11d52ed92240aa15dbc 100644 (file)
@@ -56,6 +56,7 @@ enum YACErr {
     YACErrTAI64BadNsec,
     YACErrTAI64BadAsec,
     YACErrTAI64InPast,
+    YACErrTAI64IsLeap,
     YACErrMapBadKey,
     YACErrMapNoVal,
     YACErrMapUnordered,
index 7f703d490fc98912208e9035873c3647d49d6eddc5913532edd2f6423c0852a0..ec7fef81012272274e9012d5880d7f38fd191558b2d038f8181213e017d5e548 100644 (file)
@@ -4,31 +4,31 @@
 
 const int64_t YACLeapsecsN = 27;
 const int64_t YACLeapsecs[] = {
-    1483228800, // 2017-01
-    1435708800, // 2015-07
-    1341100800, // 2012-07
-    1230768000, // 2009-01
-    1136073600, // 2006-01
-    915148800,  // 1999-01
-    867715200,  // 1997-07
-    820454400,  // 1996-01
-    773020800,  // 1994-07
-    741484800,  // 1993-07
-    709948800,  // 1992-07
-    662688000,  // 1991-01
-    631152000,  // 1990-01
-    567993600,  // 1988-01
-    489024000,  // 1985-07
-    425865600,  // 1983-07
-    394329600,  // 1982-07
-    362793600,  // 1981-07
-    315532800,  // 1980-01
-    283996800,  // 1979-01
-    252460800,  // 1978-01
-    220924800,  // 1977-01
-    189302400,  // 1976-01
-    157766400,  // 1975-01
-    126230400,  // 1974-01
-    94694400,   // 1973-01
-    78796800    // 1972-07
+    78796810,   // 1972-07
+    94694411,   // 1973-01
+    126230412,  // 1974-01
+    157766413,  // 1975-01
+    189302414,  // 1976-01
+    220924815,  // 1977-01
+    252460816,  // 1978-01
+    283996817,  // 1979-01
+    315532818,  // 1980-01
+    362793619,  // 1981-07
+    394329620,  // 1982-07
+    425865621,  // 1983-07
+    489024022,  // 1985-07
+    567993623,  // 1988-01
+    631152024,  // 1990-01
+    662688025,  // 1991-01
+    709948826,  // 1992-07
+    741484827,  // 1993-07
+    773020828,  // 1994-07
+    820454429,  // 1996-01
+    867715230,  // 1997-07
+    915148831,  // 1999-01
+    1136073632, // 2006-01
+    1230768033, // 2009-01
+    1341100834, // 2012-07
+    1435708835, // 2015-07
+    1483228836, // 2017-01
 };
index 71c0efeb869ebc813034473548fcf7c1890e7a5d2f453092e7575474f09e759d..726c797a79e306adc89db542610182ca435b992a5457bcdd2f498af1c2c84961 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef YAC_LEAPSECS_H
 #define YAC_LEAPSECS_H
 
-#include <stddef.h>
 #include <stdint.h>
 
 // TEXINFO: YACLeapsecs