+parse_field_path(GPtrArray* fp, LttvSimpleExpression* se) {
+
+ GString* f = NULL;
+// g_print("fp->len:%i\n",fp->len);
+// int i;
+// for(i=0;i<fp->len;i++) {
+// GString* f2 = g_ptr_array_index(fp,i);
+// g_print("%i=%s",i,f2->str);
+// }
+
+ if(fp->len < 2) return FALSE;
+ g_assert(f=g_ptr_array_remove_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
+ */
+ g_string_free(f,TRUE);
+ f=g_ptr_array_remove_index(fp,0);
+ if(!g_strcasecmp(f->str,"name")) {
+ se->field = LTTV_FILTER_TRACE_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
+ */
+ g_string_free(f,TRUE);
+ f=g_ptr_array_remove_index(fp,0);
+ if(!g_strcasecmp(f->str,"name")) {
+ se->field = LTTV_FILTER_TRACEFILE_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
+ */
+ g_string_free(f,TRUE);
+ f=g_ptr_array_remove_index(fp,0);
+ if(!g_strcasecmp(f->str,"pid") ) {
+ se->field = LTTV_FILTER_STATE_PID;
+ }
+ else if(!g_strcasecmp(f->str,"ppid") ) {
+ se->field = LTTV_FILTER_STATE_PPID;
+ }
+ else if(!g_strcasecmp(f->str,"creation_time") ) {
+ se->field = LTTV_FILTER_STATE_CT;
+ }
+ else if(!g_strcasecmp(f->str,"insertion_time") ) {
+ se->field = LTTV_FILTER_STATE_IT;
+ }
+ else if(!g_strcasecmp(f->str,"process_name") ) {
+ se->field = LTTV_FILTER_STATE_P_NAME;
+ }
+ else if(!g_strcasecmp(f->str,"execution_mode") ) {
+ se->field = LTTV_FILTER_STATE_EX_MODE;
+ }
+ else if(!g_strcasecmp(f->str,"execution_submode") ) {
+ se->field = LTTV_FILTER_STATE_EX_SUBMODE;
+ }
+ else if(!g_strcasecmp(f->str,"process_status") ) {
+ se->field = LTTV_FILTER_STATE_P_STATUS;
+ }
+ else if(!g_strcasecmp(f->str,"cpu") ) {
+ se->field = LTTV_FILTER_STATE_CPU;
+ }
+// else return FALSE;
+ } else if(!g_strcasecmp(f->str,"event") ) {
+ /*
+ * Possible values:
+ * event.name
+ * event.category
+ * event.time
+ * event.tsc
+ */
+ g_string_free(f,TRUE);
+ f=g_ptr_array_remove_index(fp,0);
+ if(!g_strcasecmp(f->str,"name") ) {
+ se->field = LTTV_FILTER_EVENT_NAME;
+ }
+ else if(!g_strcasecmp(f->str,"category") ) {
+ /*
+ * FIXME: Category not yet functional in lttv
+ */
+ se->field = LTTV_FILTER_EVENT_CATEGORY;
+ }
+ else if(!g_strcasecmp(f->str,"time") ) {
+ se->field = LTTV_FILTER_EVENT_TIME;
+ // offset = &((LttEvent*)NULL)->event_time);
+ }
+ else if(!g_strcasecmp(f->str,"tsc") ) {
+ se->field = LTTV_FILTER_EVENT_TSC;
+ // offset = &((LttEvent*)NULL)->event_cycle_count);
+ }
+ else { /* core.xml specified options */
+ se->field = LTTV_FILTER_EVENT_FIELD;
+ //se->offset = (...);
+ }
+ } else {
+ g_warning("Unrecognized field in filter string");
+// return FALSE;
+ }
+
+ g_string_free(f,TRUE);
+ g_assert(fp->len == 0);
+
+ if(se->field == LTTV_FILTER_UNDEFINED) return FALSE;
+ return TRUE;
+}
+
+/**
+ * Sets the function pointer for the current
+ * Simple Expression
+ * @param se current simple expression
+ * @return success/failure of operation
+ */
+gboolean assign_operator(LttvSimpleExpression* se, LttvExpressionOp op) {
+
+// g_print("se->field = %i\n",se->field);
+// g_print("se->offset = %i\n",se->offset);
+// g_print("se->op = %p\n",se->op);
+// g_print("se->value = %s\n",se->value);
+
+ switch(se->field) {
+ /* char */
+ case LTTV_FILTER_TRACE_NAME:
+ case LTTV_FILTER_TRACEFILE_NAME:
+ case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_EVENT_NAME:
+ switch(op) {
+ case LTTV_FIELD_EQ:
+ se->op = lttv_apply_op_eq_string;
+ break;
+ case LTTV_FIELD_NE:
+ se->op = lttv_apply_op_eq_string;
+ break;
+ default:
+ g_warning("Error encountered in operator assignment = or != expected");
+ return FALSE;
+ }
+ break;
+ case LTTV_FILTER_STATE_PID:
+ case LTTV_FILTER_STATE_PPID:
+ case LTTV_FILTER_STATE_EX_MODE:
+ case LTTV_FILTER_STATE_EX_SUBMODE:
+ case LTTV_FILTER_STATE_P_STATUS:
+ switch(op) {
+ case LTTV_FIELD_EQ:
+ se->op = lttv_apply_op_eq_uint64;
+ break;
+ case LTTV_FIELD_NE:
+ se->op = lttv_apply_op_ne_uint64;
+ break;
+ case LTTV_FIELD_LT:
+ se->op = lttv_apply_op_lt_uint64;
+ break;
+ case LTTV_FIELD_LE:
+ se->op = lttv_apply_op_le_uint64;
+ break;
+ case LTTV_FIELD_GT:
+ se->op = lttv_apply_op_gt_uint64;
+ break;
+ case LTTV_FIELD_GE:
+ se->op = lttv_apply_op_ge_uint64;
+ break;
+ default:
+ g_warning("Error encountered in operator assignment");
+ return FALSE;
+ }
+ break;
+ case LTTV_FILTER_STATE_CT:
+ case LTTV_FILTER_STATE_IT:
+ case LTTV_FILTER_EVENT_TIME:
+ case LTTV_FILTER_EVENT_TSC:
+ switch(op) {
+ case LTTV_FIELD_EQ:
+ se->op = lttv_apply_op_eq_double;
+ break;
+ case LTTV_FIELD_NE:
+ se->op = lttv_apply_op_ne_double;
+ break;
+ case LTTV_FIELD_LT:
+ se->op = lttv_apply_op_lt_double;
+ break;
+ case LTTV_FIELD_LE:
+ se->op = lttv_apply_op_le_double;
+ break;
+ case LTTV_FIELD_GT:
+ se->op = lttv_apply_op_gt_double;
+ break;
+ case LTTV_FIELD_GE:
+ se->op = lttv_apply_op_ge_double;
+ break;
+ default:
+ g_warning("Error encountered in operator assignment");
+ return FALSE;
+ }
+ break;
+ default:
+ g_warning("Error encountered in operator assignment ! Bad field type ...");
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+/**
+ * Finds the structure type depending
+ * on the fields in parameters
+ * @params ft Field of the current structure
+ * @return LttvStructType enum or -1 for error
+ */
+gint
+lttv_struct_type(gint ft) {
+
+ switch(ft) {
+ case LTTV_FILTER_TRACE_NAME:
+ return LTTV_FILTER_TRACE;
+ break;
+ case LTTV_FILTER_TRACEFILE_NAME:
+ return LTTV_FILTER_TRACEFILE;
+ break;
+ case LTTV_FILTER_STATE_PID:
+ case LTTV_FILTER_STATE_PPID:
+ case LTTV_FILTER_STATE_CT:
+ case LTTV_FILTER_STATE_IT:
+ case LTTV_FILTER_STATE_P_NAME:
+ case LTTV_FILTER_STATE_EX_MODE:
+ case LTTV_FILTER_STATE_EX_SUBMODE:
+ case LTTV_FILTER_STATE_P_STATUS:
+ case LTTV_FILTER_STATE_CPU:
+ return LTTV_FILTER_STATE;
+ break;
+ case LTTV_FILTER_EVENT_NAME:
+ case LTTV_FILTER_EVENT_CATEGORY:
+ case LTTV_FILTER_EVENT_TIME:
+ case LTTV_FILTER_EVENT_TSC:
+ case LTTV_FILTER_EVENT_FIELD:
+ return LTTV_FILTER_EVENT;
+ break;
+ default:
+ return -1;
+ }
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r == l);
+
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r == l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint16* r = (guint16*) v1;
+ guint16 l = atoi(v2);
+ return (*r == l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ double* r = (double*) v1;
+ double l = atof(v2);
+ return (*r == l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ char* r = (char*) v1;
+ return (!g_strcasecmp(r,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(gpointer v1, char* v2) {
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r != l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r != l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint16* r = (guint16*) v1;
+ guint16 l = atoi(v2);
+ return (*r != l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ double* r = (double*) v1;
+ double l = atof(v2);
+ return (*r != l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ char* r = (char*) v1;
+ return (g_strcasecmp(r,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(gpointer v1, char* v2) {
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r < l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r < l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint16* r = (guint16*) v1;
+ guint16 l = atoi(v2);
+ return (*r < l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ double* r = (double*) v1;
+ double l = atof(v2);
+ return (*r < l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r <= l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r <= l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint16* r = (guint16*) v1;
+ guint16 l = atoi(v2);
+ return (*r <= l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ double* r = (double*) v1;
+ double l = atof(v2);
+ return (*r <= l);
+}
+
+/**
+ * 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_uint64(gpointer v1, char* v2) {
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r > l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r > l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint16* r = (guint16*) v1;
+ guint16 l = atoi(v2);
+ return (*r > l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ double* r = (double*) v1;
+ double l = atof(v2);
+ return (*r > l);
+}
+
+/**
+ * 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_uint64(gpointer v1, char* v2) {
+ guint64* r = (guint64*) v1;
+ guint64 l = atoi(v2);
+ return (*r >= l);
+}
+
+/**
+ * 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(gpointer v1, char* v2) {
+ guint32* r = (guint32*) v1;
+ guint32 l = atoi(v2);
+ return (*r >= l);
+}