mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-27 08:49:16 +08:00
c3bdf768ec
* main: (158 commits) Update release notes. Refactor macro _FillValue to NC_FillValue in support of https://github.com/Unidata/netcdf-c/issues/2858 Remove appveyor config file. Add CI for a Windows Runner on Github Actions. Add cmake prefix path to appveyor config. Attempt to fix zlib-related error in appveyor. Correct typo. Remove check for libcurl unless it is necessary for required functionality. Rename the vendored strlcat symbol Fix conversion warnings in libdispatch Set flags to avoid warning messages if curl isn't found. Use modern cmake nomenclature for curl. Fix truncated-format warning in ncgen Fix some conversion warnings in ncgen3 Fix some conversion warnings in ncgen3 generated files Regenerate ncgen3 CMake: Add option to automatically regenerate ncgen3/ncgen Skip checking for duplicates if only one element in list Change format of backwards-loops Silence some conversion warnings in ncgen generated files ...
158 lines
3.9 KiB
C
158 lines
3.9 KiB
C
/*********************************************************************
|
|
* Copyright 2018, UCAR/Unidata
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
*********************************************************************/
|
|
|
|
#include "dapincludes.h"
|
|
#include "dapodom.h"
|
|
|
|
/**********************************************/
|
|
/* Define methods for a dimension dapodometer*/
|
|
|
|
/* Build an odometer covering slices startslice up to, but not including, stopslice */
|
|
Dapodometer*
|
|
dapodom_fromsegment(DCEsegment* segment, size_t startindex, size_t stopindex)
|
|
{
|
|
Dapodometer* odom;
|
|
|
|
assert(stopindex > startindex);
|
|
assert((stopindex - startindex) <= NC_MAX_VAR_DIMS);
|
|
odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
|
|
MEMCHECK(odom,NULL);
|
|
odom->rank = (stopindex - startindex);
|
|
for(size_t i=0;i<odom->rank;i++) {
|
|
odom->start[i] = segment->slices[i+startindex].first;
|
|
odom->stride[i] = segment->slices[i+startindex].stride;
|
|
odom->stop[i] = (segment->slices[i+startindex].last + 1);
|
|
/* should the above line be instead?
|
|
odom->stop[i] = odom->start[i] + (odom->count[i]*odom->stride[i]);
|
|
*/
|
|
#if 0
|
|
odom->count[i] = segment->slices[i+startindex].count;
|
|
#endif
|
|
odom->declsize[i] = segment->slices[i+startindex].declsize;
|
|
odom->index[i] = odom->start[i];
|
|
}
|
|
return odom;
|
|
}
|
|
|
|
Dapodometer*
|
|
dapodom_new(size_t rank,
|
|
const size_t* start, const size_t* count,
|
|
const ptrdiff_t* stride, const size_t* size)
|
|
{
|
|
int i;
|
|
Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer));
|
|
MEMCHECK(odom,NULL);
|
|
odom->rank = rank;
|
|
assert(odom->rank <= NC_MAX_VAR_DIMS);
|
|
for(i=0;i<odom->rank;i++) {
|
|
size_t istart,icount,istop,ideclsize;
|
|
istart = (start != NULL ? start[i] : 0);
|
|
icount = (count != NULL ? count[i] : (size != NULL ? size[i] : 1));
|
|
size_t istride = (size_t)(stride != NULL ? stride[i] : 1);
|
|
istop = istart + icount*istride;
|
|
ideclsize = (size != NULL ? size[i]: (istop - istart));
|
|
odom->start[i] = istart;
|
|
odom->stop[i] = istop;
|
|
odom->stride[i] = istride;
|
|
odom->declsize[i] = ideclsize;
|
|
odom->index[i] = odom->start[i];
|
|
}
|
|
return odom;
|
|
}
|
|
|
|
void
|
|
dapodom_free(Dapodometer* odom)
|
|
{
|
|
if(odom) free(odom);
|
|
}
|
|
|
|
#if 0
|
|
char*
|
|
dapodom_print(Dapodometer* odom)
|
|
{
|
|
int i;
|
|
static char line[1024];
|
|
char tmp[64];
|
|
line[0] = '\0';
|
|
if(odom->rank == 0) {
|
|
strlcat(line,"[]",sizeof(line));
|
|
} else for(i=0;i<odom->rank;i++) {
|
|
snprintf(tmp,sizeof(tmp),"[%lu/%lu:%lu:%lu]",
|
|
(size_t)odom->index[i],
|
|
(size_t)odom->start[i],
|
|
(size_t)odom->stride[i],
|
|
(size_t)odom->length[i]);
|
|
strlcat(line,tmp,sizeof(line));
|
|
}
|
|
return line;
|
|
}
|
|
#endif
|
|
|
|
int
|
|
dapodom_more(Dapodometer* odom)
|
|
{
|
|
return (odom->index[0] < odom->stop[0]);
|
|
}
|
|
|
|
/* Convert current dapodometer settings to a single integer count*/
|
|
size_t
|
|
dapodom_count(Dapodometer* odom)
|
|
{
|
|
size_t offset = 0;
|
|
for(size_t i=0;i<odom->rank;i++) {
|
|
offset *= odom->declsize[i];
|
|
offset += odom->index[i];
|
|
}
|
|
return offset;
|
|
}
|
|
|
|
int
|
|
dapodom_next(Dapodometer* odom)
|
|
{
|
|
if(odom->rank == 0) return 0;
|
|
for(size_t i = odom->rank; i-->0;) {
|
|
odom->index[i] += odom->stride[i];
|
|
if(odom->index[i] < odom->stop[i]) break;
|
|
if(i == 0) return 0; /* leave the 0th entry if it overflows*/
|
|
odom->index[i] = odom->start[i]; /* reset this position*/
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/**************************************************/
|
|
size_t
|
|
dapodom_varmcount(Dapodometer* odom, const ptrdiff_t* steps, const size_t* declsizes)
|
|
{
|
|
int i;
|
|
size_t offset = 0;
|
|
for(i=0;i<odom->rank;i++) {
|
|
size_t tmp;
|
|
tmp = odom->index[i];
|
|
tmp = tmp - odom->start[i];
|
|
tmp = tmp / odom->stride[i];
|
|
tmp = tmp * (size_t)steps[i];
|
|
offset += tmp;
|
|
}
|
|
return offset;
|
|
}
|
|
|
|
/*
|
|
Given a dapodometer, compute the total
|
|
number of elements in its space.
|
|
*/
|
|
|
|
#if 0
|
|
off_t
|
|
dapodom_space(Dapodometer* odom)
|
|
{
|
|
size_t i;
|
|
off_t count = 1;
|
|
for(i=0;i<odom->rank;i++) {
|
|
count *= odom->size[i];
|
|
}
|
|
return count;
|
|
}
|
|
#endif
|