/*! This function queries the full name of a group given its id. \param [in] ncid Groupd id (or File Id) \param [in/out] grpFullName the full name of the group \return Status code */ int CNetCdfInterface::inqGrpFullName(int ncid, StdString& grpFullName) { StdSize strlen = 0; std::vector<char> buff; int status = nc_inq_grpname_full(ncid, &strlen, NULL); if (NC_NOERR == status) { buff.resize(strlen + 1); status = nc_inq_grpname_full(ncid, NULL, &buff[0]); } if (NC_NOERR != status) { StdString errormsg(nc_strerror(status)); StdStringStream sstr; sstr << "Error when calling function nc_inq_grpname_full(ncid, &strlen, &buff[0])" << std::endl << errormsg << std::endl << "Unable to get the full group name given its id: " << ncid << std::endl; StdString e = sstr.str(); throw CNetCdfException(e); } grpFullName.assign(buff.begin(), buff.end()); return status; }
/* Get varid of variable with name using nested group syntax * "gp1/gp2/var" or "/gp1/gp2/var". In the former case, grpname of * grp corresponding to grpid must end in "gp1/gp2". In the latter * case, grpname for grpid must be exactly "/gp1/gp2". If variable * named "var" is not in group grpid, returns NC_ENOTVAR, else sets * varid and returns NC_NOERR. */ int nc_inq_gvarid(int grpid, const char *varname, int *varidp) { /* if varname has no "/" chars, then return varidp from nc_inq_varid(grpid, varname, varidp) if varname begins with "/" else get groupname corresponding to grpid get vargroup = substring of varname up to last "/" get relname = substring of varname after last "/" if (varname starts with "/" and groupname == vargroup) || (groupname ends with vargroup) return nc_inq_varid(grpid, relname, varidp) else return NC_ENOTVAR */ #ifdef USE_NETCDF4 char *vargroup; char *relname; char *groupname; int status; if (varname[0] == '\0') return NC_ENOTVAR; vargroup = strdup(varname); if (vargroup == NULL) return NC_ENOMEM; relname = strrchr(vargroup, NC_GRP_DELIM); if (relname != NULL) { /* name has a "/" in it */ size_t len; /* length of full group name for grpid */ *relname++ = '\0'; /* split vargroup string in two, * vargroup and relname */ if ( (status = nc_inq_grpname_full(grpid, &len, NULL)) != NC_NOERR ) { free(vargroup); return status; } groupname = (char *)emalloc(len + 1); if ( (status = nc_inq_grpname_full(grpid, &len, groupname)) == NC_NOERR ) { if(varname[0] == NC_GRP_DELIM) { if( strcmp(groupname, vargroup) == 0) status = nc_inq_varid(grpid, relname, varidp); else status = NC_ENOTVAR; } else { if(strendswith(groupname, vargroup)) status = nc_inq_varid(grpid, relname, varidp); else status = NC_ENOTVAR; } } free(vargroup); free(groupname); return status; } free(vargroup); #endif /* USE_NETCDF4 */ return nc_inq_varid(grpid, varname, varidp); }
int nc_inq_grpname_len(int ncid, size_t *lenp) { int stat = nc_inq_grpname_full(ncid,lenp,NULL); return stat; }
EXTERNL int nc_inq_grpname_len(int ncid, size_t *lenp) { return nc_inq_grpname_full(ncid, lenp, NULL); }