📄 mexcdf53.c
字号:
outcdf = Scalar2Int(prhs[4]);
if (mxIsNumeric(prhs[5])) {
outvar = Scalar2Int(prhs[2]);
}
else {
name = Mat2Str(prhs[5]);
outvar = ncvarid(cdfid, name);
Free((VOIDPP) & name);
}
status = ncattcopy(incdf, invar, attname, outcdf, outvar);
plhs[0] = Int2Scalar(status);
Free((VOIDPP) & attname);
break;
case ATTNAME:
attnum = Scalar2Int(prhs[3]);
attname = (char *) mxCalloc(MAX_NC_NAME, sizeof(char));
status = ncattname(cdfid, varid, attnum, attname);
plhs[0] = Str2Mat(attname);
plhs[1] = Int2Scalar(status);
Free((VOIDPP) & attname);
break;
case ATTRENAME:
newname = Mat2Str(prhs[4]);
status = ncattrename(cdfid, varid, attname, newname);
plhs[0] = Int2Scalar(status);
Free((VOIDPP) & attname);
Free((VOIDPP) & newname);
break;
case ATTDEL:
status = ncattdel(cdfid, varid, attname);
plhs[0] = Int2Scalar(status);
Free((VOIDPP) & attname);
break;
case RECPUT:
recnum = Scalar2Long(prhs[2]);
pr = mxGetPr(prhs[3]);
autoscale = (nrhs > 4 && Scalar2Int(prhs[4]) != 0);
if (!autoscale) {
scalefactor = 1.0;
addoffset = 0.0;
}
recvarids = (int *) mxCalloc(MAX_VAR_DIMS, sizeof(int));
recsizes = (long *) mxCalloc(MAX_VAR_DIMS, sizeof(long));
datap = (VOIDPP) mxCalloc(MAX_VAR_DIMS, sizeof(VOIDP));
status = ncrecinq(cdfid, & nrecvars, recvarids, recsizes);
if (status == -1) {
plhs[0] = Int2Scalar(status);
break;
}
length = 0;
n = 0;
for (i = 0; i < nrecvars; i++) {
ncvarinq(cdfid, recvarids[i], NULL, & datatype, NULL, NULL, NULL);
datatype = RepairBadDataType(datatype);
length += recsizes[i];
n += (recsizes[i] / nctypelen(datatype));
}
if (Count(prhs[3]) < n) {
status = -1;
plhs[0] = Int2Scalar(status);
break;
}
if ((value = (VOIDP) mxCalloc((int) length, sizeof(char))) == NULL) {
status = -1;
plhs[0] = Int2Scalar(status);
break;
}
length = 0;
p = value;
for (i = 0; i < nrecvars; i++) {
datap[i] = p;
p += recsizes[i];
}
p = (char *) value;
pr = mxGetPr(prhs[3]);
for (i = 0; i < nrecvars; i++) {
ncvarinq(cdfid, recvarids[i], NULL, & datatype, NULL, NULL, NULL);
datatype = RepairBadDataType(datatype);
length = recsizes[i] / nctypelen(datatype);
if (autoscale) {
addoffset = Add_Offset(cdfid, recvarids[i]);
scalefactor = Scale_Factor(cdfid, recvarids[i]);
if (scalefactor == 0.0) {
scalefactor = 1.0;
}
}
Convert(opcode, datatype, length, (VOIDP) p, scalefactor, addoffset, pr);
pr += length;
p += recsizes[i];
}
status = ncrecput(cdfid, recnum, datap);
plhs[0] = Int2Scalar(status);
Free ((VOIDPP) & value);
Free ((VOIDPP) & datap);
Free ((VOIDPP) & recsizes);
Free ((VOIDPP) & recvarids);
break;
case RECGET:
recnum = Scalar2Long(prhs[2]);
autoscale = (nrhs > 3 && Scalar2Int(prhs[3]) != 0);
if (!autoscale) {
scalefactor = 1.0;
addoffset = 0.0;
}
recvarids = (int *) mxCalloc(MAX_VAR_DIMS, sizeof(int));
recsizes = (long *) mxCalloc(MAX_VAR_DIMS, sizeof(long));
datap = (VOIDPP) mxCalloc(MAX_VAR_DIMS, sizeof(VOIDP));
status = ncrecinq(cdfid, & nrecvars, recvarids, recsizes);
if (status == -1) {
Free ((VOIDPP) & recsizes);
Free ((VOIDPP) & recvarids);
plhs[1] = Int2Scalar(status);
break;
}
if (nrecvars == 0) {
Free ((VOIDPP) & recsizes);
Free ((VOIDPP) & recvarids);
plhs[0] = mxCreateFull(0, 0, REAL);
break;
}
length = 0;
n = 0;
for (i = 0; i < nrecvars; i++) {
ncvarinq(cdfid, recvarids[i], NULL, & datatype, NULL, NULL, NULL);
datatype = RepairBadDataType(datatype);
length += recsizes[i];
n += (recsizes[i] / nctypelen(datatype));
}
if ((value = (VOIDP) mxCalloc((int) length, sizeof(char))) == NULL) {
status = -1;
plhs[1] = Int2Scalar(status);
break;
}
if (value == NULL) {
status = -1;
plhs[1] = Int2Scalar(status);
break;
}
length = 0;
p = value;
for (i = 0; i < nrecvars; i++) {
datap[i] = p;
p += recsizes[i];
}
if ((status = ncrecget(cdfid, recnum, datap)) == -1) {
plhs[1] = Int2Scalar(status);
break;
}
m = 1;
plhs[0] = mxCreateFull(m, n, REAL);
if (plhs[0] == NULL) {
status = -1;
plhs[1] = Int2Scalar(status);
break;
}
pr = mxGetPr(plhs[0]);
p = (char *) value;
for (i = 0; i < nrecvars; i++) {
status = ncvarinq(cdfid, recvarids[i], NULL, & datatype, NULL, NULL, NULL);
datatype = RepairBadDataType(datatype);
if (status == -1) {
plhs[1] = Int2Scalar(status);
break;
}
length = recsizes[i] / nctypelen(datatype);
if (autoscale) {
addoffset = Add_Offset(cdfid, recvarids[i]);
scalefactor = Scale_Factor(cdfid, recvarids[i]);
if (scalefactor == 0.0) {
scalefactor = 1.0;
}
}
Convert(opcode, datatype, length, (VOIDP) p, scalefactor, addoffset, pr);
pr += length;
p += recsizes[i];
}
plhs[1] = Int2Scalar(status);
Free ((VOIDPP) & value);
Free ((VOIDPP) & datap);
Free ((VOIDPP) & recsizes);
Free ((VOIDPP) & recvarids);
break;
case RECINQ:
recvarids = (int *) mxCalloc(MAX_VAR_DIMS, sizeof(int));
recsizes = (long *) mxCalloc(MAX_VAR_DIMS, sizeof(long));
status = ncrecinq(cdfid, & nrecvars, recvarids, recsizes);
if (status != -1) {
for (i = 0; i < nrecvars; i++) {
ncvarinq(cdfid, recvarids[i], NULL, & datatype, NULL, NULL, NULL);
datatype = RepairBadDataType(datatype);
recsizes[i] /= nctypelen(datatype);
}
m = 1;
n = nrecvars;
plhs[0] = Int2Mat(recvarids, m, n);
plhs[1] = Long2Mat(recsizes, m, n);
}
plhs[2] = Int2Scalar(status);
Free ((VOIDPP) & recsizes);
Free ((VOIDPP) & recvarids);
break;
case TYPELEN:
datatype = (nc_type) Parameter(prhs[1]);
len = nctypelen(datatype);
plhs[0] = Int2Scalar(len);
plhs[1] = Int2Scalar((len >= 0) ? 0 : 1);
break;
case SETFILL:
fillmode = Scalar2Int(prhs[1]);
status = ncsetfill(cdfid, fillmode);
plhs[0] = Int2Scalar(status);
plhs[1] = Int2Scalar(0);
break;
case SETOPTS:
plhs[0] = Int2Scalar(ncopts);
plhs[1] = Int2Scalar(0);
ncopts = Scalar2Int(prhs[1]);
break;
case ERR:
plhs[0] = Int2Scalar(ncerr);
ncerr = 0;
plhs[1] = Int2Scalar(0);
break;
case PARAMETER:
if (nrhs > 1) {
plhs[0] = Int2Scalar(Parameter(prhs[1]));
plhs[1] = Int2Scalar(0);
}
else {
i = 0;
while (strcmp(parms[i].name, "NONE") != 0) {
mexPrintf("%12d %s\n", parms[i].code, parms[i].name);
i++;
}
plhs[0] = Int2Scalar(0);
plhs[1] = Int2Scalar(-1);
}
break;
default:
break;
}
return;
}
/* Convert(): Convert between DOUBLE and NetCDF numeric types. */
static int
Convert (
OPCODE opcode,
nc_type datatype,
int len,
VOIDP value,
DOUBLE scalefactor,
DOUBLE addoffset,
DOUBLE * pr
)
{
signed char * pbyte;
char * pchar;
short * pshort;
nclong * plong; /* Note use of nclong. */
float * pfloat;
double * pdouble;
int i;
int status;
status = 0;
switch (opcode) {
case VARPUT:
case VARPUT1:
case ATTPUT:
switch (datatype) {
case NC_BYTE:
pbyte = (signed char *) value;
for (i = 0; i < len; i++) {
*pbyte++ = (signed char) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_CHAR:
pchar = (char *) value;
for (i = 0; i < len; i++) {
*pchar++ = (char) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_SHORT:
pshort = (short *) value;
for (i = 0; i < len; i++) {
*pshort++ = (short) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_LONG:
plong = (nclong *) value;
for (i = 0; i < len; i++) {
*plong++ = (nclong) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_FLOAT:
pfloat = (float *) value;
for (i = 0; i < len; i++) {
*pfloat++ = (float) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_DOUBLE:
pdouble = (double *) value;
for (i = 0; i < len; i++) {
*pdouble++ = (double) ((*pr++ - addoffset) / scalefactor);
}
break;
default:
status = -1;
break;
}
break;
case VARGET:
case VARGET1:
case ATTGET:
switch (datatype) {
case NC_BYTE:
pbyte = (signed char *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pbyte++;
}
break;
case NC_CHAR:
pchar = (char *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pchar++;
}
break;
case NC_SHORT:
pshort = (short *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pshort++;
}
break;
case NC_LONG:
plong = (nclong *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *plong++;
}
break;
case NC_FLOAT:
pfloat = (float *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pfloat++;
}
break;
case NC_DOUBLE:
pdouble = (double *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pdouble++;
}
break;
default:
status = -1;
break;
}
break;
case VARPUTG:
case RECPUT:
switch (datatype) {
case NC_BYTE:
pbyte = (signed char *) value;
for (i = 0; i < len; i++) {
*pbyte++ = (signed char) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_CHAR:
pchar = (char *) value;
for (i = 0; i < len; i++) {
*pchar++ = (char) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_SHORT:
pshort = (short *) value;
for (i = 0; i < len; i++) {
*pshort++ = (short) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_LONG:
plong = (nclong *) value;
for (i = 0; i < len; i++) {
*plong++ = (nclong) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_FLOAT:
pfloat = (float *) value;
for (i = 0; i < len; i++) {
*pfloat++ = (float) ((*pr++ - addoffset) / scalefactor);
}
break;
case NC_DOUBLE:
pdouble = (double *) value;
for (i = 0; i < len; i++) {
*pdouble++ = (double) ((*pr++ - addoffset) / scalefactor);
}
break;
default:
status = -1;
break;
}
break;
case VARGETG:
case RECGET:
switch (datatype) {
case NC_BYTE:
pbyte = (signed char *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pbyte++;
}
break;
case NC_CHAR:
pchar = (char *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pchar++;
}
break;
case NC_SHORT:
pshort = (short *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pshort++;
}
break;
case NC_LONG:
plong = (nclong *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *plong++;
}
break;
case NC_FLOAT:
pfloat = (float *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pfloat++;
}
break;
case NC_DOUBLE:
pdouble = (double *) value;
for (i = 0; i < len; i++) {
*pr++ = addoffset + scalefactor * (DOUBLE) *pdouble++;
}
break;
default:
status = -1;
break;
}
break;
default:
status = -1;
break;
}
return (status);
}
/* Usage(): Print information on NCMEX usage. */
static VOID
Usage (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -