From b01d04539ca15337f29213fe0a31e103c2904c00 Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Tue, 15 Nov 2022 14:47:23 +0100
Subject: [PATCH] stream_gribapi.c: changed to CdiDateTime.

---
 src/stream_cgribex.c |  44 +++++++-------
 src/stream_gribapi.c | 139 ++++++++++++++++++++-----------------------
 2 files changed, 87 insertions(+), 96 deletions(-)

diff --git a/src/stream_cgribex.c b/src/stream_cgribex.c
index 9bed64b2d..e92f77d02 100644
--- a/src/stream_cgribex.c
+++ b/src/stream_cgribex.c
@@ -773,8 +773,8 @@ cgribexDateTimeX(int *isec1, CdiDateTime *sDateTime)
 int
 cgribexScanTimestep1(stream_t *streamptr)
 {
-  CdiDateTime datetime0;
-  cdiDateTime_init(&datetime0);
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   int lmv = 0, iret = 0;
   off_t recpos = 0;
   void *gribbuffer = NULL;
@@ -839,17 +839,17 @@ cgribexScanTimestep1(stream_t *streamptr)
       cgribexGetLevel(isec1, &leveltype, &level1, &level2);
 
       CdiDateTime sDateTime;
-      const CdiDateTime datetime = cgribexDateTimeX(isec1, &sDateTime);
+      const CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
 
       if (nrecs == 0)
         {
-          datetime0 = datetime;
+          vDateTime0 = vDateTime;
           fcast = cgribexTimeIsFC(isec1);
           taxis->unit = cgribexGetTimeUnit(isec1);
           taxis->rdatetime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1));
           taxis->sdate = cdiDate_get(sDateTime.date);
           taxis->stime = cdiTime_get(sDateTime.time);
-          taxis->vdatetime = datetime;
+          taxis->vdatetime = vDateTime;
         }
       else
         {
@@ -870,7 +870,7 @@ cgribexScanTimestep1(stream_t *streamptr)
             {
               if (recID < nrecs) break;
               if (warn_time)
-                if (cdiDateTime_isNE(datetime, datetime0))
+                if (cdiDateTime_isNE(vDateTime, vDateTime0))
                   {
                     gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, paramstr, level1, level2);
                     warn_time = false;
@@ -878,7 +878,7 @@ cgribexScanTimestep1(stream_t *streamptr)
             }
           else
             {
-              if (cdiDateTime_isNE(datetime, datetime0)) break;
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
 
               if (recID < nrecs)
                 {
@@ -904,7 +904,7 @@ cgribexScanTimestep1(stream_t *streamptr)
       nrecs++;
 
       if (CDI_Debug)
-        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(datetime));
+        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime));
 
       cgribexAddRecord(streamptr, cgribexp, param, recsize, recpos, comptype, lmv, iret);
     }
