diff --git a/php/src/Makefile b/php/src/Makefile index 9e83214..80a303e 100644 --- a/php/src/Makefile +++ b/php/src/Makefile @@ -5,7 +5,7 @@ CC = gcc EXE = nctimestring2double nctimeinfo getncvars ncvarinfo \ ncinfo_remote \ - cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata \ + cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata cdfvar_attr \ AddVI lib: ${EXE} @@ -48,7 +48,10 @@ cdfinfo: cdfinfo.c cdfvarinfo: cdfvarinfo.c ${CC} ${CFLAGS} -o cdfvarinfo cdfvarinfo.c ${INC} ${LIB} -lcdf - + +cdfvar_attr: cdfvar_attr.c + ${CC} ${CFLAGS} -o cdfvar_attr cdfvar_attr.c ${INC} ${LIB} -lcdf + cdfstartstopfromdata: cdfstartstopfromdata.c ${CC} ${CFLAGS} -o cdfstartstopfromdata cdfstartstopfromdata.c ${INC} ${LIB} -lcdf diff --git a/php/src/cdfvar_attr.c b/php/src/cdfvar_attr.c new file mode 100644 index 0000000..36ecbf2 --- /dev/null +++ b/php/src/cdfvar_attr.c @@ -0,0 +1,292 @@ +/** +* @file cdfvarinfo.c +* @version $Id: cdfvarinfo.c,v 1.1 2010/08/31 10:32:55 budnik Exp $ +* @brief +*/ + + +#include +#include +#include +#include + +#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], attName[CDF_ATTR_NAME_LEN+1]; + char msg[100]; + int dummy, i; + char *cPtr; + signed char *scPtr; + short *sPtr; + int *iPtr; + float *fPtr; + double *dPtr; + + + if (argc <= 3) + exit(0); /* CDF input file name not specified */ + else { + strcpy(fileName, argv[1]); /* Get the input file name */ + strcpy(varName, argv[2]); + strcpy(attName, argv[3]); + } + + 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_"); + + if (strcmp(var.name, varName) == 0) + { + 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_"); + if (attrScope == GLOBAL_SCOPE) continue; + if (strcasecmp(attrName, attName) != 0) continue; + + // printf("%d %s ", attrId, attrName); + + status = CDFlib (SELECT_, zENTRY_, varId, + GET_, zENTRY_DATATYPE_, &datatype, + zENTRY_NUMELEMS_, &numElements, + NULL_); + //printf("%d %s", numElements,cdf_str_datatype(datatype)); + if (status == NO_SUCH_ENTRY) continue; + + if (status != CDF_OK) cdf_status_handler (status,"GET_ATTR_INFO_"); + + switch (datatype) + { + case CDF_CHAR: + cPtr = (char *) malloc(numElements * sizeof(char) + 1); + + status = CDFlib (GET_, zENTRY_DATA_, cPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + strcpy(&cPtr[numElements],"\0"); + printf("%s\n", cPtr); + free(cPtr); + break; + + case CDF_BYTE: + case CDF_INT1: + scPtr = (signed char *) malloc (sizeof(signed char) * numElements); + status = CDFlib (GET_, zENTRY_DATA_, scPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + free (scPtr); + break; + + case CDF_INT2: + case CDF_UCHAR: + case CDF_UINT1: + sPtr = (short *) malloc (sizeof(short) * numElements); + status = CDFlib (GET_, zENTRY_DATA_, sPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + free (sPtr); + break; + + case CDF_INT4: + case CDF_UINT2: + iPtr = (int *) malloc (sizeof(int) * numElements); + status = CDFlib (GET_, zENTRY_DATA_, iPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + printf("%d\n", *iPtr); + free (iPtr); + break; + + case CDF_FLOAT: + case CDF_REAL4: + fPtr = (float *) malloc (sizeof(float) * numElements); + status = CDFlib (GET_, zENTRY_DATA_, fPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + printf("%8.1e\n", *fPtr); + free (fPtr); + break; + + case CDF_DOUBLE: + case CDF_REAL8: + case CDF_UINT4: + dPtr = (double *) malloc (sizeof(double) * numElements); + + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + printf("%8.1e\n", *dPtr); + free (dPtr); + break; + + case CDF_EPOCH: /* 8-byte real number */ + dPtr = (double *) malloc (sizeof(double) * numElements); + + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + + free (dPtr); + break; + + case CDF_EPOCH16: /* 16-byte real number */ + dPtr = (double *) malloc (sizeof(double) * numElements * 2); + status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); + if (status != CDF_OK) cdf_status_handler (status, msg); + free (dPtr); + break; + + default: + printf ("** Error in get_cdf_attribute: bad data type"); + } + } + 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"; + } +} diff --git a/php/src/cdfvarinfo.c b/php/src/cdfvarinfo.c index 0c1b0c6..7e49f52 100644 --- a/php/src/cdfvarinfo.c +++ b/php/src/cdfvarinfo.c @@ -16,49 +16,42 @@ 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 */ + 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; - char *cPtr; - signed char *scPtr; - short *sPtr; - int *iPtr; - float *fPtr; - double *dPtr; +{ + 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]); - } + 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_); + status = CDFlib (OPEN_, CDF_, fileName, &id, NULL_); - if (status != CDF_OK) { - strcpy(msg, "OPEN_, CDF_, "); - strcat(msg, fileName); - cdf_status_handler (status, msg); - } + if (status != CDF_OK) { + strcpy(msg, "OPEN_, CDF_, "); + strcat(msg, fileName); + cdf_status_handler (status, msg); + } /*--------------------------------------------------------------------------- * This routine retrievs the following information: @@ -72,225 +65,114 @@ int main(int argc, char *argv[]) * 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_"); + 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"); - - 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_"); - if (attrScope == GLOBAL_SCOPE) continue; -//printf("\n%d %s ", attrId, attrName); - status = CDFlib (SELECT_, zENTRY_, varId, - GET_, zENTRY_DATATYPE_, &datatype, - zENTRY_NUMELEMS_, &numElements, - NULL_); -//printf("%d %s", numElements,cdf_str_datatype(datatype)); - if (status == NO_SUCH_ENTRY) continue; - - if (status != CDF_OK) cdf_status_handler (status,"GET_ATTR_INFO_"); - - switch (datatype) { - case CDF_CHAR: - cPtr = (char *) malloc(numElements * sizeof(char) + 1); - status = CDFlib (GET_, zENTRY_DATA_, cPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); -// printf(" %s", cPtr); - free(cPtr); - break; - - case CDF_BYTE: - case CDF_INT1: - scPtr = (signed char *) malloc (sizeof(signed char) * numElements); - status = CDFlib (GET_, zENTRY_DATA_, scPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - free (scPtr); - break; - - case CDF_INT2: - case CDF_UCHAR: - case CDF_UINT1: - sPtr = (short *) malloc (sizeof(short) * numElements); - status = CDFlib (GET_, zENTRY_DATA_, sPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - free (sPtr); - break; - - case CDF_INT4: - case CDF_UINT2: - iPtr = (int *) malloc (sizeof(int) * numElements); - status = CDFlib (GET_, zENTRY_DATA_, iPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - free (iPtr); - break; - - case CDF_FLOAT: - case CDF_REAL4: - fPtr = (float *) malloc (sizeof(float) * numElements); - status = CDFlib (GET_, zENTRY_DATA_, fPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - free (fPtr); - break; - - case CDF_DOUBLE: - case CDF_REAL8: - case CDF_UINT4: - dPtr = (double *) malloc (sizeof(double) * numElements); - - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - - free (dPtr); - break; - - case CDF_EPOCH: /* 8-byte real number */ - dPtr = (double *) malloc (sizeof(double) * numElements); - - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - - free (dPtr); - break; - - case CDF_EPOCH16: /* 16-byte real number */ - dPtr = (double *) malloc (sizeof(double) * numElements * 2); - status = CDFlib (GET_, zENTRY_DATA_, dPtr, NULL_); - if (status != CDF_OK) cdf_status_handler (status, msg); - free (dPtr); - break; - - default: - printf ("** Error in get_cdf_attribute: bad data type"); - } - - } - break; + 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_); - + + /* Close the CDF file */ + status = CDFlib (CLOSE_, CDF_, NULL_); } - - void cdf_status_handler (CDFstatus status, char *source) { - char message[CDF_STATUSTEXT_LEN+1]; + char message[CDF_STATUSTEXT_LEN+1]; - CDFerror (status, message); /* Get the appropriate message */ + 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); - } - - + 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"; + switch (type) { + case CDF_BYTE: + return "CDF_BYTE"; - case CDF_INT1: - return "CDF_INT1"; + case CDF_INT1: + return "CDF_INT1"; - case CDF_CHAR: - return "CDF_CHAR"; + case CDF_CHAR: + return "CDF_CHAR"; - case CDF_INT2: - return "CDF_INT2"; + case CDF_INT2: + return "CDF_INT2"; - case CDF_UCHAR: - return "CDF_UCHAR"; + case CDF_UCHAR: + return "CDF_UCHAR"; - case CDF_UINT1: - return "CDF_UINT1"; + case CDF_UINT1: + return "CDF_UINT1"; - case CDF_INT4: - return "CDF_INT4"; + case CDF_INT4: + return "CDF_INT4"; - case CDF_UINT2: - return "CDF_UINT2"; + case CDF_UINT2: + return "CDF_UINT2"; - case CDF_FLOAT: - return "CDF_FLOAT"; + case CDF_FLOAT: + return "CDF_FLOAT"; - case CDF_REAL4: - return "CDF_REAL4"; + case CDF_REAL4: + return "CDF_REAL4"; - case CDF_DOUBLE: - return "CDF_DOUBLE"; + case CDF_DOUBLE: + return "CDF_DOUBLE"; - case CDF_REAL8: - return "CDF_REAL8"; + case CDF_REAL8: + return "CDF_REAL8"; - case CDF_UINT4: - return "CDF_UINT4"; + case CDF_UINT4: + return "CDF_UINT4"; - case CDF_EPOCH: - return "CDF_EPOCH"; + case CDF_EPOCH: + return "CDF_EPOCH"; - case CDF_EPOCH16: - return "CDF_EPOCH16"; - } -} + case CDF_EPOCH16: + return "CDF_EPOCH16"; + } +} \ No newline at end of file -- libgit2 0.21.2