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