netcdf-c/ncgen/util.h
Dennis Heimbigner 68a98f6e81 Fix ncgen handling of big data sections
The current ncgen does not properly handle very large
data sections. Apparently this is very uncommon because
it was only discovered in testing the new zarr code.

The fix required a new approach to processing data sections.
Unfortunately, the resulting ncgen is slower than before
but at least it is, I think, now correct.

The added test cases are in libnczarr, and so will
not show up until that is incorporated into master.

Note also that fortran code generation changed, but
has not been tested here.

Misc. Changes
1. Cleanup error handling in ncgen -lc and -lb output
2. Cleanup Makefiles for ncgen to remove unused code
3. Added a program, ncgen/ncdumpchunks, to print
   the data for a .nc file on a per-chunk format.
4. Made the XGetOpt change in PR https://github.com/Unidata/netcdf-c/pull/1694
   for ncdump/ncvalidator
2020-05-14 11:20:46 -06:00

72 lines
2.7 KiB
C

#ifndef NCGEN_UTIL_H
#define NCGEN_UTIL_H
/*********************************************************************
* Copyright 2018, UCAR/Unidata
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
* $Header: /upc/share/CVS/netcdf-3/ncgen/util.h,v 1.3 2010/04/04 19:39:57 dmh Exp $
*********************************************************************/
#define MAX(x,y) ((x)>(y)?(x):(y))
extern void expe2d(char*);
extern int pow2(int);
extern void tztrim(char*);
extern unsigned int chartohex(char c);
extern void reclaimvardata(List*);
extern void reclaimattptrs(void*, long);
extern void cleanup(void);
extern char* fullname(Symbol*);
extern int isunlimited0(Dimset*);
extern int hasunlimited(Dimset* dimset);
extern int classicunlimited(Dimset* dimset);
extern int isbounded(Dimset* dimset);
extern char* nctypename(nc_type);
extern char* ncclassname(nc_class);
extern int ncsize(nc_type);
extern nc_type signedtype(nc_type nctype);
extern nc_type unsignedtype(nc_type nctype);
/* We have several versions of primitive testing*/
extern int isinttype(nc_type nctype); /* some kind of integer*/
extern int isuinttype(nc_type nctype); /* some kind of integer*/
extern int isfloattype(nc_type nctype); /* some kind of float*/
extern int isclassicprim(nc_type); /* a classic primitive type*/
extern int isclassicprimplus(nc_type); /* classic + String*/
extern int isprim(nc_type); /* a netcdf4 primitive type*/
extern int isprimplus(nc_type); /* a netcdf4 primitive type + OPAQUE + ENUM*/
extern void collectpath(Symbol* grp, List* grpstack);
extern List* prefixdup(List*);
extern int prefixeq(List*,List*);
#define prefixlen(sequence) (listlength(sequence))
extern char* poolalloc(size_t);
extern char* pooldup(const char*);
extern char* poolcat(const char* s1, const char* s2);
/* compute the total n-dimensional size as 1 long array;
if stop == 0, then stop = dimset->ndims.
*/
extern size_t crossproduct(Dimset* dimset, int start, int stop);
extern int findunlimited(Dimset* dimset, int start);
extern int findlastunlimited(Dimset* dimset);
extern int countunlimited(Dimset* dimset);
extern unsigned char* makebytestring(char* s, size_t* lenp);
extern int getpadding(int offset, int alignment);
extern void check_err(const int stat, const int line, const char* file, const char* func);
extern void check_err2(const int stat, const int cdlline, const int line, const char* file, const char* func);
extern const char* kind_string(int kind);
extern int getrootid(int grpid);
/* Inline functions */
#define isunlimited(dimset,i) ((dimset)->dimsyms[i]->dim.isunlimited)
#define declsizefor(dimset,i) ((dimset)->dimsyms[i]->dim.declsize)
#define rankfor(dimset) ((dimset)->ndims)
#endif /*NCGEN_UTIL_H*/