cdfinfo.c 5.08 KB
/**
*  @file cdfinfo.c
*  @version $Id: cdfinfo.c,v 1.1 2010/08/31 10:32:55 budnik Exp $
*  @brief  
*/


#include <stdio.h>
#include <stdlib.h>
#include <cdf.h>
#include <string.h>

#define MAX_FILE_NAME_LEN  120  

void cdf_status_handler (CDFstatus, char *); 
char * cdf_str_datatype (long);

typedef struct cdfvar {            /* CDF variable structure */
	char name[CDF_VAR_NAME_LEN+1];   
	long datatype;                   
	long numElements;                /* string length for CDF_CHAR, 1 otherwise */
	long dimensionality;             /* variable dimensionality                 */
	long dimSizes[CDF_MAX_DIMS];     /* variable dimension sizes                */
	long recVariance;                /* record variance                         */
	long numRecs;                    /* # of records this variable contains     */
} CDFvar;

int main(int argc, char *argv[])
{

	CDFvar var;
	CDFid    id;                     /* CDF file ID      */ 
	CDFstatus   status;              /* CDF status code */

	long nZvars, nAttrs, attrId, attrScope, varId; 
	char attrName[CDF_ATTR_NAME_LEN+1];
	char fileName[MAX_FILE_NAME_LEN];
	char msg[100];
	int dummy, i;
  
	if (argc <= 1) 
			exit(0);                               /* CDF input file name not specified */
	else
			strcpy(fileName, argv[argc-1]);       /* Get the input file name */
	
	
   status = CDFlib (OPEN_, CDF_, fileName, &id,  NULL_);   
 		     
	if (status != CDF_OK)  {
			strcpy(msg, "OPEN_, CDF_, ");       
			strcat(msg, fileName);
			cdf_status_handler (status, msg);
	}
 
 /*---------------------------------------------------------------------------
 *   This routine retrievs the following information:
 *
 *      nAttr - number of attributes (including global and variable)
 *      nZvars - number of zVariables
 *
 *   CDF file can have both rVariables (old style) and zVariables (new style)
 *   simultaneously.  zVariable is a superset of rVariable, and it is a lot
 *   more efficient and offers all the functionality a rVariable offers and 
 *   more.  Treat all CDF variables as zVariables.
 *--------------------------------------------------------------------------*/ 
 
	status = CDFlib (SELECT_, CDF_zMODE_, zMODEon2,
							GET_, CDF_NUMATTRS_,  &nAttrs, 
									CDF_NUMzVARS_,  &nZvars, 
							NULL_);
	if (status != CDF_OK) cdf_status_handler(status, "GET_, CDF_FILEINFO_");
  
	// printf(" nAttrs %d Zvars %d\n",nAttrs, nZvars); 
  
	//  printf ("Attributes:\n");
  
	for (attrId = 0; attrId < nAttrs; attrId++) {
			status = CDFlib (SELECT_, ATTR_, attrId,
									GET_, ATTR_NAME_, attrName,  ATTR_SCOPE_, &attrScope,
									NULL_);
	if (status != CDF_OK) cdf_status_handler (status, "SELECT_, ATTR_");           
//        printf("Attr %d  %s  %d\n", attrId, attrName, attrScope); 
	}
    
	//   printf ("Variables:\n"); 
	for (varId=0; varId < nZvars; varId++) {
		status = CDFlib (SELECT_,zVAR_, varId,
								GET_, zVAR_NAME_, var.name,
										zVAR_DATATYPE_, &var.datatype,
										zVAR_NUMELEMS_, &var.numElements,
										zVAR_NUMDIMS_, &var.dimensionality,
										zVAR_DIMSIZES_, var.dimSizes,
										zVAR_NUMRECS_, &var.numRecs,
										zVAR_RECVARY_, &var.recVariance,
								NULL_);   
		if (status != CDF_OK) cdf_status_handler (status, "GET_, zVARS_");
		//   printf("Varr %d  %s  %s %d\n", varId, var.name, cdf_str_datatype(var.datatype), var.numRecs); 
		if (var.recVariance != 0 && var.numRecs > 1 && var.datatype != CDF_EPOCH && var.datatype != CDF_EPOCH16 && var.datatype != CDF_TIME_TT2000) printf("%s \n", var.name);
	}
     
	/* Close the CDF file */
	status = CDFlib (CLOSE_, CDF_, NULL_);   
}

void cdf_status_handler (CDFstatus status, char *source)
{
	char  message[CDF_STATUSTEXT_LEN+1];

	CDFerror (status, message);              /* Get the appropriate message */

	if (status < CDF_WARN) {
			printf ("An error has occurred, halting...\n");
			printf ("%s\n", message);
			printf ("** Error source: %s\n", source);
			exit (status);
	}
	else if (status < CDF_OK) {
			printf ("Warning, function may not have compeleted as expected...\n");
			printf ("%s\n", message);
	}
	else if (status > CDF_OK) {
			printf ("Function compeleted successfully, but be advised that...\n");
			printf ("%s\n", message);
	}
}

/*--------------------------------------------------------------------------
 *  This routine returns the string representation of the given CDF 
 *  datatype.
 *--------------------------------------------------------------------------*/
char *  cdf_str_datatype (long type)
{
	switch (type) {
	case CDF_BYTE:
		return "CDF_BYTE";

	case CDF_INT1:
		return "CDF_INT1";

	case CDF_CHAR:
		return "CDF_CHAR";

	case CDF_INT2:
		return "CDF_INT2";

	case CDF_UCHAR:
		return "CDF_UCHAR";

	case CDF_UINT1:
		return "CDF_UINT1";

	case CDF_INT4:
		return "CDF_INT4";

	case CDF_UINT2:
		return "CDF_UINT2";

	case CDF_FLOAT:
		return "CDF_FLOAT";

	case CDF_REAL4:
		return "CDF_REAL4";

	case CDF_DOUBLE:
		return "CDF_DOUBLE";

	case CDF_REAL8:
		return "CDF_REAL8";

	case CDF_UINT4:
		return "CDF_UINT4";

	case CDF_EPOCH:
		return "CDF_EPOCH";

	case CDF_EPOCH16:
		return "CDF_EPOCH16";
		
	case	CDF_TIME_TT2000:
		return "CDF_TIME_TT2000";
	}
}