From 0778cf934fd84218b433e0b0c7cf0929aeb864d7 Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Tue, 15 Nov 2022 13:16:46 +0100
Subject: [PATCH] stream_ieg.c: changed to CdiDateTime.

---
 src/cdi_datetime.c | 21 +++++++++++++++++++++
 src/cdi_datetime.h |  2 ++
 src/stream_ieg.c   | 42 ++++++++++++++++++++++--------------------
 3 files changed, 45 insertions(+), 20 deletions(-)

diff --git a/src/cdi_datetime.c b/src/cdi_datetime.c
index 187c1a95e..17935f126 100644
--- a/src/cdi_datetime.c
+++ b/src/cdi_datetime.c
@@ -1,4 +1,5 @@
 #include "cdi_datetime.h"
+#include <stdio.h>
 #include <stdlib.h>
 
 // ==================================================================
@@ -218,3 +219,23 @@ cdiDateTime_isNull(const CdiDateTime cdiDateTime)
       && cdiDateTime.time.ms == 0);
   // clang-format on
 }
+
+
+#define DATE_FORMAT "%5.4d-%2.2d-%2.2d"
+#define TIME_FORMAT "%2.2d:%2.2d:%2.2d"
+
+
+const char *
+CdiDateTime_string(CdiDateTime cdiDateTime)
+{
+  int year, month, day;
+  cdiDate_decode(cdiDateTime.date, &year, &month, &day);
+  int hour, minute, second, ms;
+  cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms);
+
+  static char datetimeString[64];
+  snprintf(datetimeString, sizeof(datetimeString), DATE_FORMAT "T" TIME_FORMAT,
+           year, month, day, hour, minute, second);
+
+  return datetimeString;
+}
diff --git a/src/cdi_datetime.h b/src/cdi_datetime.h
index 400edc69a..4f39edbc7 100644
--- a/src/cdi_datetime.h
+++ b/src/cdi_datetime.h
@@ -52,6 +52,8 @@ bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2);
 bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2);
 bool cdiDateTime_isNull(CdiDateTime cdiDateTime);
 
+const char *CdiDateTime_string(CdiDateTime cdiDateTime);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/stream_ieg.c b/src/stream_ieg.c
index b232cf203..fdc6eeb19 100644
--- a/src/stream_ieg.c
+++ b/src/stream_ieg.c
@@ -11,7 +11,6 @@
 #include "cdi.h"
 #include "cdi_int.h"
 #include "varscan.h"
-#include "cmp_datetime.h"
 #include "ieg.h"
 #include "stream_scan.h"
 #include "stream_ieg.h"
@@ -435,6 +434,7 @@ iegDefRecord(stream_t *streamptr)
   const int varID = record->varID;
   const int levelID = record->levelID;
   const int tsID = streamptr->curTsID;
+  const CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vdatetime;
 
   const int gridID = vlistInqVarGrid(vlistID, varID);
   const int zaxisID = vlistInqVarZaxis(vlistID, varID);
@@ -451,7 +451,7 @@ iegDefRecord(stream_t *streamptr)
   IEG_P_Parameter(iegp->ipdb) = pnum;
   if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat;
 
-  iegDefTime(iegp->ipdb, streamptr->tsteps[tsID].taxis.vdatetime, vlistInqTaxis(vlistID));
+  iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID));
   iegDefGrid(iegp->igdb, gridID);
   iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levelID);
 
@@ -675,7 +675,7 @@ void iegCmpRecord(stream_t *streamptr, int tsID, int recID, off_t position, int
 }
 #endif
 
