X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Ffilter.c;h=e1066eeea071e116219286c974536d5dec40abff;hb=768d9ff70f4f49a042d606eeb0e767c23e537d04;hp=6337cd2c89f9a6b69b62035d65c86e56e7dda6ab;hpb=7b5f6cf19fe5b312dc0c5712b0fceddeed2fe11f;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/filter.c b/ltt/branches/poly/lttv/lttv/filter.c index 6337cd2c..e1066eee 100644 --- a/ltt/branches/poly/lttv/lttv/filter.c +++ b/ltt/branches/poly/lttv/lttv/filter.c @@ -488,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); @@ -1279,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 @@ -1320,7 +1322,28 @@ lttv_filter_update(LttvFilter* filter) { for(i=0;iexpression);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 @@ -1563,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]); } } @@ -1720,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);