static void completesegments3(NClist* fullpath, NClist* segments) { int i,delta; /* add path nodes to segments to create full path */ delta = (nclistlength(fullpath) - nclistlength(segments)); ASSERT((delta >= 0)); for(i=0;i<delta;i++) { DCEsegment* seg = (DCEsegment*)dcecreate(CES_SEGMENT); CDFnode* node = (CDFnode*)nclistget(fullpath,i); seg->name = nulldup(node->ocname); seg->annotation = (void*)node; seg->rank = nclistlength(node->array.dimset0); #ifdef IGNORE for(j=0;j<seg->rank;j++) { CDFnode* dim = (CDFnode*)nclistget(node->array.dimset0,j); dcemakewholeslice(seg->slices+j,dim->dim.declsize); } #endif nclistinsert(segments,i,(ncelem)seg); } /* Now modify the segments to point to the appropriate node and fill in the slices. */ for(i=delta;i<nclistlength(segments);i++) { DCEsegment* seg = (DCEsegment*)nclistget(segments,i); CDFnode* node = (CDFnode*)nclistget(fullpath,i); seg->annotation = (void*)node; #ifdef IGNORE if(!seg->slicesdefined) { makewholesegment3(seg,node); } #endif } }
/* Convert a CDFnode var to a projection; include pseudodimensions; always whole variable. */ int dapvar2projection(CDFnode* var, DCEprojection** projectionp) { int i,j; int ncstat = NC_NOERR; NClist* path = nclistnew(); NClist* segments; DCEprojection* projection = NULL; int dimindex; /* Collect the nodes needed to construct the projection segment */ collectnodepath3(var,path,!WITHDATASET); segments = nclistnew(); dimindex = 0; /* point to next subset of slices */ nclistsetalloc(segments,nclistlength(path)); for(i=0;i<nclistlength(path);i++) { DCEsegment* segment = (DCEsegment*)dcecreate(CES_SEGMENT); CDFnode* n = (CDFnode*)nclistget(path,i); int localrank; NClist* dimset; segment->annotation = (void*)n; segment->name = nulldup(n->ocname); /* We need to assign whole slices to each segment */ localrank = nclistlength(n->array.dimsetplus); segment->rank = localrank; dimset = n->array.dimsetplus; for(j=0;j<localrank;j++) { DCEslice* slice; CDFnode* dim; slice = &segment->slices[j]; dim = (CDFnode*)nclistget(dimset,j); ASSERT(dim->dim.declsize0 > 0); dcemakewholeslice(slice,dim->dim.declsize0); } segment->slicesdefined = 1; segment->slicesdeclized = 1; dimindex += localrank; nclistpush(segments,(ncelem)segment); } projection = (DCEprojection*)dcecreate(CES_PROJECT); projection->discrim = CES_VAR; projection->var = (DCEvar*)dcecreate(CES_VAR); projection->var->annotation = (void*)var; projection->var->segments = segments; #ifdef DEBUG1 fprintf(stderr,"dapvar2projection: projection=%s\n", dumpprojection(projection)); #endif nclistfree(path); if(ncstat) dcefree((DCEnode*)projection); else if(projectionp) *projectionp = projection; return ncstat; }
void makewholesegment3(DCEsegment* seg, CDFnode* node) { int i; NClist* dimset = NULL; unsigned int rank; dimset = node->array.dimensions; rank = nclistlength(dimset); seg->rank = rank; for(i=0;i<rank;i++) { CDFnode* dim = (CDFnode*)nclistget(dimset,i); dcemakewholeslice(&seg->slices[i],dim->dim.declsize); } seg->slicesdefined = 1; seg->slicesdeclized = 1; }
/* Make sure that the slice declsizes are all defined for this projection */ static NCerror qualifyprojectionsizes3(DCEprojection* proj) { int i,j; ASSERT(proj->discrim == CES_VAR); #ifdef DEBUG fprintf(stderr,"qualifyprojectionsizes.before: %s\n", dumpprojection(proj)); #endif for(i=0;i<nclistlength(proj->var->segments);i++) { DCEsegment* seg = (DCEsegment*)nclistget(proj->var->segments,i); NClist* dimset = NULL; CDFnode* cdfnode = (CDFnode*)seg->annotation; ASSERT(cdfnode != NULL); dimset = cdfnode->array.dimsetplus; seg->rank = nclistlength(dimset); /* For this, we do not want any string dimensions */ if(cdfnode->array.stringdim != NULL) seg->rank--; for(j=0;j<seg->rank;j++) { CDFnode* dim = (CDFnode*)nclistget(dimset,j); if(dim->dim.basedim != NULL) dim = dim->dim.basedim; ASSERT(dim != null); if(seg->slicesdefined) seg->slices[j].declsize = dim->dim.declsize; else dcemakewholeslice(seg->slices+j,dim->dim.declsize); } seg->slicesdefined = 1; seg->slicesdeclized = 1; } #ifdef DEBUG fprintf(stderr,"qualifyprojectionsizes.after: %s\n", dumpprojection(proj)); #endif return NC_NOERR; }