-static CmpDateTime
+static CdiDateTime
 iegDateTime(const int *pdb)
 {
   const int ryear = IEG_P_Year(pdb);
@@ -687,16 +687,17 @@ iegDateTime(const int *pdb)
 
   if (rminute == -1) rminute = 0;
 
-  CmpDateTime cmpDateTime;
-  cmpDateTime.date = cdiEncodeDate(ryear, rmonth, rday);
-  cmpDateTime.time = cdiEncodeTime(rhour, rminute, 0);
-  return cmpDateTime;
+  CdiDateTime cdiDateTime;
+  cdiDateTime.date = cdiDate_encode(ryear, rmonth, rday);
+  cdiDateTime.time = cdiTime_encode(rhour, rminute, 0, 0);
+  return cdiDateTime;
 }
 
 static void
 iegScanTimestep1(stream_t *streamptr)
 {
-  CmpDateTime datetime0 = { INT_MIN, INT_MIN };
+  CdiDateTime datetime0;
+  cdiDateTime_init(&datetime0);
   off_t recpos;
   iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
 
@@ -728,12 +729,12 @@ iegScanTimestep1(stream_t *streamptr)
 
       if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
 
-      const CmpDateTime cdt = iegDateTime(iegp->ipdb);
+      const CdiDateTime datetime = iegDateTime(iegp->ipdb);
 
       if (nrecs == 0)
         {
-          datetime0 = cdt;
-          taxis->vdatetime = cdiDateTime_set(cdt.date, cdt.time);
+          datetime0 = datetime;
+          taxis->vdatetime = datetime;
         }
       else
         {
@@ -741,12 +742,12 @@ iegScanTimestep1(stream_t *streamptr)
           for (int recID = 0; recID < nrecs; recID++)
             if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished;
 
-          if (datetime_differ(cdt, datetime0)) Warning("Inconsistent verification time for param %d level %d", param, rlevel);
+          if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for param %d level %d", param, rlevel);
         }
 
       nrecs++;
 
-      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, param, rlevel, cdt.date, cdt.time);
+      if (CDI_Debug) Message("%4d%8d%4d%8d %s", nrecs, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
 
       iegAddRecord(streamptr, param, iegp->ipdb, iegp->igdb, iegp->vct, recsize, recpos, prec);
     }
@@ -812,12 +813,12 @@ iegScanTimestep2(stream_t *streamptr)
 
       if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
 
-      const CmpDateTime cdt = iegDateTime(iegp->ipdb);
+      const CdiDateTime datetime = iegDateTime(iegp->ipdb);
 
       if (rindex == 0)
         {
           taxis->type = TAXIS_ABSOLUTE;
-          taxis->vdatetime = cdiDateTime_set(cdt.date, cdt.time);
+          taxis->vdatetime = datetime;
         }
 
       bool nextstep = false;
@@ -848,7 +849,7 @@ iegScanTimestep2(stream_t *streamptr)
 
       if (nextstep) break;
 
-      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, param, rlevel, cdt.date, cdt.time);
+      if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex + 1, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
 
       if (param != records[recID].param || rlevel != records[recID].ilevel)
         {
@@ -934,7 +935,7 @@ iegScanTimestep(stream_t *streamptr)
 
           if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
 
-          const CmpDateTime cdt = iegDateTime(iegp->ipdb);
+          const CdiDateTime datetime = iegDateTime(iegp->ipdb);
 
           // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error
           if (rindex == nrecs) continue;
@@ -943,7 +944,7 @@ iegScanTimestep(stream_t *streamptr)
           if (rindex == 0)
             {
               taxis->type = TAXIS_ABSOLUTE;
-              taxis->vdatetime = cdiDateTime_set(cdt.date, cdt.time);
+              taxis->vdatetime = datetime;
             }
 
           if (param != records[recID].param || rlevel != records[recID].ilevel)
@@ -956,7 +957,7 @@ iegScanTimestep(stream_t *streamptr)
           records[recID].position = recpos;
           records[recID].size = recsize;
 
-          if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, param, rlevel, cdt.date, cdt.time);
+          if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
         }
 
       streamptr->rtsteps++;
@@ -1054,6 +1055,7 @@ iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
   const int vlistID = streamptr->vlistID;
   const int fileID = streamptr->fileID;
   const int tsID = streamptr->curTsID;
+  const CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vdatetime;
   const int gridID = vlistInqVarGrid(vlistID, varID);
   const int zaxisID = vlistInqVarZaxis(vlistID, varID);
 
@@ -1063,7 +1065,7 @@ iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
   IEG_P_Parameter(iegp->ipdb) = pnum;
   if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat;
 
-  iegDefTime(iegp->ipdb, streamptr->tsteps[tsID].taxis.vdatetime, vlistInqTaxis(vlistID));
+  iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID));
   iegDefGrid(iegp->igdb, gridID);
   iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levID);
 
-- 
GitLab