11 #include "ncdispatch.h"
12 #include "nc_logging.h"
30 NC_compare_nc_types(
int ncid1,
int typeid1,
int ncid2,
int typeid2,
44 if (typeid1 <= NC_MAX_ATOMIC_TYPE)
46 if (typeid2 != typeid1)
57 size_t nelems1, nelems2;
61 size_t offset1, offset2;
69 &base1, &nelems1, &class1)))
72 &base2, &nelems2, &class2)))
76 if(size1 != size2 || class1 != class2 || strcmp(name1,name2))
83 if((ret = NC_compare_nc_types(ncid1, base1, ncid2,
93 if(base1 != base2 || nelems1 != nelems2)
return NC_NOERR;
95 if (!(value1 = malloc(size1)))
97 if (!(value2 = malloc(size2))) {
102 for(i = 0; i < nelems1; i++)
108 strcmp(name1, name2) || memcmp(value1, value2, size1))
119 if(nelems1 != nelems2)
123 for(i = 0; i < nelems1; i++)
127 &ftype1, &ndims1, dimsizes1)))
130 &ftype2, &ndims2, dimsizes2)))
134 for(j = 0; j < ndims1;j++)
135 if(dimsizes1[j] != dimsizes2[j])
139 if((ret = NC_compare_nc_types(ncid1, ftype1, ncid2, ftype2,
167 NC_rec_find_nc_type(
int ncid1,
nc_type tid1,
int ncid2,
nc_type* tid2)
180 if (!(ids = (
int *)malloc((
size_t)nids *
sizeof(
int))))
184 for(i = 0; i < nids; i++)
187 if ((ret = NC_compare_nc_types(ncid1, tid1, ncid2, ids[i], &equal)))
205 if (!(ids = (
int *)malloc((
size_t)nids *
sizeof(
int))))
212 for (i = 0; i < nids; i++)
214 ret = NC_rec_find_nc_type(ncid1, tid1, ids[i], tid2);
217 if (tid2 && *tid2 != 0)
241 NC_find_equal_type(
int ncid1,
nc_type xtype1,
int ncid2,
nc_type *xtype2)
250 if (xtype1 <= NC_MAX_ATOMIC_TYPE)
260 ret = NC_rec_find_nc_type(ncid1, xtype1 , ncid2, xtype2);
304 size_t *count = NULL, *start = NULL;
306 size_t *dimlen = NULL;
309 int src_format, dest_format;
315 if ((retval =
nc_inq_var(ncid_in, varid_in, name, &xtype,
316 &ndims, dimids_in, &natts)))
319 for(i = 0; i < ndims; i++) {
320 dimids_out[i] = dimids_in[i];
323 if ((retval =
nc_inq_dimid(ncid_out, dimname_in, &dimids_out[i])))
327 LOG((2,
"nc_copy_var: ncid_in 0x%x varid_in %d ncid_out 0x%x",
328 ncid_in, varid_in, ncid_out));
343 if ((retval =
nc_inq_type(ncid_in, xtype, type_name, &type_size)))
345 LOG((3,
"type %s has size %d", type_name, type_size));
351 if ((retval =
nc_def_var(ncid_out, name, xtype,
352 ndims, dimids_out, &varid_out)))
356 for (a=0; a<natts; a++)
360 if ((retval =
nc_copy_att(ncid_in, varid_in, att_name,
361 ncid_out, varid_out)))
372 real_ndims = ndims ? ndims : 1;
373 if (!(start = malloc((
size_t)real_ndims *
sizeof(
size_t))))
375 if (!(count = malloc((
size_t)real_ndims *
sizeof(
size_t))))
383 if (!(dimlen = malloc((
size_t)real_ndims *
sizeof(
size_t))))
391 for (d=0; d<ndims; d++)
393 if ((retval =
nc_inq_dimlen(ncid_in, dimids_in[d], &dimlen[d])))
395 LOG((4,
"nc_copy_var: there are %d data", dimlen[d]));
402 for (d=0; d<real_ndims; d++)
405 count[d] = d ? dimlen[d] : 1;
406 if (d) reclen *= dimlen[d];
414 if (!(data = malloc(reclen * type_size))) {
415 if(count) free(count);
416 if(dimlen) free(dimlen);
417 if(start) free(start);
422 for (start[0]=0; !retval && start[0]<(size_t)dimlen[0]; start[0]++)
428 (
signed char *)data);
431 (
const signed char *)data);
470 (
unsigned char *)data);
473 (
unsigned char *)data);
477 (
unsigned short *)data);
480 (
unsigned short *)data);
484 (
unsigned int *)data);
487 (
unsigned int *)data);
498 (
unsigned long long *)data);
501 (
unsigned long long *)data);
509 if (data) free(data);
510 if (dimlen) free(dimlen);
511 if (start) free(start);
512 if (count) free(count);
531 int ncid_out,
int varid_out)
538 LOG((2,
"nc_copy_att: ncid_in 0x%x varid_in %d name %s",
539 ncid_in, varid_in, name));
542 if ((res =
nc_inq_att(ncid_in, varid_in, name, &xtype, &len)))
550 size_t size = NC_atomictypelen(xtype);
553 if (!(data = malloc(len * size)))
557 res =
nc_get_att(ncid_in, varid_in, name, data);
559 res =
nc_put_att(ncid_out, varid_out, name, xtype,
569 if (!(str_data = malloc(
sizeof(
char *) * len)))
574 (
const char **)str_data);
589 if ((res = NC_find_equal_type(ncid_in, xtype, ncid_out, &xtype_out)))
595 NULL, NULL, &
class)))
601 if (!(vldata = malloc(
sizeof(
nc_vlen_t) * len)))
603 if ((res =
nc_get_att(ncid_in, varid_in, name, vldata)))
605 if ((res =
nc_put_att(ncid_out, varid_out, name, xtype_out,
608 for (i = 0; i < len; i++)
615 if (!(data = malloc(size * len)))
617 res =
nc_get_att(ncid_in, varid_in, name, data);
619 res =
nc_put_att(ncid_out, varid_out, name, xtype_out, len, data);
651 int ncid_out,
int varid_out)
653 int format, target_natts, target_attid;
662 if (ncid_in == ncid_out && varid_in == varid_out)
670 retval =
nc_inq_attid(ncid_out, varid_out, name, &target_attid);
674 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
684 if (target_attid == target_natts - 1)
685 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
689 for (a = 0; a < target_natts; a++)
691 if (a == target_attid)
693 if ((retval =
NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)))
700 if ((retval =
NC_copy_att(ncid_out, varid_out, att_name,
701 ncid_out, varid_out)))
710 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);