10 #include "ncdispatch.h"
11 #include "nc_logging.h"
29 NC_compare_nc_types(
int ncid1,
int typeid1,
int ncid2,
int typeid2,
43 if (typeid1 <= NC_MAX_ATOMIC_TYPE)
45 if (typeid2 != typeid1)
56 size_t nelems1, nelems2;
60 size_t offset1, offset2;
68 &base1, &nelems1, &class1)))
71 &base2, &nelems2, &class2)))
75 if(size1 != size2 || class1 != class2 || strcmp(name1,name2))
82 if((ret = NC_compare_nc_types(ncid1, base1, ncid2,
92 if(base1 != base2 || nelems1 != nelems2)
return NC_NOERR;
94 if (!(value1 = malloc(size1)))
96 if (!(value2 = malloc(size2))) {
101 for(i = 0; i < nelems1; i++)
107 strcmp(name1, name2) || memcmp(value1, value2, size1))
118 if(nelems1 != nelems2)
122 for(i = 0; i < nelems1; i++)
126 &ftype1, &ndims1, dimsizes1)))
129 &ftype2, &ndims2, dimsizes2)))
133 for(j = 0; j < ndims1;j++)
134 if(dimsizes1[j] != dimsizes2[j])
138 if((ret = NC_compare_nc_types(ncid1, ftype1, ncid2, ftype2,
166 NC_rec_find_nc_type(
int ncid1,
nc_type tid1,
int ncid2,
nc_type* tid2)
179 if (!(ids = (
int *)malloc((
size_t)nids *
sizeof(
int))))
183 for(i = 0; i < nids; i++)
186 if ((ret = NC_compare_nc_types(ncid1, tid1, ncid2, ids[i], &equal)))
204 if (!(ids = (
int *)malloc((
size_t)nids *
sizeof(
int))))
211 for (i = 0; i < nids; i++)
213 ret = NC_rec_find_nc_type(ncid1, tid1, ids[i], tid2);
216 if (tid2 && *tid2 != 0)
240 NC_find_equal_type(
int ncid1,
nc_type xtype1,
int ncid2,
nc_type *xtype2)
249 if (xtype1 <= NC_MAX_ATOMIC_TYPE)
259 ret = NC_rec_find_nc_type(ncid1, xtype1 , ncid2, xtype2);
303 size_t *count = NULL, *start = NULL;
305 size_t *dimlen = NULL;
308 int src_format, dest_format;
314 if ((retval =
nc_inq_var(ncid_in, varid_in, name, &xtype,
315 &ndims, dimids_in, &natts)))
318 for(i = 0; i < ndims; i++) {
319 dimids_out[i] = dimids_in[i];
322 if ((retval =
nc_inq_dimid(ncid_out, dimname_in, &dimids_out[i])))
326 LOG((2,
"nc_copy_var: ncid_in 0x%x varid_in %d ncid_out 0x%x",
327 ncid_in, varid_in, ncid_out));
342 if ((retval =
nc_inq_type(ncid_in, xtype, type_name, &type_size)))
344 LOG((3,
"type %s has size %d", type_name, type_size));
350 if ((retval =
nc_def_var(ncid_out, name, xtype,
351 ndims, dimids_out, &varid_out)))
355 for (a=0; a<natts; a++)
359 if ((retval =
nc_copy_att(ncid_in, varid_in, att_name,
360 ncid_out, varid_out)))
371 real_ndims = ndims ? ndims : 1;
372 if (!(start = malloc((
size_t)real_ndims *
sizeof(
size_t))))
374 if (!(count = malloc((
size_t)real_ndims *
sizeof(
size_t))))
382 if (!(dimlen = malloc((
size_t)real_ndims *
sizeof(
size_t))))
390 for (d=0; d<ndims; d++)
392 if ((retval =
nc_inq_dimlen(ncid_in, dimids_in[d], &dimlen[d])))
394 LOG((4,
"nc_copy_var: there are %d data", dimlen[d]));
401 for (d=0; d<real_ndims; d++)
404 count[d] = d ? dimlen[d] : 1;
405 if (d) reclen *= dimlen[d];
413 if (!(data = malloc(reclen * type_size))) {
414 if(count) free(count);
415 if(dimlen) free(dimlen);
416 if(start) free(start);
421 for (start[0]=0; !retval && start[0]<(size_t)dimlen[0]; start[0]++)
427 (
signed char *)data);
430 (
const signed char *)data);
469 (
unsigned char *)data);
472 (
unsigned char *)data);
476 (
unsigned short *)data);
479 (
unsigned short *)data);
483 (
unsigned int *)data);
486 (
unsigned int *)data);
497 (
unsigned long long *)data);
500 (
unsigned long long *)data);
508 if (data) free(data);
509 if (dimlen) free(dimlen);
510 if (start) free(start);
511 if (count) free(count);
530 int ncid_out,
int varid_out)
537 LOG((2,
"nc_copy_att: ncid_in 0x%x varid_in %d name %s",
538 ncid_in, varid_in, name));
541 if ((res =
nc_inq_att(ncid_in, varid_in, name, &xtype, &len)))
549 size_t size = NC_atomictypelen(xtype);
552 if (!(data = malloc(len * size)))
556 res =
nc_get_att(ncid_in, varid_in, name, data);
558 res =
nc_put_att(ncid_out, varid_out, name, xtype,
568 if (!(str_data = malloc(
sizeof(
char *) * len)))
573 (
const char **)str_data);
588 if ((res = NC_find_equal_type(ncid_in, xtype, ncid_out, &xtype_out)))
594 NULL, NULL, &
class)))
600 if (!(vldata = malloc(
sizeof(
nc_vlen_t) * len)))
602 if ((res =
nc_get_att(ncid_in, varid_in, name, vldata)))
604 if ((res =
nc_put_att(ncid_out, varid_out, name, xtype_out,
607 for (i = 0; i < len; i++)
614 if (!(data = malloc(size * len)))
616 res =
nc_get_att(ncid_in, varid_in, name, data);
618 res =
nc_put_att(ncid_out, varid_out, name, xtype_out, len, data);
650 int ncid_out,
int varid_out)
652 int format, target_natts, target_attid;
661 if (ncid_in == ncid_out && varid_in == varid_out)
669 retval =
nc_inq_attid(ncid_out, varid_out, name, &target_attid);
673 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
683 if (target_attid == target_natts - 1)
684 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
688 for (a = 0; a < target_natts; a++)
690 if (a == target_attid)
692 if ((retval =
NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out)))
699 if ((retval =
NC_copy_att(ncid_out, varid_out, att_name,
700 ncid_out, varid_out)))
709 return NC_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);