/* 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);
}
Exemple #2
0
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_;
}