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