static NCerror cvttype(nc_type etype, char** srcp, char** dstp) { unsigned int typesize = nctypesizeof(etype); char* src = *srcp; char* dst = *dstp; switch (etype) { case NC_STRING: case NC_URL: { char* ssrc = *(char**)src; *((char**)dst) = nulldup(ssrc); srcp += typesize; dstp += typesize; } break; default: if(typesize == 0) goto fail; memcpy((void*)dst,(void*)src,typesize); srcp += typesize; dstp += typesize; break; } return NC_NOERR; fail: oc_log(OCLOGERR,"cvttype bad value: %s",oc_typetostring(etype)); return NC_EINVAL; }
static NCerror buildcdftreer(NCDAPCOMMON* nccomm, OCddsnode ocnode, CDFnode* container, CDFtree* tree, CDFnode** cdfnodep) { size_t i,ocrank,ocnsubnodes; OCtype octype; OCtype ocatomtype; char* ocname = NULL; NCerror ncerr = NC_NOERR; CDFnode* cdfnode = NULL; oc_dds_class(nccomm->oc.conn,ocnode,&octype); if(octype == OC_Atomic) oc_dds_atomictype(nccomm->oc.conn,ocnode,&ocatomtype); else ocatomtype = OC_NAT; oc_dds_name(nccomm->oc.conn,ocnode,&ocname); oc_dds_rank(nccomm->oc.conn,ocnode,&ocrank); oc_dds_nsubnodes(nccomm->oc.conn,ocnode,&ocnsubnodes); #ifdef DEBUG1 if(ocatomtype == OC_NAT) fprintf(stderr,"buildcdftree: connect: %s %s\n",oc_typetostring(octype),ocname); else fprintf(stderr,"buildcdftree: connect: %s %s\n",oc_typetostring(ocatomtype),ocname); #endif switch (octype) { case OC_Dataset: cdfnode = makecdfnode(nccomm,ocname,octype,ocnode,container); nclistpush(tree->nodes,(void*)cdfnode); tree->root = cdfnode; cdfnode->tree = tree; break; case OC_Grid: case OC_Structure: case OC_Sequence: cdfnode = makecdfnode(nccomm,ocname,octype,ocnode,container); nclistpush(tree->nodes,(void*)cdfnode); #if 0 if(tree->root == NULL) { tree->root = cdfnode; cdfnode->tree = tree; } #endif break; case OC_Atomic: cdfnode = makecdfnode(nccomm,ocname,octype,ocnode,container); nclistpush(tree->nodes,(void*)cdfnode); #if 0 if(tree->root == NULL) { tree->root = cdfnode; cdfnode->tree = tree; } #endif break; case OC_Dimension: default: PANIC1("buildcdftree: unexpect OC node type: %d",(int)octype); } /* Avoid a rare but perhaps possible null-dereference of cdfnode. Not sure what error to throw, so using NC_EDAP: generic DAP error. */ if(!cdfnode) { return NC_EDAP; } #if 0 /* cross link */ assert(tree->root != NULL); cdfnode->root = tree->root; #endif if(ocrank > 0) defdimensions(ocnode,cdfnode,nccomm,tree); for(i=0;i<ocnsubnodes;i++) { OCddsnode ocsubnode; CDFnode* subnode; oc_dds_ithfield(nccomm->oc.conn,ocnode,i,&ocsubnode); ncerr = buildcdftreer(nccomm,ocsubnode,cdfnode,tree,&subnode); if(ncerr) { if(ocname) free(ocname); return ncerr; } nclistpush(cdfnode->subnodes,(void*)subnode); } nullfree(ocname); if(cdfnodep) *cdfnodep = cdfnode; return ncerr; }