add usertrace support
[lttv.git] / ltt / branches / poly / lttv / lttv / filter.c
index a614909ed7541026948a7669bf952a338257ee4c..567b54f0a797d7094f7e8a614e48fe2997848540 100644 (file)
@@ -31,6 +31,7 @@
  *  LttvTracefileContext{} 
  *  |->event\ 
  *  | |->name (String, converted to GQuark)
+ *  | |->facility (String, converted to GQuark)
  *  | |->category (String, not yet implemented)
  *  | |->time (LttTime)
  *  | |->tsc (LttCycleCount --> uint64)
 #include <sys/time.h>
 #endif
 
+#include <lttv/lttv.h>
 #include <lttv/filter.h>
 #include <ltt/trace.h>
 #include <ltt/type.h>
+#include <ltt/facility.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -207,6 +210,9 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
     if(!g_strcasecmp(f->str,"name") ) {
       se->field = LTTV_FILTER_EVENT_NAME;
     }
+    else if(!g_strcasecmp(f->str,"facility") ) {
+      se->field = LTTV_FILTER_EVENT_FACILITY;
+    }
     else if(!g_strcasecmp(f->str,"category") ) {
       /*
        * FIXME: Category not yet functional in lttv
@@ -223,6 +229,9 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
       se->field = LTTV_FILTER_EVENT_FIELD;
     }
   } else {
+    g_string_free(f,TRUE);
+    f=g_ptr_array_remove_index(fp,0);
+
     g_warning("Unrecognized field in filter string");
   }
 
@@ -259,6 +268,7 @@ lttv_simple_expression_assign_operator(LttvSimpleExpression* se, LttvExpressionO
      case LTTV_FILTER_TRACEFILE_NAME:
      case LTTV_FILTER_STATE_P_NAME:
      case LTTV_FILTER_EVENT_NAME:
+     case LTTV_FILTER_EVENT_FACILITY:
      case LTTV_FILTER_STATE_EX_MODE:
      case LTTV_FILTER_STATE_EX_SUBMODE:
      case LTTV_FILTER_STATE_P_STATUS:
@@ -418,6 +428,7 @@ lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* value) {
      case LTTV_FILTER_TRACEFILE_NAME:
      case LTTV_FILTER_STATE_P_NAME:
      case LTTV_FILTER_EVENT_NAME:
+     case LTTV_FILTER_EVENT_FACILITY:
      case LTTV_FILTER_STATE_EX_MODE:
      case LTTV_FILTER_STATE_EX_SUBMODE:
      case LTTV_FILTER_STATE_P_STATUS:
@@ -535,6 +546,7 @@ lttv_struct_type(gint ft) {
             return LTTV_FILTER_STATE;
             break;
         case LTTV_FILTER_EVENT_NAME:
+        case LTTV_FILTER_EVENT_FACILITY:
         case LTTV_FILTER_EVENT_CATEGORY:
         case LTTV_FILTER_EVENT_TIME:
         case LTTV_FILTER_EVENT_TSC:
@@ -1246,6 +1258,7 @@ lttv_filter_update(LttvFilter* filter) {
   
   /* temporary values */
   GString *a_field_component = g_string_new(""); 
+  GString *a_string_spaces = g_string_new(""); 
   GPtrArray *a_field_path = g_ptr_array_new(); 
   
   /* simple expression buffer */
@@ -1325,6 +1338,8 @@ lttv_filter_update(LttvFilter* filter) {
         } else {  /* append a simple expression */
           lttv_simple_expression_assign_value(a_simple_expression,g_string_free(a_field_component,FALSE)); 
           a_field_component = g_string_new("");
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
           t2->left = LTTV_TREE_LEAF;
           t2->l_child.leaf = a_simple_expression;
           a_simple_expression = lttv_simple_expression_new(); 
@@ -1357,6 +1372,8 @@ lttv_filter_update(LttvFilter* filter) {
        } else {    /* append a simple expression */
           lttv_simple_expression_assign_value(a_simple_expression,g_string_free(a_field_component,FALSE)); 
           a_field_component = g_string_new("");
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
           t2->left = LTTV_TREE_LEAF;
           t2->l_child.leaf = a_simple_expression;
           a_simple_expression = lttv_simple_expression_new();
@@ -1389,6 +1406,8 @@ lttv_filter_update(LttvFilter* filter) {
         } else {    /* append a simple expression */
           lttv_simple_expression_assign_value(a_simple_expression,g_string_free(a_field_component,FALSE)); 
           a_field_component = g_string_new("");
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
           t2->left = LTTV_TREE_LEAF;
           t2->l_child.leaf = a_simple_expression;
           a_simple_expression = lttv_simple_expression_new(); 
@@ -1401,6 +1420,8 @@ lttv_filter_update(LttvFilter* filter) {
           g_ptr_array_add( a_field_path,(gpointer) a_field_component );
           lttv_simple_expression_assign_field(a_field_path,a_simple_expression);
           a_field_component = g_string_new("");         
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
           lttv_simple_expression_assign_operator(a_simple_expression,LTTV_FIELD_NE);
           i++;
         } else {  /* ! */
@@ -1459,6 +1480,8 @@ lttv_filter_update(LttvFilter* filter) {
         } else {    /* assign subtree as current tree */
           lttv_simple_expression_assign_value(a_simple_expression,g_string_free(a_field_component,FALSE)); 
           a_field_component = g_string_new("");
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
           t1->right = LTTV_TREE_LEAF;
           t1->r_child.leaf = a_simple_expression;
           a_simple_expression = lttv_simple_expression_new(); 
@@ -1474,6 +1497,8 @@ lttv_filter_update(LttvFilter* filter) {
         g_ptr_array_add( a_field_path,(gpointer) a_field_component );
         lttv_simple_expression_assign_field(a_field_path,a_simple_expression);
         a_field_component = g_string_new("");         
+                               g_string_free(a_string_spaces, TRUE);
+                               a_string_spaces = g_string_new("");
         if(filter->expression[i+1] == '=') { /* <= */
           i++;
           lttv_simple_expression_assign_operator(a_simple_expression,LTTV_FIELD_LE);
@@ -1485,6 +1510,8 @@ lttv_filter_update(LttvFilter* filter) {
         g_ptr_array_add( a_field_path,(gpointer) a_field_component );   
         lttv_simple_expression_assign_field(a_field_path,a_simple_expression);
         a_field_component = g_string_new("");         
+                               g_string_free(a_string_spaces, TRUE);
+                               a_string_spaces = g_string_new("");
         if(filter->expression[i+1] == '=') {  /* >= */
           i++;
           lttv_simple_expression_assign_operator(a_simple_expression,LTTV_FIELD_GE);
@@ -1496,6 +1523,8 @@ lttv_filter_update(LttvFilter* filter) {
         g_ptr_array_add( a_field_path,(gpointer) a_field_component );
         lttv_simple_expression_assign_field(a_field_path,a_simple_expression);
         a_field_component = g_string_new("");         
+                               g_string_free(a_string_spaces, TRUE);
+                               a_string_spaces = g_string_new("");
         lttv_simple_expression_assign_operator(a_simple_expression,LTTV_FIELD_EQ);
         break;
         
@@ -1513,13 +1542,25 @@ lttv_filter_update(LttvFilter* filter) {
         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("");
+                                       g_string_free(a_string_spaces, TRUE);
+                                       a_string_spaces = g_string_new("");
         }
         break;
-      case ' ':   /* ignore */
+      case ' ':   /* keep spaces that are within a field component */
+                               if(a_field_component->len == 0) break; /* ignore */
+                               else 
+               a_string_spaces = g_string_append_c(a_string_spaces,
+                                                                                                                                                                                       filter->expression[i]);
+
       case '\n':  /* ignore */
         break;
       default:    /* concatening current string */
-        g_string_append_c(a_field_component,filter->expression[i]);
+                               if(a_string_spaces->len != 0) {
+               g_string_append(a_field_component, a_string_spaces->str);
+                                       a_string_spaces = g_string_set_size(a_string_spaces, 0);
+                               }
+        a_field_component = g_string_append_c(a_field_component,
+                                                                                                                                                                                       filter->expression[i]);
     }
   }
 
@@ -1559,6 +1600,8 @@ lttv_filter_update(LttvFilter* filter) {
   } else {  /* add a leaf */
     lttv_simple_expression_assign_value(a_simple_expression,g_string_free(a_field_component,FALSE)); 
     a_field_component = NULL;
+               g_string_free(a_string_spaces, TRUE);
+               a_string_spaces = NULL;
     t1->right = LTTV_TREE_LEAF;
     t1->r_child.leaf = a_simple_expression;
     a_simple_expression = NULL;
@@ -1575,7 +1618,8 @@ lttv_filter_update(LttvFilter* filter) {
   
   /* free the field buffer if allocated */
   if(a_field_component != NULL) g_string_free(a_field_component,TRUE); 
+       if(a_string_spaces != NULL) g_string_free(a_string_spaces, TRUE);
+
   /* free the simple expression buffer if allocated */
   if(a_simple_expression != NULL) lttv_simple_expression_destroy(a_simple_expression);
   
@@ -1771,8 +1815,9 @@ lttv_filter_tree_parse(
 
   LttvProcessState* state;
   
-  guint cpu = ltt_tracefile_num(context->tf);
   LttvTraceState *ts = (LttvTraceState*)context->t_context;
+  LttvTracefileState *tfs = (LttvTracefileState*)context;
+  guint cpu = tfs->cpu;
   state = ts->running_process[cpu];
   
   /*
@@ -1923,7 +1968,15 @@ lttv_filter_tree_parse_branch(
               return se->op((gpointer)&quark,v);
             }
             break;
-            
+         case LTTV_FILTER_EVENT_FACILITY:
+            if(event == NULL) return TRUE;
+            else {
+              LttFacility* fac;
+              fac = ltt_event_facility(event);
+              GQuark quark = ltt_facility_name(fac);
+              return se->op((gpointer)&quark,v);
+            }
+            break;
         case LTTV_FILTER_EVENT_CATEGORY:
             /*
              * TODO: Not yet implemented
This page took 0.026679 seconds and 4 git commands to generate.