@@ -935,8 +935,8 @@ cgribexScanTimestep1(stream_t *streamptr)
 int
 cgribexScanTimestep2(stream_t *streamptr)
 {
-  CdiDateTime datetime0;
-  cdiDateTime_init(&datetime0);
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   int lmv = 0, iret = 0;
   off_t recpos = 0;
   int leveltype = 0, level1 = 0, level2 = 0;
@@ -998,11 +998,11 @@ cgribexScanTimestep2(stream_t *streamptr)
       cgribexGetLevel(isec1, &leveltype, &level1, &level2);
 
       CdiDateTime sDateTime;
-      const CdiDateTime datetime = cgribexDateTimeX(isec1, &sDateTime);
+      const CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
 
       if (rindex == 0)
         {
-          datetime0 = datetime;
+          vDateTime0 = vDateTime;
           const int taxisID = vlistInqTaxis(vlistID);
           if (taxisInqType(taxisID) == TAXIS_RELATIVE)
             {
@@ -1014,7 +1014,7 @@ cgribexScanTimestep2(stream_t *streamptr)
               taxis->type = TAXIS_ABSOLUTE;
             }
           taxis->unit = cgribexGetTimeUnit(isec1);
-          taxis->vdatetime = datetime;
+          taxis->vdatetime = vDateTime;
           taxis->sdate = cdiDate_get(sDateTime.date);
           taxis->stime = cdiTime_get(sDateTime.time);
         }
@@ -1066,7 +1066,7 @@ cgribexScanTimestep2(stream_t *streamptr)
         {
           if (records[recID].used)
             {
-              if (cdiDateTime_isNE(datetime, datetime0)) break;
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
 
               gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2);
               continue;
@@ -1079,7 +1079,7 @@ cgribexScanTimestep2(stream_t *streamptr)
         }
 
       if (CDI_Debug)
-        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(datetime));
+        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime));
 
       if (cgribexVarCompare(compVar, streamptr->tsteps[tsID].records[recID], 0) != 0)
         {
@@ -1129,8 +1129,8 @@ cgribexScanTimestep2(stream_t *streamptr)
 int
 cgribexScanTimestep(stream_t *streamptr)
 {
-  CdiDateTime datetime0;
-  cdiDateTime_init(&datetime0);
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   int lmv = 0, iret = 0;
   off_t recpos = 0;
   int leveltype = 0, level1 = 0, level2 = 0;
@@ -1193,13 +1193,13 @@ cgribexScanTimestep(stream_t *streamptr)
           cgribexGetLevel(isec1, &leveltype, &level1, &level2);
 
           CdiDateTime sDateTime;
-          const CdiDateTime datetime = cgribexDateTimeX(isec1, &sDateTime);
+          const CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
 
           if (rindex == nrecs) break;
 
           if (rindex == 0)
             {
-              datetime0 = datetime;
+              vDateTime0 = vDateTime;
               const int vlistID = streamptr->vlistID;
               const int taxisID = vlistInqTaxis(vlistID);
               if (taxisInqType(taxisID) == TAXIS_RELATIVE)
@@ -1212,7 +1212,7 @@ cgribexScanTimestep(stream_t *streamptr)
                   taxis->type = TAXIS_ABSOLUTE;
                 }
               taxis->unit = cgribexGetTimeUnit(isec1);
-              taxis->vdatetime = datetime;
+              taxis->vdatetime = vDateTime;
               taxis->sdate = cdiDate_get(sDateTime.date);
               taxis->stime = cdiTime_get(sDateTime.time);
             }
@@ -1263,7 +1263,7 @@ cgribexScanTimestep(stream_t *streamptr)
                   char paramstr_[32];
                   cdiParamToString(param, paramstr_, sizeof(paramstr_));
 
-                  if (cdiDateTime_isNE(datetime, datetime0)) break;
+                  if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
 
                   if (CDI_Debug)
                     gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr_, level1, level2);
@@ -1278,7 +1278,7 @@ cgribexScanTimestep(stream_t *streamptr)
             }
 
           if (CDI_Debug)
-            Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(datetime));
+            Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime));
 
           if (cgribexVarCompare(compVar, records[recID], 0) != 0)
             {
diff --git a/src/stream_gribapi.c b/src/stream_gribapi.c
index d5ccc881f..dd5e49b28 100644
--- a/src/stream_gribapi.c
+++ b/src/stream_gribapi.c
@@ -13,7 +13,6 @@
 #include "stream_grb.h"
 #include "stream_gribapi.h"
 #include "varscan.h"
-#include "cmp_datetime.h"
 #include "vlist.h"
 #include "subtype.h"
 
@@ -173,10 +172,11 @@ gribapiGetTimeUnitFactor(const int timeUnits)
   return 0;
 }
 
-static CmpDateTime
-gribapiGetValidityDateTime(grib_handle *gh, CmpDateTime *cmpDateTimeS)
+static CdiDateTime
+gribapiGetValidityDateTime(grib_handle *gh, CdiDateTime *sDateTime)
 {
-  int vdate = 0, sdate = 0, vtime = 0, stime = 0;
+  CdiDateTime vDateTime;
+  cdiDateTime_init(sDateTime);
 
   long sigofrtime = 3;
   if (gribEditionNumber(gh) > 1)
@@ -188,9 +188,7 @@ gribapiGetValidityDateTime(grib_handle *gh, CmpDateTime *cmpDateTimeS)
       == 3)  // XXX: This looks like a bug to me, because timeRangeIndicator == 3 does not seem to have the same meaning as
              // significanceOfReferenceTime == 3. I would recommend replacing this condition with `if(!gribapiTimeIsFC())`.
     {
-      const CdiDateTime vDateTime = gribapiGetDataDateTime(gh);
-      vdate = (int) cdiDate_get(vDateTime.date);
-      vtime = cdiTime_get(vDateTime.time);
+      vDateTime = gribapiGetDataDateTime(gh);
     }
   else
     {
@@ -203,34 +201,23 @@ gribapiGetValidityDateTime(grib_handle *gh, CmpDateTime *cmpDateTimeS)
       if (rDateTime.date.day > 0)
         {
           extern int CGRIBEX_grib_calendar;
-          JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime);
+          const JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime);
 
           const int64_t timeUnitFactor = gribapiGetTimeUnitFactor(timeUnits);
 
           // if (startStep > 0)
           {
             const JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep);
