+LttvSimpleExpression*
+lttv_simple_expression_new() {
+
+}
+/**
+ * add a node to the current tree
+ * @param stack the tree stack
+ * @param subtree the subtree if available (pointer or NULL)
+ * @param op the logical operator that will form the node
+ */
+void
+lttv_filter_tree_add_node(GPtrArray* stack, LttvFilterTree* subtree, LttvLogicalOp op) {
+
+ LttvFilterTree* t1 = NULL;
+ LttvFilterTree* t2 = NULL;
+
+ t1 = (LttvFilterTree*)g_ptr_array_index(stack,stack->len-1);
+ while(t1->right != LTTV_TREE_IDLE) t1 = t1->r_child.t;
+ t2 = lttv_filter_tree_new();
+ t2->node = op;
+ if(subtree != NULL) {
+ t2->left = LTTV_TREE_NODE;
+ t2->l_child.t = subtree;
+ subtree = NULL;
+ t1->right = LTTV_TREE_NODE;
+ t1->r_child.t = t2;
+ } else {
+// a_simple_expression->value = a_field_component->str;
+// a_field_component = g_string_new("");
+ t2->left = LTTV_TREE_LEAF;
+// t2->l_child.leaf = a_simple_expression;
+// a_simple_expression = g_new(lttv_simple_expression,1);
+ t1->right = LTTV_TREE_NODE;
+ t1->r_child.t = t2;
+ }
+
+}
+
+/**
+ * Parse through filtering field hierarchy as specified
+ * by user. This function compares each value to
+ * predetermined quarks
+ * @param fp The field path list
+ * @return success/failure of operation
+ */
+gboolean
+parse_field_path(GPtrArray* fp, LttvSimpleExpression* se) {
+
+ GString* f = NULL;
+ if(fp->len < 2) return FALSE;
+ g_assert(f=g_ptr_array_index(fp,0)); //list_first(fp)->data;
+
+ /*
+ * Parse through the specified
+ * hardcoded fields.
+ *
+ * Take note however that the
+ * 'event' subfields might change
+ * depending on values specified
+ * in core.xml file. Hence, if
+ * none of the subfields in the
+ * array match the hardcoded
+ * subfields, it will be considered
+ * as a dynamic field
+ */
+ if(g_strcasecmp(f->str,"trace") ) {
+ /*
+ * Possible values:
+ * trace.name
+ */
+ f=g_ptr_array_index(fp,1);
+ if(g_strcasecmp(f->str,"name")) {}
+ else return FALSE;
+ } else if(g_strcasecmp(f->str,"traceset") ) {
+ /*
+ * FIXME: not yet implemented !
+ */
+ } else if(g_strcasecmp(f->str,"tracefile") ) {
+ /*
+ * Possible values:
+ * tracefile.name
+ */
+ f=g_ptr_array_index(fp,1);
+ if(g_strcasecmp(f->str,"name")) {}
+ else return FALSE;
+ } else if(g_strcasecmp(f->str,"state") ) {
+ /*
+ * Possible values:
+ * state.pid
+ * state.ppid
+ * state.creation_time
+ * state.insertion_time
+ * state.process_name
+ * state.execution_mode
+ * state.execution_submode
+ * state.process_status
+ * state.cpu
+ */
+ f=g_ptr_array_index(fp,1);
+ if(g_strcasecmp(f->str,"pid") ) {}
+ else if(g_strcasecmp(f->str,"ppid") ) {}
+ else if(g_strcasecmp(f->str,"creation_time") ) {}
+ else if(g_strcasecmp(f->str,"insertion_time") ) {}
+ else if(g_strcasecmp(f->str,"process_name") ) {}
+ else if(g_strcasecmp(f->str,"execution_mode") ) {}
+ else if(g_strcasecmp(f->str,"execution_submode") ) {}
+ else if(g_strcasecmp(f->str,"process_status") ) {}
+ else if(g_strcasecmp(f->str,"cpu") ) {}
+ else return FALSE;
+ } else if(g_strcasecmp(f->str,"event") ) {
+ f=g_ptr_array_index(fp,1);
+ if(g_strcasecmp(f->str,"name") ) {}
+ else if(g_strcasecmp(f->str,"category") ) {}
+ else if(g_strcasecmp(f->str,"time") ) {
+ // offset = &((LttEvent*)NULL)->event_time);
+ }
+ else if(g_strcasecmp(f->str,"tsc") ) {
+ // offset = &((LttEvent*)NULL)->event_cycle_count);
+ }
+ else { /* core.xml specified options */
+
+ }
+ } else {
+ g_warning("Unrecognized field in filter string");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Add an filtering option to the current tree
+ * @param expression Current expression to parse
+ * @return success/failure of operation
+ */
+gboolean
+parse_simple_expression(GString* expression) {
+
+ unsigned i;
+
+
+
+
+}
+
+/**
+ * Applies the 'equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_eq_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_eq_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_eq_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_eq_double(double v1, double v2) {}
+
+/**
+ * Applies the 'equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_eq_string(char* v1, char* v2) {}
+
+/**
+ * Applies the 'not equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ne_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'not equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ne_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'not equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ne_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'not equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ne_double(double v1, double v2) {}
+
+/**
+ * Applies the 'not equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ne_string(char* v1, char* v2) {}
+
+/**
+ * Applies the 'lower than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_lt_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'lower than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_lt_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'lower than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_lt_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'lower than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_lt_double(double v1, double v2) {}
+
+/**
+ * Applies the 'lower than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_le_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'lower or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_le_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'lower or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_le_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'lower or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_le_double(double v1, double v2) {}
+
+/**
+ * Applies the 'lower or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_gt_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'greater than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_gt_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'greater than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_gt_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'greater than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_gt_double(double v1, double v2) {}
+
+/**
+ * Applies the 'greater than' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ge_uint64(guint64 v1, guint64 v2) {}
+
+/**
+ * Applies the 'greater or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ge_uint32(guint32 v1, guint32 v2) {}
+
+/**
+ * Applies the 'greater or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ge_uint16(guint16 v1, guint16 v2) {}
+
+/**
+ * Applies the 'greater or equal' operator to the
+ * specified structure and value
+ * @param v1 left member of comparison
+ * @param v2 right member of comparison
+ * @return success/failure of operation
+ */
+gboolean lttv_apply_op_ge_double(double v1, double v2) {}
+
+