Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/dsslib/tests/test.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2003-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
#include <dsslib.h>
23
24
typedef struct State_s
25
{
26
Cxunsigned_t selected;
27
} State_t;
28
29
extern Dsslib_t dss_lib_test;
30
31
static const char even_usage[] =
32
"[+PLUGIN?\findex\f]"
33
"[+DESCRIPTION?The \beven\b test query selects even ordinal records.]"
34
"\n"
35
"\n[ file ... ]\n"
36
"\n"
37
;
38
39
static int
40
even_beg(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
41
{
42
State_t* state;
43
char* s;
44
int errors;
45
46
errors = error_info.errors;
47
if (!(state = vmnewof(cx->vm, 0, State_t, 1, 0)))
48
{
49
if (disc->errorf)
50
(*disc->errorf)(NiL, disc, ERROR_SYSTEM|2, "out of space");
51
return -1;
52
}
53
expr->data = state;
54
sfprintf(cx->buf, "%s%s", strchr(dss_lib_test.description, '['), even_usage);
55
s = sfstruse(cx->buf);
56
for (;;)
57
{
58
switch (optget((char**)data, s))
59
{
60
case '?':
61
if (disc->errorf)
62
(*disc->errorf)(NiL, disc, ERROR_USAGE|4, "%s", opt_info.arg);
63
else
64
return -1;
65
continue;
66
case ':':
67
if (disc->errorf)
68
(*disc->errorf)(NiL, disc, 2, "%s", opt_info.arg);
69
else
70
return -1;
71
continue;
72
}
73
break;
74
}
75
if (error_info.errors > errors)
76
return -1;
77
sfprintf(sfstdout, "even_beg\n");
78
return 0;
79
}
80
81
static int
82
even_sel(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
83
{
84
State_t* state = (State_t*)expr->data;
85
86
if (!(expr->queried & 1))
87
{
88
state->selected++;
89
sfprintf(sfstdout, "even_sel %I*u\n", sizeof(expr->queried), expr->queried);
90
return 1;
91
}
92
return 0;
93
}
94
95
static int
96
even_act(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
97
{
98
sfprintf(sfstdout, "even_act %I*u\n", sizeof(expr->queried), expr->queried);
99
return 0;
100
}
101
102
static int
103
even_end(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
104
{
105
State_t* state = (State_t*)expr->data;
106
107
sfprintf(sfstdout, "even_end %I*u %I*u %I*u%s\n", sizeof(expr->queried), expr->queried, sizeof(expr->selected), expr->selected, sizeof(state->selected), state->selected, expr->selected == state->selected ? "" : " FAILED");
108
return 0;
109
}
110
111
static const char odd_usage[] =
112
"[+PLUGIN?\findex\f]"
113
"[+DESCRIPTION?The \bodd\b test query selects odd ordinal records.]"
114
"\n"
115
"\n[ file ... ]\n"
116
"\n"
117
;
118
119
static int
120
odd_beg(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
121
{
122
State_t* state;
123
char* s;
124
int errors;
125
126
errors = error_info.errors;
127
if (!(state = vmnewof(cx->vm, 0, State_t, 1, 0)))
128
{
129
if (disc->errorf)
130
(*disc->errorf)(NiL, disc, ERROR_SYSTEM|2, "out of space");
131
return -1;
132
}
133
expr->data = state;
134
sfprintf(cx->buf, "%s%s", strchr(dss_lib_test.description, '['), odd_usage);
135
s = sfstruse(cx->buf);
136
for (;;)
137
{
138
switch (optget((char**)data, s))
139
{
140
case '?':
141
if (disc->errorf)
142
(*disc->errorf)(NiL, disc, ERROR_USAGE|4, "%s", opt_info.arg);
143
else
144
return -1;
145
continue;
146
case ':':
147
if (disc->errorf)
148
(*disc->errorf)(NiL, disc, 2, "%s", opt_info.arg);
149
else
150
return -1;
151
continue;
152
}
153
break;
154
}
155
if (error_info.errors > errors)
156
return -1;
157
sfprintf(sfstdout, "odd_beg\n");
158
return 0;
159
}
160
161
static int
162
odd_sel(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
163
{
164
State_t* state = (State_t*)expr->data;
165
166
if (expr->queried & 1)
167
{
168
state->selected++;
169
sfprintf(sfstdout, "odd_sel %I*u\n", sizeof(expr->queried), expr->queried);
170
return 1;
171
}
172
return 0;
173
}
174
175
static int
176
odd_act(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
177
{
178
sfprintf(sfstdout, "odd_act %I*u\n", sizeof(expr->queried), expr->queried);
179
return 0;
180
}
181
182
static int
183
odd_end(Cx_t* cx, Cxexpr_t* expr, void* data, Cxdisc_t* disc)
184
{
185
State_t* state = (State_t*)expr->data;
186
187
sfprintf(sfstdout, "odd_end %I*u %I*u %I*u%s\n", sizeof(expr->queried), expr->queried, sizeof(expr->selected), expr->selected, sizeof(state->selected), state->selected, expr->selected == state->selected ? "" : " FAILED");
188
return 0;
189
}
190
191
static Cxquery_t queries[] =
192
{
193
{
194
"even",
195
"select even ordinal records",
196
CXH,
197
even_beg,
198
even_sel,
199
even_act,
200
even_end,
201
},
202
{
203
"odd",
204
"select odd ordinal records",
205
CXH,
206
odd_beg,
207
odd_sel,
208
odd_act,
209
odd_end,
210
},
211
{0}
212
};
213
214
Dsslib_t dss_lib_test =
215
{
216
"test",
217
"test queries"
218
"[-1lms5P?\n@(#)$Id: dss test queries (AT&T Research) 2003-09-22 $\n]"
219
USAGE_LICENSE,
220
CXH,
221
0,
222
0,
223
0,
224
0,
225
0,
226
0,
227
&queries[0]
228
};
229
230