cdfvarinfo.c 4.63 KB
/**
*  @file cdfvarinfo.c
*  @version $Id: cdfvarinfo.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, datatype, numElements; 
	char attrName[CDF_ATTR_NAME_LEN+1];
	char fileName[MAX_FILE_NAME_LEN], varName[CDF_VAR_NAME_LEN+1];
	char   msg[100];
	int dummy, i;
  
  
	if (argc <= 2) 
		exit(0);                   /* CDF input file name not specified */
	else {
		strcpy(fileName, argv[1]);       /* Get the input file name */
		strcpy(varName, argv[2]);   
	}
	
	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_");

	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_");
   
		if (strcmp(var.name, varName) == 0) 
		{  
			printf("%s %d %d ", cdf_str_datatype(var.datatype), var.dimensionality, var.numRecs);
			for (i = 0; i < var.dimensionality; i++) printf("%d ",var.dimSizes[i]);
			
			printf("\n");      
			break;  
		}
	}
	
	/* 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";
	}
}