14 #include "nc4internal.h"
15 #include "nc4dispatch.h"
32 NC4_def_grp(
int parent_ncid,
const char *name,
int *new_ncid)
35 NC_HDF5_FILE_INFO_T *h5;
39 LOG((2,
"%s: parent_ncid 0x%x name %s", __func__, parent_ncid, name));
42 if ((retval = nc4_find_grp_h5(parent_ncid, &grp, &h5)))
47 if ((retval = nc4_check_name(name, norm_name)))
51 if ((retval = nc4_check_dup_name(grp, norm_name)))
59 if (!(h5->flags & NC_INDEF))
60 if ((retval = NC4_redef(parent_ncid)))
66 if ((retval = nc4_grp_list_add(&(grp->children), h5->next_nc_grpid,
67 grp, grp->nc4_info->controller, norm_name, NULL)))
70 *new_ncid = grp->nc4_info->controller->ext_ncid | h5->next_nc_grpid;
92 NC4_rename_grp(
int grpid,
const char *name)
95 NC_HDF5_FILE_INFO_T *h5;
99 LOG((2,
"nc_rename_grp: grpid 0x%x name %s", grpid, name));
102 if ((retval = nc4_find_grp_h5(grpid, &grp, &h5)))
110 if (grp->parent == NULL)
114 if ((retval = nc4_check_name(name, norm_name)))
119 if ((retval = nc4_check_dup_name(grp->parent, norm_name)))
123 if (!(h5->flags & NC_INDEF))
124 if ((retval = NC4_redef(grpid)))
131 if (H5Gclose(grp->hdf_grpid) < 0)
136 if (grp->parent->hdf_grpid)
139 if (H5Gmove(grp->parent->hdf_grpid, grp->name, name) < 0)
143 if ((grp->hdf_grpid = H5Gopen2(grp->parent->hdf_grpid, name, H5P_DEFAULT)) < 0)
151 if (!(grp->name = malloc((strlen(norm_name) + 1) *
sizeof(
char))))
153 strcpy(grp->name, norm_name);
173 NC4_inq_ncid(
int ncid,
const char *name,
int *grp_ncid)
175 NC_GRP_INFO_T *grp, *g;
176 NC_HDF5_FILE_INFO_T *h5;
180 LOG((2,
"nc_inq_ncid: ncid 0x%x name %s", ncid, name));
183 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
188 if ((retval = nc4_normalize_name(name, norm_name)))
192 for (g = grp->children; g; g = g->l.next)
193 if (!strcmp(norm_name, g->name))
196 *grp_ncid = grp->nc4_info->controller->ext_ncid | g->nc_grpid;
217 NC4_inq_grps(
int ncid,
int *numgrps,
int *ncids)
219 NC_GRP_INFO_T *grp, *g;
220 NC_HDF5_FILE_INFO_T *h5;
224 LOG((2,
"nc_inq_grps: ncid 0x%x", ncid));
227 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
232 for (g = grp->children; g; g = g->l.next)
239 *ncids = g->nc_grpid | g->nc4_info->controller->ext_ncid;
263 NC4_inq_grpname(
int ncid,
char *name)
266 NC_HDF5_FILE_INFO_T *h5;
269 LOG((2,
"nc_inq_grpname: ncid 0x%x", ncid));
272 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
278 strcpy(name, grp->name);
299 NC4_inq_grpname_full(
int ncid,
size_t *lenp,
char *full_name)
302 int g,
id = ncid, parent_id, *gid;
306 for (g = 0; !NC4_inq_grp_parent(
id, &parent_id); g++,
id = parent_id)
310 if (!(name = malloc((g + 1) * (
NC_MAX_NAME + 1) + 1)))
312 if (!(gid = malloc((g + 1) *
sizeof(
int))))
324 for (i = 1; i < g && !ret; i++)
325 ret = NC4_inq_grp_parent(gid[i - 1], &gid[i]);
328 for (i = g - 1; !ret && i >= 0 && !ret; i--)
330 if ((ret = NC4_inq_grpname(gid[i], grp_name)))
332 strcat(name, grp_name);
339 *lenp = strlen(name);
342 if (!ret && full_name)
343 strcpy(full_name, name);
366 NC4_inq_grp_parent(
int ncid,
int *parent_ncid)
369 NC_HDF5_FILE_INFO_T *h5;
372 LOG((2,
"nc_inq_grp_parent: ncid 0x%x", ncid));
375 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
383 *parent_ncid = grp->nc4_info->controller->ext_ncid | grp->parent->nc_grpid;
406 NC4_inq_grp_full_ncid(
int ncid,
const char *full_name,
int *grp_ncid)
409 NC_HDF5_FILE_INFO_T *h5;
411 char *cp, *full_name_cpy;
418 if ((ret = nc4_find_grp_h5(ncid, &grp, &h5)))
424 if (!(full_name_cpy = malloc(strlen(full_name) + 1)))
426 strcpy(full_name_cpy, full_name);
429 if (!(cp = strtok(full_name_cpy,
"/")))
444 for (; cp; id1 = id2)
446 if ((ret = NC4_inq_ncid(id1, cp, &id2)))
451 cp = strtok(NULL,
"/");
476 NC4_inq_varids(
int ncid,
int *nvars,
int *varids)
479 NC_HDF5_FILE_INFO_T *h5;
485 LOG((2,
"nc_inq_varids: ncid 0x%x", ncid));
488 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
494 for (i=0; i < grp->vars.nelems; i++)
496 var = grp->vars.value[i];
499 varids[num_vars] = var->varid;
522 int int_cmp(
const void *a,
const void *b)
524 const int *ia = (
const int *)a;
525 const int *ib = (
const int *)b;
545 NC4_inq_dimids(
int ncid,
int *ndims,
int *dimids,
int include_parents)
547 NC_GRP_INFO_T *grp, *g;
548 NC_HDF5_FILE_INFO_T *h5;
553 LOG((2,
"nc_inq_dimids: ncid 0x%x include_parents: %d", ncid,
557 if ((retval = nc4_find_grp_h5(ncid, &grp, &h5)))
562 for (dim = grp->dim; dim; dim = dim->l.next)
565 for (g = grp->parent; g; g = g->parent)
566 for (dim = g->dim; dim; dim = dim->l.next)
575 for (dim = grp->dim; dim; dim = dim->l.next)
576 dimids[n++] = dim->dimid;
580 for (g = grp->parent; g; g = g->parent)
581 for (dim = g->dim; dim; dim = dim->l.next)
582 dimids[n++] = dim->dimid;
584 qsort(dimids, num,
sizeof(
int), int_cmp);
#define NC_ENOMEM
Memory allocation (malloc) failure.
#define NC_CLASSIC_MODEL
Enforce classic model on netCDF-4.
#define NC_EHDFERR
Error at HDF5 layer.
#define NC_ENOGRP
No group found.
#define NC_EINVAL
Invalid Argument.
#define NC_ESTRICTNC3
Attempting netcdf-4 operation on strict nc3 netcdf-4 file.
#define NC_EBADGRPID
Bad group ID.
#define NC_MAX_NAME
Maximum for classic library.
#define NC_EPERM
Write to read only.
#define NC_NOERR
No Error.