-            CdiDateTime sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2);
-            sDateTime.time.second = 0;
-            sdate = (int) cdiDate_get(sDateTime.date);
-            stime = cdiTime_get(sDateTime.time);
+            *sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2);
           }
 
-          julianDate = julianDate_add_seconds(julianDate, timeUnitFactor * endStep);
-          rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate);
+          rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate_add_seconds(julianDate, timeUnitFactor * endStep));
         }
 
-      vdate = (int) cdiDate_get(rDateTime.date);
-      vtime = cdiTime_get(rDateTime.time);
+      vDateTime = rDateTime;
     }
 
-  cmpDateTimeS->date = sdate;
-  cmpDateTimeS->time = stime;
-
-  CmpDateTime cmpDateTimeV;
-  cmpDateTimeV.date = vdate;
-  cmpDateTimeV.time = vtime;
-  return cmpDateTimeV;
+  return vDateTime;
 }
 
 static void
@@ -960,7 +947,7 @@ typedef enum
 } checkTimeResult;
 
 static checkTimeResult
-checkTime(stream_t *streamptr, compvar2_t compVar, const CmpDateTime *verificationTime, const CmpDateTime *expectedVTime)
+checkTime(stream_t *streamptr, compvar2_t compVar, const CdiDateTime verificationTime, const CdiDateTime expectedVTime)
 {
   // First determine whether the current record exists already.
   int recID = 0;
@@ -971,7 +958,7 @@ checkTime(stream_t *streamptr, compvar2_t compVar, const CmpDateTime *verificati
   const bool recordExists = (recID < streamptr->nrecs);
 
   // Then we need to know whether the verification time is consistent.
-  const bool consistentTime = !memcmp(verificationTime, expectedVTime, sizeof(*verificationTime));
+  const bool consistentTime = cdiDateTime_isEQ(verificationTime, expectedVTime);
 
   // Finally, we make a decision.
   if (CDI_Inventory_Mode == 1)
@@ -1045,7 +1032,8 @@ fdbScanTimesteps(stream_t *streamptr)
   numTimesteps = remove_duplicate_timesteps(recordInfoList, numRecords, numTimesteps, timestepRecordOffset);
   if (CDI_Debug) Message("numRecords=%d  numTimesteps=%d", numRecords, numTimesteps);
 
-  CmpDateTime datetime0 = { .date = 10101, .time = 0 };
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   int fcast = 0;
 
   streamptr->curTsID = 0;
@@ -1074,30 +1062,30 @@ fdbScanTimesteps(stream_t *streamptr)
 
       const int param = gribapiGetParam(gh);
 
-      CmpDateTime cdtS;
-      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
+      CdiDateTime sDateTime;
+      const CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
 
       VarScanKeys scanKeys = gribapiGetScanKeys(gh);
 
       if (recID == 0)
         {
-          datetime0 = cdtV;
+          vDateTime0 = vDateTime;
           taxis->rdatetime = gribapiGetDataDateTime(gh);
           fcast = gribapiTimeIsFC(gh);
           if (fcast) taxis->unit = gribapiGetTimeUnits(gh);
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->sdate = cdtS.date;
-          taxis->stime = cdtS.time;
-          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
+          taxis->sdate = cdiDate_get(sDateTime.date);
+          taxis->stime = cdiTime_get(sDateTime.time);
+          taxis->vdatetime = vDateTime;
         }
 
       if (CDI_Debug)
         {
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
-          Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", recID + 1, varname, paramstr, leveltype1,
-                  level1, level2, cdtV.date, cdtV.time);
+          Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vdatetime=%s", recID + 1, varname, paramstr, leveltype1,
+                  level1, level2, CdiDateTime_string(vDateTime));
         }
 
       var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
