Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libdss/dss.h
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2002-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#pragma prototyped
21
22
/*
23
* data stream scan interface definitions
24
*/
25
26
#ifndef _DSS_H
27
#define _DSS_H 1
28
29
#define DSS_PLUGIN_VERSION AST_PLUGIN_VERSION(DSS_VERSION)
30
31
#define DSS_ID "dss"
32
#define DSS_VERSION CX_VERSION
33
34
#if __STDC__
35
#define DSSLIB(m) \
36
extern Dsslib_t dss_lib_##m; \
37
Dsslib_t* dss_lib(const char* name, Dssdisc_t* disc) { return &dss_lib_##m; } \
38
unsigned long plugin_version(void) { return DSS_PLUGIN_VERSION; }
39
#else
40
#define DSSLIB(m) \
41
extern Dsslib_t dss_lib_##m; \
42
Dsslib_t* dss_lib(name, disc) const char* name; Dssdisc_t* disc; { return &dss_lib_##m; } \
43
unsigned long plugin_version() { return DSS_PLUGIN_VERSION; }
44
#endif
45
46
#define Dssdisc_t Cxdisc_t
47
#define Dssmeth_s Cxmeth_s
48
#define Dssmeth_t Cxmeth_t
49
#define Dsslib_t Cxlib_t
50
#define Dsslocation_f Cxlocation_f
51
#define Dsstype_t Cxtype_t
52
#define Dssvalue_t Cxvalue_t
53
#define Dssvariable_t Cxvariable_t
54
55
#include <ast.h>
56
#include <cx.h>
57
#include <error.h>
58
#include <vmalloc.h>
59
60
#define DSS_DEBUG CX_DEBUG /* debug trace */
61
#define DSS_QUIET CX_QUIET /* no non-fatal messages*/
62
#define DSS_REGRESS CX_REGRESS /* regression output */
63
#define DSS_TRACE CX_TRACE /* algorithm trace */
64
#define DSS_VALIDATE CX_VALIDATE /* validate constraints */
65
#define DSS_VERBOSE CX_VERBOSE /* verbose feedback */
66
67
#define DSS_CX_FLAGS (CX_FLAGS-1)
68
69
#define DSS_APPEND (CX_FLAGS<<0) /* DSS_FILE_APPEND */
70
#define DSS_BASE (CX_FLAGS<<1) /* base method */
71
#define DSS_FORCE (CX_FLAGS<<2) /* populate all fields */
72
#define DSS_WRITE (CX_FLAGS<<3) /* {write} referenced */
73
74
#define DSS_METH_FLAGS (CX_FLAGS<<4) /* first method flag */
75
#define DSS_FLAGS (DSS_METH_FLAGS<<8) /* first caller flag */
76
77
#define DSS_FILE_READ (1<<0) /* read mode */
78
#define DSS_FILE_WRITE (1<<1) /* write mode */
79
#define DSS_FILE_APPEND (1<<2) /* append (no header) */
80
#define DSS_FILE_KEEP (1<<3) /* keep stream on close */
81
#define DSS_FILE_ERROR (1<<4) /* an error occurred */
82
83
struct Dss_s; typedef struct Dss_s Dss_t;
84
struct Dssfile_s; typedef struct Dssfile_s Dssfile_t;
85
struct Dssformat_s; typedef struct Dssformat_s Dssformat_t;
86
struct Dssoptdisc_s; typedef struct Dssoptdisc_s Dssoptdisc_t;
87
struct Dssrecord_s; typedef struct Dssrecord_s Dssrecord_t;
88
struct Dssstate_s; typedef struct Dssstate_s Dssstate_t;
89
90
typedef uint32_t Dssflags_t;
91
typedef double Dssnumber_t;
92
typedef Cxexpr_t Dssexpr_t;
93
94
struct Dssoptdisc_s /* dssopt*() optget() disc */
95
{
96
Optdisc_t optdisc; /* optget disc */
97
Dssdisc_t* disc; /* dss disc */
98
Cxheader_t* header; /* current item header */
99
};
100
101
struct Dssformat_s /* file format method */
102
{
103
_CX_NAME_HEADER_
104
int (*identf)(Dssfile_t*, void*, size_t, Dssdisc_t*);
105
int (*openf)(Dssfile_t*, Dssdisc_t*);
106
int (*readf)(Dssfile_t*, Dssrecord_t*, Dssdisc_t*);
107
int (*writef)(Dssfile_t*, Dssrecord_t*, Dssdisc_t*);
108
Sfoff_t (*seekf)(Dssfile_t*, Sfoff_t, Dssdisc_t*);
109
int (*closef)(Dssfile_t*, Dssdisc_t*);
110
Dssrecord_t* (*savef)(Dssfile_t*, Dssrecord_t*, Dssdisc_t*);
111
int (*dropf)(Dssfile_t*, Dssrecord_t*, Dssdisc_t*);
112
#ifdef _DSS_FORMAT_PRIVATE_
113
_DSS_FORMAT_PRIVATE_
114
#endif
115
};
116
117
struct Dssrecord_s /* record info */
118
{
119
Dssfile_t* file; /* file handle if not cloned */
120
void* data; /* actual data */
121
size_t size; /* total data size */
122
Dssflags_t flags; /* DSS_RECORD_* flags */
123
};
124
125
struct Dssfile_s /* typed file handle */
126
{
127
Sfoff_t offset; /* current record offset */
128
size_t count; /* current record count */
129
size_t length; /* current record length */
130
Dss_t* dss; /* dss handle */
131
Dssflags_t flags; /* DSS_FILE_* flags */
132
Sfio_t* io; /* io stream */
133
char* path; /* original path */
134
Dssformat_t* format; /* file format */
135
void* caller; /* caller defined handle */
136
Vmalloc_t* vm; /* per file vm */
137
#ifdef _DSS_FILE_PRIVATE_
138
_DSS_FILE_PRIVATE_
139
#endif
140
};
141
142
struct Dssmeth_s /* method */
143
{
144
_CX_NAME_HEADER_
145
Dssmeth_t* (*methf)(const char*, const char*, const char*, Dssdisc_t*, Dssmeth_t*);
146
int (*openf)(Dss_t*, Dssdisc_t*);
147
int (*closef)(Dss_t*, Dssdisc_t*);
148
const char* compress; /* preferred compression */
149
const char* print; /* default {print} format */
150
Cx_t* cx; /* expression handle */
151
Dt_t* formats; /* method format table */
152
#ifdef _DSS_METH_PRIVATE_
153
_DSS_METH_PRIVATE_
154
#endif
155
};
156
157
struct Dssstate_s /* global state */
158
{
159
Dss_t* dss; /* most recent dssopen() */
160
Dssmeth_t* meth; /* most recent dssmeth() */
161
Cxstate_t* cx; /* cx global state */
162
#ifdef _DSS_STATE_PRIVATE_
163
_DSS_STATE_PRIVATE_
164
#endif
165
};
166
167
struct Dss_s /* dss handle */
168
{
169
const char* id; /* interface id */
170
Dssmeth_t* meth; /* method */
171
Dssdisc_t* disc; /* discipline */
172
Vmalloc_t* vm; /* per handle vm */
173
Dssflags_t flags; /* dssopen() flags */
174
Dssflags_t test; /* dssopen() test mask */
175
Cx_t* cx; /* expression handle */
176
void* data; /* method data */
177
Dssformat_t* format; /* first input file format */
178
Dssstate_t* state; /* global state */
179
#ifdef _DSS_PRIVATE_
180
_DSS_PRIVATE_
181
#endif
182
};
183
184
#define dssinit(d,e) (memset(d,0,sizeof(*(d))),(d)->version=DSS_VERSION,(d)->errorf=(Error_f)(e),dssstate(d))
185
#define dssformat(n,d,m) ((Dssformat_t*)dtmatch((m)->formats,(char*)(n)))
186
187
#if DSS_STATIC || _BLD_STATIC || _BLD_STATIC_LINK
188
#define dssstatic(l,d) { extern Dsslib_t dss_lib_##l; dssadd(&dss_lib_##l,d); }
189
#else
190
#define dssstatic(l,d)
191
#endif
192
193
#define DSS(c) ((Dss_t*)(c)->caller)
194
#define DSSRECORD(v) ((Dssrecord_t*)(v))
195
#define DSSDATA(v) (DSSRECORD(v)->data)
196
197
#if defined(__EXPORT__)
198
#define extern __EXPORT__
199
#endif
200
201
extern Dsslib_t* dss_lib(const char*, Dssdisc_t*);
202
203
#undef extern
204
205
#if _BLD_dss && defined(__EXPORT__)
206
#define extern __EXPORT__
207
#endif
208
209
extern Dssstate_t* dssstate(Dssdisc_t*);
210
extern Dsslib_t* dsslib(const char*, Dssflags_t, Dssdisc_t*);
211
extern Dsslib_t* dssload(const char*, Dssdisc_t*);
212
extern int dssadd(Dsslib_t*, Dssdisc_t*);
213
214
extern Dssmeth_t* dssmeth(const char*, Dssdisc_t*);
215
extern Dssmeth_t* dsstags(Sfio_t*, const char*, int, Dssflags_t, Dssdisc_t*, Dssmeth_t*);
216
217
extern Sfio_t* dssfind(const char*, const char*, Dssflags_t, char*, size_t, Dssdisc_t*);
218
219
extern int dssoptinfo(Opt_t*, Sfio_t*, const char*, Optdisc_t*);
220
extern int dssoptlib(Sfio_t*, Dsslib_t*, const char*, Dssdisc_t*);
221
222
extern Dss_t* dssopen(Dssflags_t, Dssflags_t, Dssdisc_t*, Dssmeth_t*);
223
extern int dssrun(Dss_t*, const char*, const char*, const char*, char**);
224
extern int dssclose(Dss_t*);
225
226
extern Dssfile_t* dssfopen(Dss_t*, const char*, Sfio_t*, Dssflags_t, Dssformat_t*);
227
extern Dssrecord_t* dssfread(Dssfile_t*);
228
extern int dssfwrite(Dssfile_t*, Dssrecord_t*);
229
extern Sfoff_t dssftell(Dssfile_t*);
230
extern int dssfseek(Dssfile_t*, Sfoff_t);
231
extern int dssfclose(Dssfile_t*);
232
extern Dssexpr_t* dsscomp(Dss_t*, const char*, Sfio_t*);
233
extern int dssbeg(Dss_t*, Dssexpr_t*);
234
extern int dsseval(Dss_t*, Dssexpr_t*, Dssrecord_t*);
235
extern int dssend(Dss_t*, Dssexpr_t*);
236
extern int dsslist(Dss_t*, Dssexpr_t*, Sfio_t*);
237
extern int dssfree(Dss_t*, Dssexpr_t*);
238
extern ssize_t dssmagic(Dss_t*, Sfio_t*, const char*, const char*, uint32_t, size_t);
239
extern int dssprintf(Dss_t*, Cx_t*, Sfio_t*, const char*, Dssrecord_t*);
240
241
extern int dssget(Dssrecord_t*, Dssvariable_t*, Dsstype_t*, const char*, Dssvalue_t*);
242
extern Dsstype_t* dsstype(Dss_t*, const char*);
243
extern Dssvariable_t* dssvariable(Dss_t*, const char*);
244
245
extern Dssrecord_t* dsssave(Dssrecord_t*);
246
extern int dssdrop(Dssrecord_t*);
247
248
#undef extern
249
250
#endif
251
252