/* get the starttime, endtime, and number of records for the specified CDF file */ int get_start_and_end_times(char *filename, double *starttime, double *endtime, int *nrecords) { int i; CDFstatus cstatus; CDFid cid; long version; long release; char copyRight[CDF_COPYRIGHT_LEN+1]; long numDims; long dimSizes[CDF_MAX_DIMS]; long encoding; long majority; long maxRec; long numVars; long numAttrs; long varEpoch; static long indices[10] = {0,0,0,0,0,0,0,0,0,0}; CDFstatus rstat; char pathname[500]; char *cptr; int epoch_is_rvar = -1; char error_message[100]; /* Remove any trailing ".cdf", ".CDF", ".Cdf" extensions */ (void) strncpy(pathname, filename, 256); i = strlen(pathname); cptr = pathname + i - 4; if (!strcmp (cptr, ".cdf") || !strcmp (cptr, ".CDF") || !strcmp (cptr, ".Cdf")) { *cptr = '\0'; } /* Open the file as a CDF file */ cstatus = CDFopen (pathname, &cid); if (cstatus != CDF_OK) { if (cstatus < CDF_WARN) { fprintf(stderr, "Unable to open CDF file: %s (%s)\n", filename, pathname); fprintf(stderr, "status = %ld\n", cstatus); CDFerror(cstatus, error_message); fprintf(stderr,"%s\n", error_message); return(-1); } else { /* Let's ignore non-error warning messages here for now, at Davin's request. CDFerror(cstatus, error_message); fprintf(stderr, "%s ", error_message); fprintf(stderr, "This is a warning only, continuing...\n"); */ } } /* Get the version, etc */ cstatus = CDFdoc (cid, &version, &release, copyRight); if (cstatus != CDF_OK) { fprintf(stderr, "Error in CDFdoc: filename = %s, cstatus= %ld \n", filename, cstatus); cstatus = CDFclose(cid); return(-1); } /* test whether Epoch is an r variable or z variable */ cstatus = CDFlib(CONFIRM_, rVAR_EXISTENCE_, "Epoch", NULL_); if (cstatus >= CDF_WARN) { /* In this case, Epoch is an r variable */ epoch_is_rvar = 1; varEpoch = CDFvarNum(cid, "Epoch"); if (varEpoch < 0) { fprintf(stderr, "Error: filename = %s, could not get rvar number for 'Epoch'.\n", filename); cstatus = CDFclose(cid); return(-1); } cstatus = CDFinquire (cid, &numDims, dimSizes, &encoding, &majority, &maxRec, &numVars, &numAttrs); if (cstatus != CDF_OK) { fprintf(stderr, "Error in CDFinquire: filename = %s, cstatus= %ld \n", filename, cstatus); cstatus = CDFclose(cid); return(-1); } if (maxRec < 0) { fprintf(stderr, "Number records: %d is too small in file: %s\n", maxRec,filename); cstatus = CDFclose(cid); return(-1); } *nrecords = (int) (maxRec + 1); rstat = CDFvarGet (cid, varEpoch, (long) 0, indices, starttime); rstat = CDFvarGet (cid, varEpoch, (long) maxRec, indices, endtime); } else { /* In this case, Epoch is a z variable */ cstatus = CDFlib(CONFIRM_, zVAR_EXISTENCE_, "Epoch", NULL_); if (cstatus >= CDF_WARN) { epoch_is_rvar = 0; cstatus = CDFlib(SELECT_, zVAR_NAME_, "Epoch", NULL_); if (cstatus != CDF_OK) { fprintf(stderr,"Error: filename = %s, could not find zvar 'Epoch'.\n", filename); cstatus = CDFclose(cid); return(-1); } cstatus = CDFlib(SELECT_, zVAR_RECNUMBER_, 0, GET_, zVAR_DATA_, starttime, NULL_); if (cstatus != CDF_OK) { fprintf(stderr, "Error: filename = %s,", filename); fprintf(stderr, " could not get first time record of zvariable 'Epoch'.\n"); cstatus = CDFclose(cid); return(-1); } cstatus = CDFlib(GET_, zVAR_MAXREC_, &maxRec, NULL_); if (cstatus != CDF_OK) { fprintf(stderr, "Error: filename = %s,", filename); fprintf(stderr, " could not get number of records for zvar 'Epoch'.\n"); cstatus = CDFclose(cid); return(-1); } *nrecords = (int) (maxRec + 1); cstatus = CDFlib(SELECT_, zVAR_RECNUMBER_, maxRec, GET_, zVAR_DATA_, endtime, NULL_); if (cstatus != CDF_OK) { fprintf(stderr, "Error: filename = %s,", filename); fprintf(stderr, " could not get last time record of zvariable 'Epoch'.\n"); return(-1); } } } if (epoch_is_rvar == -1) { fprintf(stderr, "Error: filename = %s,", filename); fprintf(stderr, " could not find either rvar or zvar named 'Epoch'.\n"); return(-1); } cstatus = CDFclose(cid); return(1); }
int main () { CDFid id; CDFstatus status; long varnum; long variance = { VARY }; long dimSizes[1] = {0}, dimVary[1] = {VARY}; long indices[1] = {0}, counts[1]= {1}, intervals[1] = {1}; long long tt2000[8], mm[8]; double year1=2008, month1=12, day1=31, hour1=23, minute1=59, second1=57, msec1=100, usec1=200, nsec1=300; double year=2008, month=12, day=31, hour=23, minute=59, second=57, msec=100, usec=200, nsec=300; double yearOut, monthOut, dayOut, hourOut, minuteOut, secondOut, msecOut, usecOut, nsecOut; int ix; char string[TT2000_3_STRING_LEN+1]; long long int8[3][2], int8o[3][2], nn; /****************************************************************************** * Display title. ******************************************************************************/ printf ("Testing Internal/C interface for CDF_TIME_TT2000 ...\n"); tt2000[0] = computeTT2000 (2000., 1., 1., 12., 0., 0., TT2000END); breakdownTT2000 (tt2000[0], &yearOut, &monthOut, &dayOut, &hourOut, &minuteOut, &secondOut, &msecOut, &usecOut, &nsecOut); printf ("Base: 2000-01-01T12:00.00.000 => %lld nanoseconds\n", tt2000[0]); encodeTT2000 (tt2000[0], string, 3); printf (" %lld => %s\n", tt2000[0], string); /****************************************************************************** * Create CDF. ******************************************************************************/ status = CDFlib (CREATE_, CDF_, "TEST", 0, dimSizes, &id, NULL_); if (status < CDF_OK) { if (status == CDF_EXISTS) { status = CDFlib (OPEN_, CDF_, "TEST", &id, NULL_); if (status < CDF_OK) QuitCDF ("1.0", status); status = CDFlib (DELETE_, CDF_, NULL_); if (status < CDF_OK) QuitCDF ("1.1", status); status = CDFlib (CREATE_, CDF_, "TEST", 0L, dimSizes, &id, NULL_); if (status < CDF_OK) QuitCDF ("6.0", status); } } /****************************************************************************** * Create variables. ******************************************************************************/ status = CDFlib (CREATE_, zVAR_, "myTT2000", CDF_TIME_TT2000, 1L, 0L, dimSizes, variance, dimVary, &varnum, NULL_); if (status < CDF_OK) QuitCDF ("7.0", status); dimSizes[0] = 2; status = CDFlib (CREATE_, zVAR_, "myINT8", CDF_INT8, 1L, 1L, dimSizes, variance, dimVary, &varnum, NULL_); if (status < CDF_OK) QuitCDF ("7.1", status); /****************************************************************************** * PUT to variables. ******************************************************************************/ tt2000[0] = computeTT2000 (year, month, day, hour, minute, second, msec, usec, nsec); if (tt2000[0] == ILLEGAL_TT2000_VALUE) QuitCDF ("9.0", TT2000_TIME_ERROR); for (ix = 1; ix < 8; ++ix) tt2000[ix] = tt2000[0] + (long long) ix*1000000000; varnum = CDFgetVarNum (id, "myTT2000"); status = CDFlib (SELECT_, zVAR_, varnum, zVAR_RECNUMBER_, 0L, zVAR_RECCOUNT_, 8L, zVAR_RECINTERVAL_, 1L, zVAR_DIMINDICES_, indices, zVAR_DIMCOUNTS_, counts, zVAR_DIMINTERVALS_, intervals, PUT_, zVAR_HYPERDATA_, tt2000, NULL_); if (status < CDF_OK) QuitCDF ("10.0", status); /****************************************************************************** * HyperGET from variables. ******************************************************************************/ status = CDFlib (GET_, zVAR_HYPERDATA_, mm, NULL_); if (status < CDF_OK) QuitCDF ("11.0", status); for (ix= 0; ix < 8; ix++) { breakdownTT2000 (mm[ix], &yearOut, &monthOut, &dayOut, &hourOut, &minuteOut, &secondOut, &msecOut, &usecOut, &nsecOut); if (year != yearOut) QuitCDF("11.1", status); if (month != monthOut) QuitCDF("11.2", status); if (day != dayOut) QuitCDF("11.3", status); if (hour != hourOut) QuitCDF("11.4", status); if (minute != minuteOut) QuitCDF("11.5", status); if (second != secondOut) QuitCDF("11.6", status); if (msec != msecOut) QuitCDF("11.7", status); if (usec != usecOut) QuitCDF("11.8", status); if (nsec != nsecOut) QuitCDF("11.9", status); ++second; if (second > 60) { year = 2009; month = 1; day = 1; hour = 0; minute = 0; second = 0; } } varnum = CDFgetVarNum (id, "myINT8"); nn = 88888888888LL; for (ix = 0; ix < 3; ++ix) { int8[ix][0] = nn; int8[ix][1] = -nn; ++nn; } counts[0] = 2; status = CDFlib (SELECT_, zVAR_, varnum, zVAR_RECNUMBER_, 0L, zVAR_RECCOUNT_, 3L, zVAR_RECINTERVAL_, 1L, zVAR_DIMINDICES_, indices, zVAR_DIMCOUNTS_, counts, zVAR_DIMINTERVALS_, intervals, PUT_, zVAR_HYPERDATA_, int8, NULL_); if (status < CDF_OK) QuitCDF ("12.0", status); status = CDFlib (GET_, zVAR_HYPERDATA_, int8o, NULL_); if (status < CDF_OK) QuitCDF ("13.0", status); nn = 88888888888LL; for (ix = 0; ix < 3; ++ix) { if (int8o[ix][0] != nn) QuitCDF ("14.0", status);; if (int8o[ix][1] != -nn) QuitCDF ("14.1", status);; ++nn; } /****************************************************************************** * Close CDF. ******************************************************************************/ status = CDFlib (CLOSE_, CDF_, NULL_); if (status < CDF_OK) QuitCDF ("26.2", status); /****************************************************************************** * Re-open the CDF. ******************************************************************************/ status = CDFlib (OPEN_, CDF_, "TEST", &id, NULL_); if (status < CDF_OK) QuitCDF ("30.1", status); varnum = CDFvarNum (id, "myTT2000"); if (varnum < CDF_OK) QuitCDF ("31.1", status); /****************************************************************************** * HyperGET from variables. ******************************************************************************/ status = CDFlib (SELECT_, zVAR_, varnum, zVAR_RECNUMBER_, 0L, zVAR_RECCOUNT_, 8L, zVAR_RECINTERVAL_, 1L, zVAR_DIMINDICES_, indices, zVAR_DIMCOUNTS_, counts, zVAR_DIMINTERVALS_, intervals, GET_, zVAR_HYPERDATA_, mm, NULL_); if (status < CDF_OK) QuitCDF ("32.1", status); for (ix= 0; ix < 8; ix++) { breakdownTT2000 (mm[ix], &yearOut, &monthOut, &dayOut, &hourOut, &minuteOut, &secondOut, &msecOut, &usecOut, &nsecOut); encodeTT2000 (mm[ix], string, 3); printf ("%s\n",string); if (year1 != yearOut) QuitCDF("33.1", status); if (month1 != monthOut) QuitCDF("33.2", status); if (day1 != dayOut) QuitCDF("33.3", status); if (hour1 != hourOut) QuitCDF("33.4", status); if (minute1 != minuteOut) QuitCDF("33.5", status); if (second1 != secondOut) QuitCDF("33.6", status); if (msec1 != msecOut) QuitCDF("33.7", status); if (usec1 != usecOut) QuitCDF("33.8", status); if (nsec1 != nsecOut) QuitCDF("33.9", status); ++second1; if (second1 > 60) { year1 = 2009; month1 = 1; day1 = 1; hour1 = 0; minute1 = 0; second1 = 0; } } /****************************************************************************** * Close CDF. ******************************************************************************/ status = CDFlib (CLOSE_, CDF_, NULL_); if (status < CDF_OK) QuitCDF ("26.2", status); /****************************************************************************** * Successful completion. ******************************************************************************/ return EXIT_SUCCESS_; }