PDL-NetCDF
view release on metacpan or search on metacpan
}
RETVAL = newRV((SV *)perlarray);
rc = nc_free_string(attlen, string_attr);
if (rc != NC_NOERR)
croak("Error in nc_free_string attribute %s from varid %d\n", name, varid);
free(string_attr);
}
OUTPUT:
RETVAL
EOXS
#-------------------------------------------------------------------------
# Add the ability to put 'string' variable attributes (as opposed to 'text')
# using the new routine nc_put_att_string. These strings are multiple, represented
# as a char** in C and a ref to a list of perl strings in perl.
#-------------------------------------------------------------------------
pp_addxs (<<'EOXS');
int
nc_put_att_string(ncid, varid, name, len, perlarr_ref)
int ncid
int varid
char *name
size_t len
SV *perlarr_ref
CODE:
{
int i;
char **string_attr = (char**)malloc(len * sizeof(char*));
memset(string_attr, 0, len * sizeof(char*));
AV *perlarr = (AV *)SvRV(perlarr_ref);
for (i=0;i<len;i++) {
SV** perlstr_p = av_fetch(perlarr, i, 0);
string_attr[i] = SvPVbyte_nolen(*perlstr_p); // Assume string null-terminated!
}
RETVAL = nc_put_att_string(ncid, varid, name, len, (const char **)string_attr);
if (RETVAL != NC_NOERR)
printf("Error in nc_put_att_string for attribute %s from varid %d\n", name, varid);
free(string_attr);
}
OUTPUT:
RETVAL
EOXS
#-------------------------------------------------------------------------
# Put a list of values to a bunch of 1D variables.
#-------------------------------------------------------------------------
pp_addxs (<<'EOXS');
int
c_putrec (ncid, varids, datatypes, strlen, idx, values)
int ncid
SV* varids
SV* datatypes
SV* strlen
int idx
SV* values
PPCODE:
int i;
int dt;
int varid;
char c_elem;
short s_elem;
ushort us_elem;
int i_elem;
unsigned int ui_elem;
longlong ll_elem;
unsigned longlong ull_elem;
float f_elem;
double d_elem;
char *t_elem; // Hard-coded 256 char limit to string sizes!
STRLEN len;
SV **elem;
size_t nc_index[2]; // Index for use in inserting variables
size_t nc_count[2]; // For 'classic' string variables
int rc = NC_NOERR; // 0
int recsize = av_len((AV *)SvRV(varids)) + 1;
nc_index[0] = idx; // index to put
nc_index[1] = 0; // For string variables
nc_count[0] = 1; // For string variables
// loop over input variables
for (i=0; i<recsize; i++) {
elem = av_fetch((AV *)SvRV(datatypes), i, 0); // elem is perl SV for the datatype
dt = (int)SvIV(*elem); // dt is the data type of the current variable (C int)
elem = av_fetch((AV *)SvRV(varids), i, 0);
varid = (int)SvIV(*elem);
elem = av_fetch((AV *)SvRV(values), i, 0); // perl SV for current value
if (dt == NC_BYTE) {
c_elem = (char)SvIV(*elem); // element to put
rc = nc_put_var1_schar (ncid, varid, nc_index, &c_elem);
} else if (dt == NC_SHORT) {
s_elem = (short)SvIV(*elem); // element to put
rc = nc_put_var1_short (ncid, varid, nc_index, &s_elem);
} else if (dt == NC_INT) {
i_elem = (int)SvIV(*elem); // element to put
rc = nc_put_var1_int (ncid, varid, nc_index, &i_elem);
#ifdef NC_NETCDF4
} else if (dt == NC_USHORT) {
us_elem = (ushort)SvIV(*elem); // element to put
rc = nc_put_var1_ushort (ncid, varid, nc_index, &us_elem);
} else if (dt == NC_UINT) {
ui_elem = (unsigned int)SvIV(*elem); // element to put
rc = nc_put_var1_uint (ncid, varid, nc_index, &ui_elem);
} else if (dt == NC_INT64) {
ll_elem = (longlong)SvIV(*elem); // element to put
rc = nc_put_var1_longlong (ncid, varid, nc_index, &ll_elem);
} else if (dt == NC_UINT64) {
ull_elem = (unsigned longlong)SvIV(*elem); // element to put
rc = nc_put_var1_ulonglong (ncid, varid, nc_index, &ll_elem);
#endif
} else if (dt == NC_FLOAT) {
f_elem = (float)SvNV(*elem); // element to put
rc = nc_put_var1_float (ncid, varid, nc_index, &f_elem);
} else if (dt == NC_DOUBLE) {
d_elem = (double)SvNV(*elem); // element to put
rc = nc_put_var1_double (ncid, varid, nc_index, &d_elem);
} else if (dt == NC_CHAR) {
t_elem = (char *)SvPV(*elem, len); // element to put
elem = av_fetch((AV *)SvRV(strlen), i, 0); // elem is perl SV for the length of this string dimension
nc_count[1] = (int)SvIV(*elem); // nc_count[1] is the length of the string dimension for this variable
rc = nc_put_vara_text (ncid, varid, nc_index, nc_count, t_elem);
}
if (rc != NC_NOERR)
croak("Error writing NCID %d: %s\n", varid, nc_strerror(rc));
}
EOXS
#-------------------------------------------------------------------------
# Get a list of values from a bunch of 1D variables.
#-------------------------------------------------------------------------
pp_addxs (<<'EOXS');
int
c_getrec (ncid, varids, datatypes, strlen, idx)
int ncid
SV* varids
SV* datatypes
SV* strlen
int idx
PPCODE:
int i;
int dt;
int varid;
char c_elem;
short s_elem;
ushort us_elem;
int i_elem;
longlong ll_elem;
float f_elem;
double d_elem;
char t_elem[256]; // Hard-coded 256 char limit to string sizes!
SV **elem;
size_t nc_index[2]; // Index for use in inserting variables
size_t nc_count[2]; // For 'classic' string variables
int rc = NC_NOERR; // 0
int recsize = av_len((AV *)SvRV(varids)) + 1;
nc_index[0] = idx; // index to put
nc_index[1] = 0; // For string variables
nc_count[0] = 1; // For string variables
// loop over input variables
for (i=0; i<recsize; i++) {
elem = av_fetch((AV *)SvRV(datatypes), i, 0); // elem is perl SV for the datatype
dt = (int)SvIV(*elem); // dt is the data type of the current variable (C int)
elem = av_fetch((AV *)SvRV(varids), i, 0);
varid = (int)SvIV(*elem);
EXTEND (SP, 1);
if (dt == NC_BYTE) {
rc = nc_get_var1_schar (ncid, varid, nc_index, &c_elem);
PUSHs (sv_2mortal (newSViv ((IV)c_elem)));
} else if (dt == NC_SHORT) {
rc = nc_get_var1_short (ncid, varid, nc_index, &s_elem);
PUSHs (sv_2mortal (newSViv ((IV)s_elem)));
} else if (dt == NC_INT) {
rc = nc_get_var1_int (ncid, varid, nc_index, &i_elem);
PUSHs (sv_2mortal (newSViv ((IV)i_elem)));
#ifdef NC_NETCDF4
} else if (dt == NC_USHORT) {
rc = nc_get_var1_ushort (ncid, varid, nc_index, &us_elem);
PUSHs (sv_2mortal (newSViv ((IV)us_elem)));
} else if (dt == NC_UINT) {
rc = nc_get_var1_uint (ncid, varid, nc_index, &i_elem);
PUSHs (sv_2mortal (newSViv ((IV)i_elem)));
} else if (dt == NC_INT64) {
rc = nc_get_var1_longlong (ncid, varid, nc_index, &ll_elem);
PUSHs (sv_2mortal (newSViv ((IV)ll_elem)));
} else if (dt == NC_UINT64) {
rc = nc_get_var1_ulonglong (ncid, varid, nc_index, &ll_elem);
PUSHs (sv_2mortal (newSViv ((IV)ll_elem)));
#endif
} else if (dt == NC_FLOAT) {
rc = nc_get_var1_float (ncid, varid, nc_index, &f_elem);
PUSHs (sv_2mortal (newSVnv ((double)f_elem)));
} else if (dt == NC_DOUBLE) {
rc = nc_get_var1_double (ncid, varid, nc_index, &d_elem);
PUSHs (sv_2mortal (newSVnv (d_elem)));
( run in 0.634 second using v1.01-cache-2.11-cpan-5511b514fd6 )