t2->node = op;
if(subtree != NULL) {
t2->left = LTTV_TREE_NODE;
- t2->l_child.t = (LttvFilterTree*)subtree;
+ t2->l_child.t = subtree;
subtree = NULL;
t1->right = LTTV_TREE_NODE;
t1->r_child.t = t2;
se->field = LTTV_FILTER_UNDEFINED;
se->op = NULL;
se->offset = 0;
-// se->value = NULL;
+ se->value.v_uint64 = 0;
return se;
}
*/
gboolean lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* value) {
- g_print("se->value:%s\n",value);
+// g_print("se->value:%s\n",value);
switch(se->field) {
/*
lttv_simple_expression_destroy(LttvSimpleExpression* se) {
// g_free(se->value);
+ switch(se->field) {
+ case LTTV_FILTER_TRACE_NAME:
+ case LTTV_FILTER_TRACEFILE_NAME:
+ case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_EVENT_NAME:
+ g_free(se->value.v_string);
+ break;
+ }
g_free(se);
}
*/
gboolean lttv_apply_op_eq_string(gpointer v1, LttvFieldValue v2) {
char* r = (char*) v1;
+ g_print("v1:%s = v2:%s\n",r,v2.v_string);
return (!g_strcasecmp(r,v2.v_string));
}
if(filter->expression == NULL) return FALSE;
- unsigned
+ int
i,
p_nesting=0; /* parenthesis nesting value */
* destroy it and build a new one
*/
if(filter->head != NULL) lttv_filter_tree_destroy(filter->head);
- filter->head = tree;
+ filter->head = NULL; /* will be assigned at the end */
/*
* Tree Stack
* 3. pop the tree value from the tree stack
*/
- g_print("expression: %s\n",filter->expression);
- g_print("strlen(expression): %i\n",strlen(filter->expression));
+// g_print("expression: %s\n",filter->expression);
+// g_print("strlen(expression): %i\n",strlen(filter->expression));
for(i=0;i<strlen(filter->expression);i++) {
// debug
g_print("%c ",filter->expression[i]);
case '|': /* or */
- t1 = (LttvFilter*)g_ptr_array_index(tree_stack,tree_stack->len-1);
+ t1 = (LttvFilterTree*)g_ptr_array_index(tree_stack,tree_stack->len-1);
while(t1->right != LTTV_TREE_IDLE) {
g_assert(t1->right == LTTV_TREE_NODE);
t1 = t1->r_child.t;
case '^': /* xor */
- t1 = (LttvFilter*)g_ptr_array_index(tree_stack,tree_stack->len-1);
+ t1 = (LttvFilterTree*)g_ptr_array_index(tree_stack,tree_stack->len-1);
while(t1->right != LTTV_TREE_IDLE) {
g_assert(t1->right == LTTV_TREE_NODE);
t1 = t1->r_child.t;
lttv_simple_expression_assign_operator(a_simple_expression,LTTV_FIELD_NE);
i++;
} else { /* ! */
- t1 = (LttvFilter*)g_ptr_array_index(tree_stack,tree_stack->len-1);
+ t1 = (LttvFilterTree*)g_ptr_array_index(tree_stack,tree_stack->len-1);
while(t1->right != LTTV_TREE_IDLE) {
g_assert(t1->right == LTTV_TREE_NODE);
t1 = t1->r_child.t;
//a_simple_expression->value = g_string_free(a_field_component,FALSE);
a_field_component = g_string_new("");
t1 = g_ptr_array_index(tree_stack,tree_stack->len-1);
- g_print("here\n");
while(t1->right != LTTV_TREE_IDLE) {
g_print("while right:%i %p->child:%p\n",t1->right,t1,t1->r_child.t);
g_assert(t1->right == LTTV_TREE_NODE);
g_assert(t1->r_child.t != NULL);
t1 = t1->r_child.t;
}
- g_print("here2\n");
t1->right = LTTV_TREE_LEAF;
t1->r_child.leaf = a_simple_expression;
a_simple_expression = lttv_simple_expression_new();
* in a_field_path array.
*/
/* FIXME: check for double values */
-// if(a_simple_expression->op == NULL) {
+ if(a_simple_expression->field == LTTV_FILTER_UNDEFINED) {
g_ptr_array_add( a_field_path,(gpointer) a_field_component );
a_field_component = g_string_new("");
-// }
+ }
+ break;
+ case ' ':
+ case '\n':
break;
-// case ' ':
-// case '\n':
-// ignore
default: /* concatening current string */
g_string_append_c(a_field_component,filter->expression[i]);
}
}
- g_print("subtree:%p, tree:%p, t1:%p, t2:%p\n",subtree,tree,t1,t2);
- g_print("stack size: %i\n",tree_stack->len);
+// g_print("subtree:%p, tree:%p, t1:%p, t2:%p\n",subtree,tree,t1,t2);
+// g_print("stack size: %i\n",tree_stack->len);
/*
* Preliminary check to see
g_ptr_array_free(a_field_path,TRUE);
/* free the tree stack -- but keep the root tree */
- g_ptr_array_free(tree_stack,FALSE);
-
+ // g_ptr_array_free(tree_stack,FALSE);
+ filter->head = g_ptr_array_remove_index(tree_stack,0);
+ g_ptr_array_free(tree_stack,TRUE);
+
/* free the field buffer if allocated */
if(a_field_component != NULL) g_string_free(a_field_component,TRUE);
/* free the simple expression buffer if allocated */
if(a_simple_expression != NULL) lttv_simple_expression_destroy(a_simple_expression);
- g_assert(tree != NULL); /* tree should exist */
+ g_assert(filter->head != NULL); /* tree should exist */
g_assert(subtree == NULL); /* remaining subtree should be included in main tree */
/* debug */
}
/**
- * LttvFilterTree* lttv_filter_tree_new()
+ * @fn LttvFilterTree* lttv_filter_tree_new()
*
* Assign a new tree for the current expression
* or sub expression
lttv_filter_tree_new() {
LttvFilterTree* tree;
- tree = g_new(LttvFilter,1);
+ tree = g_new(LttvFilterTree,1);
tree->node = 0; //g_new(lttv_expression,1);
tree->left = LTTV_TREE_IDLE;
tree->right = LTTV_TREE_IDLE;
-
+ tree->r_child.t = NULL;
+ tree->l_child.t = NULL;
+
return tree;
}
if(tree->right == LTTV_TREE_LEAF) lttv_simple_expression_destroy(tree->r_child.leaf);
else if(tree->right == LTTV_TREE_NODE) lttv_filter_tree_destroy(tree->r_child.t);
- g_free(tree->node);
+// g_free(tree->node);
g_free(tree);
}
/**
- * gboolean lttv_filter_tree_parse(LttvFilterTree*,LttEvent,LttTracefile,LttTrace,LttvProcessState)
+ * @fn gboolean lttv_filter_tree_parse(LttvFilterTree*,LttEvent,LttTracefile,LttTrace,LttvProcessState)
*
* Global parsing function for the current
* LttvFilterTree
case LTTV_LOGICAL_AND: return (lresult & rresult);
case LTTV_LOGICAL_NOT: return (!rresult);
case LTTV_LOGICAL_XOR: return (lresult ^ rresult);
+ case 0: return (rresult);
default:
/*
* This case should never be
}
/**
- * gboolean lttv_filter_tracefile(LttvFilter*, LttTracefile*)
+ * @fn gboolean lttv_filter_tracefile(LttvFilter*, LttTracefile*)
*
* Apply the filter to a specific trace
* @param filter the current filter applied
}
/**
- * Destroys the filter module and specific values
+ * @fn Destroys the filter module and specific values
*/
static void module_destroy()
{