1/*********************************************************************
2 *   Copyright 2009, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *********************************************************************/
5
6#ifndef DATA_H
7#define DATA_H 1
8
9#ifndef NO_STDARG
10#  include <stdarg.h>
11#else
12#  include <varargs.h>
13#endif
14
15/* nmemonic*/
16#define TOPLEVEL 1
17
18/* Forward types */
19struct Datalist;
20struct Symbol;
21struct Dimset;
22typedef struct Generator Generator;
23
24/* any one possible value*/
25typedef union Constvalue {
26    struct Datalistcompoundv; /* NC_COMPOUND*/
27    char charv;                 /* NC_CHAR*/
28    signed char int8v;          /* NC_BYTE*/
29    unsigned char uint8v;       /* NC_UBYTE*/
30    short int16v;               /* NC_SHORT*/
31    unsigned short uint16v;     /* NC_USHORT*/
32    int int32v;                 /* NC_INT*/
33    unsigned int uint32v;       /* NC_UINT*/
34    long long int64v;           /* NC_INT64*/
35    unsigned long long uint64v; /* NC_UINT64*/
36    float floatv;               /* NC_FLOAT*/
37    double doublev;             /* NC_DOUBLE*/
38    struct Stringv { /* NC_STRING*/
39 int len;
40 char* stringv;
41    } stringv;
42    struct Opaquev {     /* NC_OPAQUE*/
43 int len; /* length as originally written (rounded to even number)*/
44 char* stringv; /*as  constant was written*/
45       /* (padded to even # chars >= 16)*/
46       /* without leading 0x*/
47    } opaquev;
48    struct Symbolenumv;   /* NC_ECONST*/
49Constvalue;
50
51typedef struct NCConstant {
52    nc_type    nctype; /* NC_INT,... */
53    int   lineno;
54    Constvalue    value;
55    int           filled; /* was this originally NC_FILLVALUE? */
56NCConstant;
57
58typedef struct Datalist {
59    struct Datalistnext; /* chain of all known datalists*/
60    int           readonly; /* data field is shared with another Datalist*/
61    size_t  length; /* |data| */
62    size_t  alloc;  /* track total allocated space for data field*/
63    NCConstant*     data; /* actual list of constants constituting the datalist*/
64    /* Track various values associated with the datalist*/
65    /* (used to be in Constvalue.compoundv)*/
66    struct Vlen {
67        struct Symbolschema; /* type/var that defines structure of this*/
68        unsigned int count; /* # of vlen basetype instances*/
69 unsigned int uid;       /* unique id for NC_VLEN*/
70    } vlen;
71Datalist;
72
73/* Define a structure to track
74   location of current read point in the Datalist sequence
75   In effect, we are parsing the data sequence.
76   Push and pop of data sources is supported (see srcpush() below).*/
77typedef struct Datasrc {
78    NCConstant*    data;     /* duplicate pointer; so do not free.*/
79    int index;
80    int length;
81    int spliced;           /* Was this list spliced into our parent ? */
82    struct Datasrcprev; /* linked list for debugging */
83Datasrc;
84
85/* Define a holder for passing a start/count array */
86struct Vlendata {
87    char* data;
88    unsigned long count;
89};
90extern struct Vlendatavlendata;
91extern Datalistalldatalists;
92
93/* from: data.c */
94extern Datalistbuilddatalist(int initialize);
95extern void dlfree(Datalist **dlist);
96extern void dlappend(Datalist*, NCConstant*);
97extern NCConstant builddatasublist(Datalistdl);
98extern void dlextend(Datalistdl);
99extern void dlsetalloc(Datalistdl, size_t newalloc);
100
101int       datalistline(Datalist*);
102#define   datalistith(dl,i) ((dl)==NULL?NULL:((i) >= (dl)->length?NULL:&(dl)->data[i]))
103#define   datalistlen(dl) ((dl)==NULL?0:(dl)->length)
104
105Datasrcdatalist2src(Datalistlist);
106Datasrcconst2src(NCConstant*);
107NCConstant list2const(Datalist*);
108Datalistconst2list(NCConstantcon);
109void freedatasrc(Datasrcsrc);
110
111int issublist(Datasrcsrc);
112int isstring(Datasrcsrc);
113int isfillvalue(Datasrcsrc);
114int istype(Datasrcsrcnc_type);
115int isstringable(nc_type nctype);
116
117void srcpush(Datasrc*);
118void srcpushlist(DatasrcsrcDatalistcmpd);
119void srcpop(Datasrc*);
120void srcsetfill(DatasrcdsDatalistlist);
121
122NCConstantsrcnext(Datasrc*);
123int srcmore(Datasrc*);
124int srcline(Datasrcds);
125void srcreset(Datasrcds);
126#define srclen(s) ((s)==NULL?0:(s)->length)
127
128#define islistconst(con) ((con)!=NULL && (con)->nctype == NC_COMPOUND)
129#define isfillconst(con) ((con)!=NULL && (con)->nctype == NC_FILLVALUE)
130#define constline(con) (con==NULL?0:(con)->lineno)
131#define consttype(con) (con==NULL?NC_NAT:(con)->nctype)
132
133#define isnilconst(con) ((con)!=NULL && (con)->nctype == NC_NIL)
134#define   compoundfor(con) ((con)==NULL?NULL:(con)->value.compoundv)
135
136NCConstantemptystringconst(int,NCConstant*);
137
138NCConstant cloneconstant(NCConstantcon); /* shallow clone*/
139
140void alignbuffer(struct NCConstantprimBytebufferbuf);
141
142/* Code dump support procedures */
143void bbindent(Bytebuffer*,const int);
144void bbprintf(Bytebuffer*,const char *fmt, ...); /* append */
145void bbprintf0(Bytebuffer*,const char *fmt, ...); /* clear, then append*/
146/* Following dump to codebuffer */
147void codeprintf(const char *fmt, ...);
148void codedump(Bytebuffer*);
149void codepartial(const char*);
150void codeline(const char*);
151void codelined(int n,const char*);
152void codeflush(void); /* flush codebuffer to stdout */
153
154void commify(Bytebufferbuf);
155char* word(char* pBytebufferbuf);
156
157/* Provide buffers for language based generators */
158extern Bytebuffercodebuffer; /* buffer over the std output */
159extern Bytebufferstmt; /* single stmt text generation */
160
161#ifdef FASTDATASRC
162#define srcpeek(ds) ((ds)==NULL || (ds)->index >= (ds)->max?NULL:(ds)->data+(ds)->index)
163#else
164NCConstantsrcpeek(Datasrc*);
165#endif
166
167/* Aliases */
168#define srcincr(srcsrcnext(src)
169#define srcget(srcsrcpeek(src)
170
171extern NCConstant nullconstant;
172extern NCConstant fillconstant;
173extern NCConstant nilconstant;
174
175/* From genchar.c */
176void gen_charattr(Datalist*, Bytebuffer*);
177void gen_charvlen(Datalist*, Bytebuffer*);
178void gen_chararray(struct Dimset*, int, Datalist*, Bytebuffer*, Datalistfillsrc);
179
180typedef enum ListClass {
181    LISTDATALISTATTRLISTVLENLISTCOMPOUNDLISTFIELDARRAY
182ListClass;
183
184struct Generator {
185    void* globalstate; /* per-generator; per list state is in the method args where needed */
186    int (*charconstant)(Generator*,struct Symbol*,Bytebuffer*,...);
187    int (*constant)(Generator*,struct Symbol*,NCConstant*,Bytebuffer*,...);
188    int (*listbegin)(Generator*,struct Symbol*,void*,ListClass,size_t,Bytebuffer*,int*,...);
189    int (*list)(Generator*,struct Symbol*,void*,ListClass,int,size_t,Bytebuffer*,...);
190    int (*listend)(Generator*,struct Symbol*,void*,ListClass,int,size_t,Bytebuffer*,...);
191    int (*vlendecl)(Generator*,struct Symbol*,Bytebuffer*,int,size_t,...);
192    int (*vlenstring)(Generator*,struct Symbol*,Bytebuffer*,int*,size_t*,...);
193};
194
195extern int generator_getstate(Generator*,void**);
196extern int generator_reset(Generator*,void*);
197
198typedef int (*Writer)(Generator*,struct Symbol*,Bytebuffer*,int,const size_t*,const size_t*);
199
200extern void generate_attrdata(struct Symbol*, Generator*, Writer writerBytebuffer*);
201extern void generate_vardata(struct Symbol*, Generator*, Writer writer,Bytebuffer*);
202extern void generate_basetype(struct Symbol*,NCConstant*,Bytebuffer*,Datalist*,Generator*);
203
204
205#endif /*DATA_H*/
206


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