1/*********************************************************************
2 *   Copyright 2011, University Corporation for Atmospheric Research
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *
5 *   Stuff that's common to both ncdump and nccopy
6 *
7 *********************************************************************/
8
9#include "config.h"
10
11#define STREQ(ab) (*(a) == *(b) && strcmp((a), (b)) == 0)
12
13/* Delimiter for separating netCDF groups in absolute pathnames, same as for HDF5 */
14#define NC_GRP_DELIM '/'
15
16typedef int bool_t;
17enum {false=0, true=1};
18
19struct safebuf_t;
20/* Buffer structure for implementing growable strings, used in
21 * preventing buffer overflows when the size needed for a character
22 * buffer cannot be easily predicted or limited to any specific
23 * maximum, such as when used in recursive function calls for nested
24 * vlens and nested compound types. */
25typedef struct safebuf_t {
26    size_t len; /* current length of buffer */
27    size_t cl; /* current length of string in buffer, < len-1 */
28    char *buf;
29safebuf_t;
30
31/* structure for list of ids, such as varids or grpids specified with -v or -g option */
32typedef struct idnode {
33    struct idnodenext;
34    int id;
35idnode_t;
36
37/* node in stack of group ids */
38typedef struct grpnode {
39    int grpid;
40    struct grpnode *next;
41grpnode_t;
42
43/*
44 * The opaque structure to hold state of iteration over groups.
45 * (Just implemented as a stack of group ids.)
46 */
47typedef struct {
48    int ngrps; /* number of groups left to visit */
49    grpnode_t *top; /* group ids left to visit */
50ncgiter_t;
51
52extern char *progname; /* for error messages */
53
54#ifndef NO_NETCDF_2
55#define NO_NETCDF_2 /* assert we aren't using any netcdf-2 stuff */
56#endif
57
58#ifdef __cplusplus
59extern "C" {
60#endif
61
62#define NC_CHECK(fncall) {int statnc=fncall;if(statnc!=NC_NOERR)check(statnc,__FILE__,__LINE__);}
63
64/* Print error message to stderr and exit */
65extern void error ( const char *fmt, ... );
66
67/* Check error on malloc and exit with message if out of memory */
68extern void*    emalloc ( size_t size );
69
70/* Check error return.  If bad, print error message and exit. */
71extern void check(int err, const char* file, const int line);
72
73/* Return malloced name with chars special to CDL escaped. */
74char* escaped_name(const char* cp);
75
76/* Print name of netCDF var, dim, att, group, type, member, or enum
77 * symbol with escaped special chars */
78void print_name(const char *name);
79
80/* Get dimid from a full dimension path name that may include group
81 * names */
82extern int  nc_inq_dimid2(int ncid, const char *dimname, int *dimidp);
83
84/* Test if variable is a record variable */
85extern int  isrecvar ( int ncid, int varid );
86
87/* Get a new, empty id list. */
88extern idnode_tnewidlist(void);
89
90/* Add id to id list  */
91extern void idadd(idnode_tidlist, int id);
92
93/* Test if id is in id list */
94extern bool_t idmember ( const idnode_tidlist, int id );
95
96/* Test if a group id is in group list */
97extern bool_t group_wanted ( int grpid, int nlgrps, const idnode_tgrpids );
98
99/* Check group list for missing groups */
100extern int grp_matches(int ncid, int nlgrps, char** lgrpsidnode_t *grpids);
101
102/* Returns 1 if string s1 ends with string s2, 0 otherwise. */
103extern int strendswith(const char *s1, const char *s2);
104
105/* Within group with id ncid, get varid of variable with name varname
106 * using nested group syntax "gp1/gp2/var" */
107extern int nc_inq_gvarid ( int ncid, const char *varname, int *varidp );
108
109/* Get variable id varid within group grpid using absolute or relative pathname for variable */
110    extern int nc_inq_gvarid(int grpid, const char *varname, int *varidp);
111
112/* Return how many variables are named varname in any groups in ncid */
113extern size_t nc_inq_varname_count(int ncid, char *varname);
114
115/* Check if any variable names specified in the list lvars (of length nlvars) are missing. */
116extern int missing_vars(int ncid, int nlvars, char **lvars);
117
118/* Make list of variables from comma-delimited string */
119extern void make_lvars(char *optarg, int *nlvarsp, char ***lvarsp);
120
121/* Make list of groups from comma-delimited string */
122extern void make_lgrps(char *optarg, int *nlgrpsp, char*** lgrpspidnode_t **grpidsp);
123
124/* Release an id list */
125extern void freeidlist(idnode_t *idlist);
126
127/*
128 * Simplest interface for group iteration: get total number of groups
129 * (including all descendant groups, recursively) and all group ids
130 * for start group and its descendants, in preorder.  Note that this
131 * loses information about subgroup relationships, just flattening all
132 * groups into a serial list.
133 */
134extern int nc_inq_grps_full(int ncid, int *numgrps, int *ncids);
135
136/*
137 * More complex iterator interface: get group iterator for start group
138 * ncid and all its descendant groups.
139 */
140extern int nc_get_giter(int ncidncgiter_t **iterp);
141
142/*
143 * Get group id of next group.  On first call returns start group,
144 * subsequently returns other subgroup ids in preorder.  Returns grpid
145 * of 0 (never an actual group number) when no more groups.
146 */
147extern int nc_next_giter(ncgiter_t *iterp, int *grpid);
148
149/*
150 * Release memory allocated for group iterator.
151 */
152extern void nc_free_giter(ncgiter_t *iterp);
153extern int getrootid(int grpid);
154
155#ifdef __cplusplus
156}
157#endif


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed