quick fix of errors in filter.c/filter.h
[lttv.git] / ltt / branches / poly / lttv / lttv / filter.c
... / ...
CommitLineData
1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2005 Michel Dagenais
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
19/*
20 consist in AND, OR and NOT nested expressions, forming a tree with
21 simple relations as leaves. The simple relations test is a field
22 in an event is equal, not equal, smaller, smaller or equal, larger, or
23 larger or equal to a specified value.
24*/
25
26/*
27 * YET TO BE ANSWERED
28 * - should all the structures and field types be associated with GQuarks
29 */
30
31#include <lttv/filter.h>
32
33/*
34 read_token
35
36 read_expression
37 ( read expr )
38 simple expr [ op expr ]
39
40 read_simple_expression
41 read_field_path [ rel value ]
42
43 read_field_path
44 read_field_component [. field path]
45
46 read_field_component
47 name [ \[ value \] ]
48
49 data struct:
50 and/or(left/right)
51 not(child)
52 op(left/right)
53 path(component...) -> field
54*/
55
56GQuark
57 LTTV_FILTER_TRACE,
58 LTTV_FILTER_TRACESET,
59 LTTV_FILTER_TRACEFILE,
60 LTTV_FILTER_STATE,
61 LTTV_FILTER_EVENT;
62
63/**
64 * Parse through filtering field hierarchy as specified
65 * by user. This function compares each value to
66 * predetermined quarks
67 * @param fp The field path list
68 * @return success/failure of operation
69 */
70gboolean
71parse_field_path(GList* fp) {
72
73 GString* f = g_list_first(fp)->data;
74
75 switch(g_quark_try_string(f->str)) {
76// case LTTV_FILTER_TRACE:
77//
78// break;
79// case LTTV_FILTER_TRACEFILE:
80//
81// break;
82// case LTTV_FILTER_TRACESET:
83//
84// break;
85// case LTTV_FILTER_STATE:
86//
87// break;
88// case LTTV_FILTER_EVENT:
89//
90// break;
91 default: /* Quark value unrecognized or equal to 0 */
92 g_warning("Unrecognized field in filter string");
93 return FALSE;
94 }
95 return TRUE;
96}
97
98/**
99 * Add an filtering option to the current tree
100 * @param expression Current expression to parse
101 * @return success/failure of operation
102 */
103gboolean
104parse_simple_expression(GString* expression) {
105
106 unsigned i;
107
108
109
110
111}
112
113/**
114 * Creates a new lttv_filter
115 * @param expression filtering options string
116 * @param t pointer to the current LttvTrace
117 * @return the current lttv_filter or NULL if error
118 */
119lttv_filter*
120lttv_filter_new(char *expression, LttvTraceState *tcs) {
121
122 g_print("filter::lttv_filter_new()\n"); /* debug */
123
124 unsigned
125 i,
126 p=0, /* parenthesis nesting value */
127 b=0; /* current breakpoint in expression string */
128
129
130 gpointer tree = NULL;
131
132 /* temporary values */
133 GString *a_field_component = g_string_new("");
134 GList *a_field_path = NULL;
135 lttv_simple_expression a_simple_expression;
136
137 /*
138 * 1. parse expression
139 * 2. construct binary tree
140 * 3. return corresponding filter
141 */
142
143 /*
144 * Binary tree memory allocation
145 * - based upon a preliminary block size
146 */
147 gulong size = (strlen(expression)/AVERAGE_EXPRESSION_LENGTH)*MAX_FACTOR;
148 tree = g_malloc(size*sizeof(lttv_filter_tree));
149
150 /*
151 * Parse entire expression and construct
152 * the binary tree. There are two steps
153 * in browsing that string
154 * 1. finding boolean ops ( &,|,^,! ) and parenthesis
155 * 2. finding simple expressions
156 * - field path ( separated by dots )
157 * - op ( >, <, =, >=, <=, !=)
158 * - value ( integer, string ... )
159 * To spare computing time, the whole
160 * string is parsed in this loop for a
161 * O(n) complexity order.
162 */
163 for(i=0;i<strlen(expression);i++) {
164 g_print("%s\n",a_field_component->str);
165 switch(expression[i]) {
166 /*
167 * logical operators
168 */
169 case '&': /* and */
170 case '|': /* or */
171 case '^': /* xor */
172 g_list_append( a_field_path, a_field_component );
173 a_field_component = g_string_new("");
174 break;
175 case '!': /* not, or not equal (math op) */
176 if(expression[i+1] == '=') { /* != */
177 a_simple_expression.op = LTTV_FIELD_NE;
178 i++;
179 } else { /* ! */
180 g_print("%s\n",a_field_component);
181 a_field_component = g_string_new("");
182 }
183 break;
184 case '(': /* start of parenthesis */
185 p++; /* incrementing parenthesis nesting value */
186 break;
187 case ')': /* end of parenthesis */
188 p--; /* decrementing parenthesis nesting value */
189 break;
190
191 /*
192 * mathematic operators
193 */
194 case '<': /* lower, lower or equal */
195 if(expression[i+1] == '=') { /* <= */
196 i++;
197 a_simple_expression.op = LTTV_FIELD_LE;
198 } else a_simple_expression.op = LTTV_FIELD_LT;
199 break;
200 case '>': /* higher, higher or equal */
201 if(expression[i+1] == '=') { /* >= */
202 i++;
203 a_simple_expression.op = LTTV_FIELD_GE;
204 } else a_simple_expression.op = LTTV_FIELD_GT;
205 break;
206 case '=': /* equal */
207 a_simple_expression.op = LTTV_FIELD_EQ;
208 break;
209 /*
210 * Field concatening caracter
211 */
212 case '.': /* dot */
213 g_list_append( a_field_path, a_field_component );
214 a_field_component = g_string_new("");
215 break;
216 default: /* concatening current string */
217 g_string_append_c(a_field_component,expression[i]);
218 }
219 }
220
221
222
223 if( p>0 ) {
224 g_warning("Wrong filtering options, the string\n\"%s\"\n\
225 is not valid due to parenthesis incorrect use",expression);
226 return NULL;
227 }
228}
229
230/**
231 * Apply the filter to a specific trace
232 * @param filter the current filter applied
233 * @param tracefile the trace to apply the filter to
234 * @return success/failure of operation
235 */
236gboolean
237lttv_filter_tracefile(lttv_filter *filter, LttTracefile *tracefile) {
238
239
240
241 /* test */
242/* int i, nb;
243 char *f_name, *e_name;
244
245 char* field = "cpu";
246
247 LttvTraceHook h;
248
249 LttEventType *et;
250
251 LttType *t;
252
253 GString *fe_name = g_string_new("");
254
255 nb = ltt_trace_eventtype_number(tcs->parent.t);
256 g_print("NB:%i\n",nb);
257 for(i = 0 ; i < nb ; i++) {
258 et = ltt_trace_eventtype_get(tcs->parent.t, i);
259 e_name = ltt_eventtype_name(et);
260 f_name = ltt_facility_name(ltt_eventtype_facility(et));
261 g_string_printf(fe_name, "%s.%s", f_name, e_name);
262 g_print("facility:%s and event:%s\n",f_name,e_name);
263 }
264 */
265}
266
267gboolean
268lttv_filter_tracestate(lttv_filter *filter, LttvTraceState *tracestate) {
269
270}
271
272/**
273 * Apply the filter to a specific event
274 * @param filter the current filter applied
275 * @param event the event to apply the filter to
276 * @return success/failure of operation
277 */
278gboolean
279lttv_filter_event(lttv_filter *filter, LttEvent *event) {
280
281}
282
283static void module_init()
284{
285 LTTV_FILTER_EVENT = g_quark_from_string("event");
286 LTTV_FILTER_TRACE = g_quark_from_string("trace");
287 LTTV_FILTER_TRACESET = g_quark_from_string("traceset");
288 LTTV_FILTER_STATE = g_quark_from_string("state");
289 LTTV_FILTER_TRACEFILE = g_quark_from_string("tracefile");
290
291}
292
293static void module_destroy()
294{
295}
296
297
298//LTTV_MODULE("filter", \
299 "", \
300 "", \
301 module_init, module_destroy)
302
303
304
This page took 0.023964 seconds and 4 git commands to generate.