From 4ca581f1efc7b7a6c5427ce8678b592b2ffe00cb Mon Sep 17 00:00:00 2001
From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de>
Date: Thu, 16 Jan 2025 14:52:04 +0100
Subject: [PATCH] Added test implementation for pstreamInqField() and
 pvlistInqFlag()

---
 src/cdi.h           |  6 ++++++
 src/stream_record.c | 46 +++++++++++++++++++++++++++------------------
 src/vlist.c         | 13 +++++++++++++
 src/vlist_var.c     | 20 ++++++++++++++++----
 4 files changed, 63 insertions(+), 22 deletions(-)

diff --git a/src/cdi.h b/src/cdi.h
index 624905c5d..3b9777d12 100644
--- a/src/cdi.h
+++ b/src/cdi.h
@@ -457,6 +457,10 @@ void    streamReadField(int streamID, double data[], SizeType *numMissVals);
 void    streamReadFieldF(int streamID, float data[], SizeType *numMissVals);
 void    streamCopyField(int streamIDdest, int streamIDsrc);
 
+void *  stream_get_pointer(int streamID);
+void *  stream_get_vlist_pointer(int streamID);
+void    pstreamInqField(void *streamPtr, int *varID, int *levelID);
+
 void    streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum);
 
 
@@ -695,6 +699,8 @@ int     vlistFindLevel(int vlistID, int fvarID, int flevelID);
 int     vlistMergedVar(int vlistID, int varID);
 int     vlistMergedLevel(int vlistID, int varID, int levelID);
 
+int     pvlistInqFlag(void *vlistPtr, int varID, int levelID);
+
 //      cdiClearAdditionalKeys: Clear the list of additional GRIB keys
 void    cdiClearAdditionalKeys(void);
 //      cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened
diff --git a/src/stream_record.c b/src/stream_record.c
index 4fadd14cb..f135f0d50 100644
--- a/src/stream_record.c
+++ b/src/stream_record.c
@@ -111,38 +111,48 @@ cdiInitRecord(stream_t *streamptr)
 }
 
 void
-streamInqField(int streamID, int *varID, int *levelID)
+stream_inq_field(stream_t *streamPtr, int *varID, int *levelID)
 {
   check_parg(varID);
   check_parg(levelID);
 
-  stream_t *streamptr = stream_to_pointer(streamID);
+  stream_def_accesstype(streamPtr, TYPE_REC);
 
-  stream_def_accesstype(streamptr, TYPE_REC);
+  if (!streamPtr->record) cdiInitRecord(streamPtr);
 
-  if (!streamptr->record) cdiInitRecord(streamptr);
+  const int tsID = streamPtr->curTsID;
+  tsteps_t *tstep = &(streamPtr->tsteps[tsID]);
 
-  int tsID = streamptr->curTsID;
-  int rindex = streamptr->tsteps[tsID].curRecID + 1;
+  int rindex = tstep->curRecID + 1;
+  if (rindex >= tstep->nrecs) Error("record %d not available at timestep %d", rindex + 1, tsID + 1);
 
-  if (rindex >= streamptr->tsteps[tsID].nrecs) Error("record %d not available at timestep %d", rindex + 1, tsID + 1);
+  int recID = tstep->recIDs[rindex];
+  if (recID == -1 || recID >= tstep->nallrecs) Error("Internal problem! tsID = %d recID = %d", tsID, recID);
 
-  int recID = streamptr->tsteps[tsID].recIDs[rindex];
-
-  if (recID == -1 || recID >= streamptr->tsteps[tsID].nallrecs) Error("Internal problem! tsID = %d recID = %d", tsID, recID);
-
-  *varID = streamptr->tsteps[tsID].recinfo[recID].varID;
+  *varID = tstep->recinfo[recID].varID;
   if (*varID == -1) Error("Internal problem! varID = %d recID = %d", *varID, recID);
 
-  int lindex = streamptr->tsteps[tsID].recinfo[recID].levelID;
+  int lindex = tstep->recinfo[recID].levelID;
+  int isub = subtypeInqActiveIndex(streamPtr->vars[*varID].subtypeID);
+  *levelID = streamPtr->vars[*varID].recordTable[isub].lindex[lindex];
+
+  if (CDI_Debug)
+    Message("streamID = %d tsID = %d, recID = %d, varID = %d, levelID = %d", streamPtr->self, tsID, recID, *varID, *levelID);
 
-  int isub = subtypeInqActiveIndex(streamptr->vars[*varID].subtypeID);
-  *levelID = streamptr->vars[*varID].recordTable[isub].lindex[lindex];
+  streamPtr->curTsID = tsID;
+  tstep->curRecID = rindex;
+}
 
-  if (CDI_Debug) Message("streamID = %d tsID = %d, recID = %d, varID = %d, levelID = %d", streamID, tsID, recID, *varID, *levelID);
+void
+pstreamInqField(void *streamPtr, int *varID, int *levelID)
+{
+  stream_inq_field((stream_t *) streamPtr, varID, levelID);
+}
 
-  streamptr->curTsID = tsID;
-  streamptr->tsteps[tsID].curRecID = rindex;
+void
+streamInqField(int streamID, int *varID, int *levelID)
+{
+  stream_inq_field(stream_to_pointer(streamID), varID, levelID);
 }
 
 /*
diff --git a/src/vlist.c b/src/vlist.c
index be9964585..7d1ade96a 100644
--- a/src/vlist.c
+++ b/src/vlist.c
@@ -44,6 +44,19 @@ static bool vlistIsInitialized = false;
   if (!vlistIsInitialized) vlist_initialize()
 #endif
 
+void *
+stream_get_pointer(int streamID)
+{
+  return stream_to_pointer(streamID);
+}
+
+void *
+stream_get_vlist_pointer(int streamID)
+{
+  stream_t *streamPtr = stream_to_pointer(streamID);
+  return vlist_to_pointer(streamPtr->vlistID);
+}
+
 static int
 vlist_compare(vlist_t *a, vlist_t *b)
 {
diff --git a/src/vlist_var.c b/src/vlist_var.c
index 9965f49e8..4174a111f 100644
--- a/src/vlist_var.c
+++ b/src/vlist_var.c
@@ -1077,16 +1077,28 @@ vlistDefFlag(int vlistID, int varID, int levID, int flag)
 }
 
 int
-vlistInqFlag(int vlistID, int varID, int levID)
+vlist_inq_flag(vlist_t *vlistPtr, int varID, int levelID)
 {
-  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  var_t *varPtr = vlistptr_get_varptr(__func__, vlistPtr, varID);
 
-  if (varptr->levinfo) return varptr->levinfo[levID].flag;
+  if (varPtr->levinfo) return varPtr->levinfo[levelID].flag;
 
-  levinfo_t li = DEFAULT_LEVINFO(levID);
+  levinfo_t li = DEFAULT_LEVINFO(levelID);
   return li.flag;
 }
 
+int
+pvlistInqFlag(void *vlistPtr, int varID, int levelID)
+{
+  return vlist_inq_flag((vlist_t *) vlistPtr, varID, levelID);
+}
+
+int
+vlistInqFlag(int vlistID, int varID, int levelID)
+{
+  return vlist_inq_flag(vlist_to_pointer(vlistID), varID, levelID);
+}
+
 int
 vlistFindVar(int vlistID, int fvarID)
 {
-- 
GitLab