2010-06-03 21:24:43 +08:00
|
|
|
/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
|
|
|
|
See the COPYRIGHT file for more information. */
|
|
|
|
|
|
|
|
#ifndef OCNODE_H
|
|
|
|
#define OCNODE_H
|
|
|
|
|
|
|
|
/*! Specifies the Diminfo. */
|
|
|
|
/* Track info purely about declared dimensions.
|
|
|
|
More information is included in the Dimdata structure (dim.h)
|
|
|
|
*/
|
|
|
|
typedef struct OCdiminfo {
|
|
|
|
struct OCnode* array; /* defining array node (if known)*/
|
|
|
|
unsigned int arrayindex;/* rank position ofthis dimension in the array*/
|
2012-01-30 02:56:29 +08:00
|
|
|
ocindex_t declsize; /* from DDS*/
|
2010-06-03 21:24:43 +08:00
|
|
|
} OCdiminfo;
|
|
|
|
|
|
|
|
/*! Specifies the Arrayinfo.*/
|
|
|
|
typedef struct OCarrayinfo {
|
|
|
|
/* The complete set of dimension info applicable to this node*/
|
|
|
|
OClist* dimensions;
|
|
|
|
/* convenience (because they are computed so often*/
|
|
|
|
unsigned int rank; /* == |dimensions|*/
|
|
|
|
} OCarrayinfo;
|
|
|
|
|
2012-01-30 02:56:29 +08:00
|
|
|
/*! Specifies Attribute info */
|
2010-06-03 21:24:43 +08:00
|
|
|
typedef struct OCattribute {
|
|
|
|
char* name;
|
|
|
|
OCtype etype; /* type of the attribute */
|
|
|
|
size_t nvalues;
|
|
|
|
char** values; /* |values| = nvalues*sizeof(char**)*/
|
|
|
|
} OCattribute;
|
|
|
|
|
|
|
|
/*! Specifies the Attinfo.*/
|
|
|
|
/* This is the form as it comes out of the DAS parser*/
|
|
|
|
typedef struct OCattinfo {
|
|
|
|
int isglobal; /* is this supposed to be a global attribute set?*/
|
|
|
|
OClist* values; /* oclist<char*>*/
|
|
|
|
} OCattinfo;
|
|
|
|
|
|
|
|
/*! Specifies the OCnode. */
|
|
|
|
typedef struct OCnode {
|
|
|
|
unsigned int magic;
|
|
|
|
OCtype octype;
|
|
|
|
OCtype etype; /* essentially the dap type from the dds*/
|
|
|
|
char* name;
|
|
|
|
char* fullname;
|
|
|
|
struct OCnode* container; /* this node is subnode of container */
|
|
|
|
struct OCnode* root; /* root node of tree containing this node */
|
|
|
|
struct OCtree* tree; /* !NULL iff this is a root node */
|
|
|
|
struct OCnode* datadds; /* correlated datadds node, if any */
|
|
|
|
OCdiminfo dim; /* octype == OC_Dimension*/
|
|
|
|
OCarrayinfo array; /* octype == {OC_Structure, OC_Primitive}*/
|
|
|
|
OCattinfo att; /* octype == OC_Attribute */
|
|
|
|
/* primary edge info*/
|
|
|
|
OClist* subnodes; /*oclist<OCnode*>*/
|
|
|
|
/*int attributed;*/ /* 1 if merge was done*/
|
|
|
|
OClist* attributes; /* oclist<OCattribute*>*/
|
2012-01-30 02:56:29 +08:00
|
|
|
struct OCSKIP {/* Support fast skipping ; in following, 0 => undefined */
|
|
|
|
ocindex_t count; /* no. instances (== dimension cross product); may be indeterminate*/
|
|
|
|
ocoffset_t instancesize;/*size of single instance; may be indeterminate*/
|
|
|
|
ocoffset_t totalsize; /* usually: count*instancesize + overhead; may be indeterminate */
|
|
|
|
ocoffset_t offset; /* mostly for debugging */
|
|
|
|
} skip;
|
2012-04-23 04:34:21 +08:00
|
|
|
#ifdef OCIGNORE
|
2012-01-30 02:56:29 +08:00
|
|
|
struct {/* do simple index cache */
|
|
|
|
int cacheable; /* is this object cacheable? */
|
|
|
|
int valid; /* is this cache valid */
|
|
|
|
ocindex_t index; /* last index */
|
|
|
|
ocoffset_t offset; /* position of the last indexed instance */
|
|
|
|
} cache;
|
|
|
|
#endif
|
2010-06-03 21:24:43 +08:00
|
|
|
#ifdef OC_DAP4
|
|
|
|
OCtypeinfo typdef;
|
|
|
|
OCgroupinfo group;
|
|
|
|
#endif
|
|
|
|
} OCnode;
|
|
|
|
|
2012-01-30 02:56:29 +08:00
|
|
|
#if SIZEOF_SIZE_T == 4
|
|
|
|
#define OCINDETERMINATE ((size_t)0xffffffff)
|
|
|
|
#endif
|
|
|
|
#if SIZEOF_SIZE_T == 8
|
|
|
|
#define OCINDETERMINATE ((size_t)0xffffffffffffffff)
|
|
|
|
#endif
|
|
|
|
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif /*OCNODE_H*/
|