@@ -1183,10 +1171,11 @@ fdbScanTimesteps(stream_t *streamptr)
 int
 gribapiScanTimestep1(stream_t *streamptr)
 {
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   off_t recpos = 0;
   void *gribbuffer = NULL;
   size_t buffersize = 0;
-  CmpDateTime datetime0 = { .date = 10101, .time = 0 };
   int nrecsScanned = 0;  // Only used for debug output.
   bool warn_time = true;
   int fcast = 0;
@@ -1238,36 +1227,36 @@ gribapiScanTimestep1(stream_t *streamptr)
 
       if (!varname[0]) param_to_name(param, varname);
 
-      CmpDateTime cdtS;
-      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
+      CdiDateTime sDateTime;
+      const CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
 
       VarScanKeys scanKeys = gribapiGetScanKeys(gh);
 
       if (nrecs == 0)
         {
-          datetime0 = cdtV;
+          vDateTime0 = vDateTime;
           taxis->rdatetime = gribapiGetDataDateTime(gh);
           fcast = gribapiTimeIsFC(gh);
           if (fcast) taxis->unit = gribapiGetTimeUnits(gh);
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->sdate = cdtS.date;
-          taxis->stime = cdtS.time;
-          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
+          taxis->sdate = cdiDate_get(sDateTime.date);
+          taxis->stime = cdiTime_get(sDateTime.time);
+          taxis->vdatetime = vDateTime;
         }
       else
         {
-          if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
+          if (cdiDateTime_isLT(sDateTime, cdiDateTime_set(taxis->sdate, taxis->stime)))
             {
-              taxis->sdate = cdtS.date;
-              taxis->stime = cdtS.time;
+              taxis->sdate = cdiDate_get(sDateTime.date);
+              taxis->stime = cdiTime_get(sDateTime.time);
             }
 
           const int tsteptype = gribapiGetTsteptype(gh);
           const size_t gridsize = gribapiGetGridsize(gh);
           checkTimeResult result = checkTime(
-              streamptr, gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles), &cdtV,
-              &datetime0);
+              streamptr, gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles), vDateTime,
+              vDateTime0);
           if (result == CHECKTIME_STOP)
             {
               nrecsScanned--;
@@ -1292,8 +1281,8 @@ gribapiScanTimestep1(stream_t *streamptr)
         {
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
-          Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", nrecs, (int) recpos, varname, paramstr,
-                  leveltype1, level1, level2, cdtV.date, cdtV.time);
+          Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdatetime=%s", nrecs, (int) recpos, varname, paramstr,
+                  leveltype1, level1, level2, CdiDateTime_string(vDateTime));
         }
 
       var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
@@ -1341,9 +1330,10 @@ gribapiScanTimestep1(stream_t *streamptr)
 int
 gribapiScanTimestep2(stream_t *streamptr)
 {
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
   int rstatus = 0;
   off_t recpos = 0;
-  CmpDateTime datetime0 = { INT_MIN, INT_MIN };
   // int gridID;
   int recID;
   grib_handle *gh = NULL;
@@ -1404,12 +1394,12 @@ gribapiScanTimestep2(stream_t *streamptr)
 
       if (!varname[0]) param_to_name(param, varname);
 
-      CmpDateTime cdtS;
-      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
+      CdiDateTime sDateTime;
+      const CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
 
       if (rindex == 0)
         {
-          datetime0 = cdtV;
+          vDateTime0 = vDateTime;
           const int taxisID = vlistInqTaxis(vlistID);
           if (taxisInqType(taxisID) == TAXIS_RELATIVE)
             {
@@ -1423,18 +1413,18 @@ gribapiScanTimestep2(stream_t *streamptr)
             }
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
-          taxis->sdate = cdtS.date;
-          taxis->stime = cdtS.time;
+          taxis->vdatetime = vDateTime;
+          taxis->sdate = cdiDate_get(sDateTime.date);
+          taxis->stime = cdiTime_get(sDateTime.time);
           // printf("2: %d %6d  %d %6d  %d %6d\n", taxis->rdate, taxis->rtime, taxis->sdate, taxis->stime, taxis->vdate,
           // taxis->vtime);
         }
       else
         {
-          if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
+          if (cdiDateTime_isLT(sDateTime, cdiDateTime_set(taxis->sdate, taxis->stime)))
             {
-              taxis->sdate = cdtS.date;
-              taxis->stime = cdtS.time;
+              taxis->sdate = cdiDate_get(sDateTime.date);
+              taxis->stime = cdiTime_get(sDateTime.time);
             }
         }
 
@@ -1467,7 +1457,7 @@ gribapiScanTimestep2(stream_t *streamptr)
             break;
           else
             {
-              if (datetime_differ(cdtV, datetime0)) break;
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
 
               gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
               continue;
@@ -1481,8 +1471,8 @@ gribapiScanTimestep2(stream_t *streamptr)
         {
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
-          Message("%4d %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", nrecsScanned, (int) recpos, varname,
-                  paramstr, leveltype1, level1, level2, cdtV.date, cdtV.time);
+          Message("%4d %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdatetime=%s", nrecsScanned, (int) recpos, varname,
+                  paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime));
         }
 
       if (gribapiVarCompare(compVar, records[recID], 0) != 0)
@@ -1553,7 +1543,8 @@ gribapiScanTimestep(stream_t *streamptr)
       int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1);  // Only used for debug output.
       int rindex = 0;
       off_t recpos = 0;
-      CmpDateTime datetime0 = { INT_MIN, INT_MIN };
+      CdiDateTime vDateTime0;
+      cdiDateTime_init(&vDateTime0);
       grib_handle *gh = NULL;
       char varname[256];
       while (true)
@@ -1588,8 +1579,8 @@ gribapiScanTimestep(stream_t *streamptr)
           var_tile_t tiles = dummy_tiles;
           gribGetLevel(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
 
-          CmpDateTime cdtS;
-          const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
+          CdiDateTime sDateTime;
+          const CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
 
           if (rindex == nrecs) break;
 
@@ -1601,7 +1592,7 @@ gribapiScanTimestep(stream_t *streamptr)
 
           if (rindex == 0)
             {
-              datetime0 = cdtV;
+              vDateTime0 = vDateTime;
               const int taxisID = vlistInqTaxis(vlistID);
               if (taxisInqType(taxisID) == TAXIS_RELATIVE)
                 {
@@ -1615,18 +1606,18 @@ gribapiScanTimestep(stream_t *streamptr)
                 }
               taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
               taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-              taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
-              taxis->sdate = cdtS.date;
-              taxis->stime = cdtS.time;
+              taxis->vdatetime = vDateTime;
+              taxis->sdate = cdiDate_get(sDateTime.date);
+              taxis->stime = cdiTime_get(sDateTime.time);
               // printf("n: %d %6d  %d %6d  %d %6d\n", taxis->rdate, taxis->rtime, taxis->sdate, taxis->stime, taxis->vdate,
               // taxis->vtime);
             }
           else
             {
-              if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
+              if (cdiDateTime_isLT(sDateTime, cdiDateTime_set(taxis->sdate, taxis->stime)))
                 {
-                  taxis->sdate = cdtS.date;
-                  taxis->stime = cdtS.time;
+                  taxis->sdate = cdiDate_get(sDateTime.date);
+                  taxis->stime = cdiTime_get(sDateTime.time);
                 }
             }
 
@@ -1661,7 +1652,7 @@ gribapiScanTimestep(stream_t *streamptr)
             {
               if (records[recID].used)
                 {
-                  if (datetime_differ(cdtV, datetime0)) break;
+                  if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
 
                   if (CDI_Debug)
                     gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
@@ -1673,7 +1664,7 @@ gribapiScanTimestep(stream_t *streamptr)
           records[recID].used = true;
           streamptr->tsteps[tsID].recIDs[rindex] = recID;
 
-          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex + 1, (int) recpos, param, level1, cdtV.date, cdtV.time);
+          if (CDI_Debug) Message("%4d %8d %4d %8d %8s", rindex + 1, (int) recpos, param, level1, CdiDateTime_string(vDateTime));
 
           if (gribapiVarCompare(compVar, records[recID], 0) != 0)
             {
@@ -1685,7 +1676,7 @@ gribapiScanTimestep(stream_t *streamptr)
           records[recID].position = recpos;
           records[recID].size = recsize;
 
-          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex, (int) recpos, param, level1, cdtV.date, cdtV.time);
+          if (CDI_Debug) Message("%4d %8d %4d %8d %s", rindex, (int) recpos, param, level1, CdiDateTime_string(vDateTime));
 
           grib_handle_delete(gh);
           gh = NULL;
-- 
GitLab