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 <gsf@research.att.com>                  *
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