tgid
[lttv.git] / ltt / branches / poly / lttv / lttv / filter.c
index 4025e4da5d8494d024228ac343e7016445c5410d..e1066eeea071e116219286c974536d5dec40abff 100644 (file)
@@ -52,6 +52,7 @@
  *    |->creation_time (LttTime)
  *    |->insertion_time (LttTime)
  *    |->process_name (String, converted to GQuark)
+ *    |->thread_brand (String, converted to GQuark)
  *    |->execution_mode (LttvExecutionMode)
  *    |->execution_submode (LttvExecutionSubmode)
  *    |->process_status (LttvProcessStatus)
@@ -164,6 +165,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
      *  state.creation_time
      *  state.insertion_time
      *  state.process_name
+     *  state.thread_brand
      *  state.execution_mode
      *  state.execution_submode
      *  state.process_status
@@ -186,6 +188,9 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
     else if(!g_strcasecmp(f->str,"process_name") ) {
       se->field = LTTV_FILTER_STATE_P_NAME;
     }
+    else if(!g_strcasecmp(f->str,"thread_brand") ) {
+      se->field = LTTV_FILTER_STATE_T_BRAND;
+    }
     else if(!g_strcasecmp(f->str,"execution_mode") ) {
       se->field = LTTV_FILTER_STATE_EX_MODE;
     }
@@ -229,8 +234,12 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
     }
     else if(!g_strcasecmp(f->str,"field") ) {
       se->field = LTTV_FILTER_EVENT_FIELD;
+      g_string_free(f,TRUE);
+      f=g_ptr_array_remove_index(fp,0);
 
     } else {
+      g_string_free(f,TRUE);
+      f=g_ptr_array_remove_index(fp,0);
       g_warning("Unknown event filter subtype %s", f->str);
     }
   } else {
@@ -272,6 +281,7 @@ lttv_simple_expression_assign_operator(LttvSimpleExpression* se, LttvExpressionO
      case LTTV_FILTER_TRACE_NAME:
      case LTTV_FILTER_TRACEFILE_NAME:
      case LTTV_FILTER_STATE_P_NAME:
+     case LTTV_FILTER_STATE_T_BRAND:
      case LTTV_FILTER_EVENT_NAME:
      case LTTV_FILTER_EVENT_FACILITY:
      case LTTV_FILTER_STATE_EX_MODE:
@@ -432,6 +442,7 @@ lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* value) {
      case LTTV_FILTER_TRACE_NAME:
      case LTTV_FILTER_TRACEFILE_NAME:
      case LTTV_FILTER_STATE_P_NAME:
+     case LTTV_FILTER_STATE_T_BRAND:
      case LTTV_FILTER_EVENT_NAME:
      case LTTV_FILTER_EVENT_FACILITY:
      case LTTV_FILTER_STATE_EX_MODE:
@@ -477,7 +488,7 @@ lttv_simple_expression_assign_value(LttvSimpleExpression* se, char* value) {
               t.tv_sec = atoi(v->str);
               g_string_free(v,TRUE);
               v = g_string_new("");
-          } else g_string_append_c(v,value[i]);
+          } else v = g_string_append_c(v,value[i]);
        }
        /* number can be integer or double */
        if(is_double) t.tv_nsec = atoi(v->str);
@@ -544,6 +555,7 @@ lttv_struct_type(gint ft) {
         case LTTV_FILTER_STATE_CT:
         case LTTV_FILTER_STATE_IT:
         case LTTV_FILTER_STATE_P_NAME:
+       case LTTV_FILTER_STATE_T_BRAND:
         case LTTV_FILTER_STATE_EX_MODE:
         case LTTV_FILTER_STATE_EX_SUBMODE:
         case LTTV_FILTER_STATE_P_STATUS:
@@ -1267,6 +1279,8 @@ lttv_filter_update(LttvFilter* filter) {
   
   /* simple expression buffer */
   LttvSimpleExpression* a_simple_expression = lttv_simple_expression_new(); 
+
+  gint nest_quotes = 0;
   
   /*
    *   Parse entire expression and construct
@@ -1308,7 +1322,28 @@ lttv_filter_update(LttvFilter* filter) {
   for(i=0;i<strlen(filter->expression);i++) {
     // debug
 //    g_print("%c\n ",filter->expression[i]);
-    
+    if(nest_quotes) {
+      switch(filter->expression[i]) {
+             case '\\' :
+                     if(filter->expression[i+1] == '\"') {
+                             i++;
+                     }
+                     break;
+              case '\"':
+                     nest_quotes = 0;
+                     i++;
+                     break;
+      }
+      if(a_string_spaces->len != 0) {
+        a_field_component = 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]);
+      continue;
+    }
+
     switch(filter->expression[i]) {
       /*
        *   logical operators
@@ -1551,20 +1586,24 @@ lttv_filter_update(LttvFilter* filter) {
         }
         break;
       case ' ':   /* keep spaces that are within a field component */
-                               if(a_field_component->len == 0) break; /* ignore */
+                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;
+      case '\"':
+               nest_quotes?(nest_quotes=0):(nest_quotes=1);
+               break;
       default:    /* concatening current string */
-                               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]);
+              if(a_string_spaces->len != 0) {
+               a_field_component = 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]);
     }
   }
 
@@ -1708,10 +1747,10 @@ lttv_filter_append_expression(LttvFilter* filter, const char *expression) {
 
   GString* s = g_string_new("");
   if(filter->expression != NULL) {
-    g_string_append(s,filter->expression);
-    g_string_append_c(s,'&');
+    s = g_string_append(s,filter->expression);
+    s = g_string_append_c(s,'&');
   }
-  g_string_append(s,expression);
+  s = g_string_append(s,expression);
  
   g_free(filter->expression);
   filter->expression = g_string_free(s,FALSE);
@@ -1932,15 +1971,19 @@ lttv_filter_tree_parse_branch(
             }
             break;
         case LTTV_FILTER_STATE_P_NAME:
-            /*
-             * All 'unnamed' for the moment  
-             */
             if(state == NULL) return TRUE;
             else {
               GQuark quark = state->name;
               return se->op((gpointer)&quark,v);
             }
             break;
+       case LTTV_FILTER_STATE_T_BRAND:
+            if(state == NULL) return TRUE;
+            else {
+              GQuark quark = state->brand;
+              return se->op((gpointer)&quark,v);
+            }
+            break;
         case LTTV_FILTER_STATE_EX_MODE:
             if(state == NULL) return TRUE;
             else return se->op((gpointer)&state->state->t,v);
This page took 0.02444 seconds and 4 git commands to generate.