X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Ftext%2FtextFilter.c;h=8bfd355ed71238b7f69627e08b3cb69425373223;hb=4d9ff9421ad51cef878f7a2e70faacf96001768e;hp=bcca87515df5a354fecc11034026756941918a0e;hpb=1a7fa6824f9bd614ff78181c96d239b322411d7f;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/text/textFilter.c b/ltt/branches/poly/lttv/modules/text/textFilter.c index bcca8751..8bfd355e 100644 --- a/ltt/branches/poly/lttv/modules/text/textFilter.c +++ b/ltt/branches/poly/lttv/modules/text/textFilter.c @@ -16,8 +16,10 @@ * MA 02111-1307, USA. */ -/* The text filter facility will prompt for user filter option - * and transmit them to the lttv core */ +/* + * The text filter facility will prompt for user filter option + * and transmit them to the lttv core + */ #include #include @@ -37,74 +39,87 @@ /* Insert the hooks before and after each trace and tracefile, and for each event. Print a global header. */ -static char +/* + * YET TO BE ANSWERED ! + * - why does this module need dependency with batchAnalysis ? + */ + +/* + * TODO + * - specify wich hook function will be used to call the core filter + */ + +static char *a_file_name = NULL, - *a_filter_string = NULL; + *a_string = NULL; static LttvHooks *before_traceset, *event_hook; -static FILE *a_file; - /** - * analyses user filter options and issues the filter string - * to the core + * filters the file input from user * @param hook_data the hook data - * @param call_data the call data + * @return success/failure of operation */ -static void parse_filter_options(void *hook_data, void *call_data) { - - char* parsed_string=NULL; /* the string compiled from user's input */ - - /* debug */ - g_print("textFilter::parse_filter_options\n"); - - /* recovering hooks data */ - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)call_data; - -// LttvTrace* lt = tfc->t_context->vt; - - /* hook header */ - g_info("TextFilter options parser"); - - /* +void filter_analyze_file(void *hook_data) { + +// g_print("textFilter::filter_analyze_file\n"); + + LttvAttributeValue value; + + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + + /* * User may specify filtering options through static file * and/or command line string. From these sources, an * option string is rebuilded and sent to the filter core */ - if(a_file_name != NULL) { /* -f switch in use */ - a_file = fopen(a_file_name, "r"); - if(a_file == NULL) - g_error("textFilter::parse_filter_content() cannot open file %s", a_file_name); - - fscanf(a_file,"%s",parsed_string); - - fclose(a_file); - } - if(a_filter_string != NULL) /* -s switch in use */ - parsed_string = a_filter_string; - - if(parsed_string==NULL) - g_warning("textFilter::parser_filter_options() no filtering options specified !"); - - /* send the filtering string to the core */ - lttv_filter_new(parsed_string,tfs); - + if(!g_file_test(a_file_name,G_FILE_TEST_EXISTS)) { + g_warning("file %s does not exist", a_file_name); + return; + } + + char* a_file_content = NULL; + + g_file_get_contents(a_file_name,&a_file_content,NULL,NULL); + + g_assert(lttv_iattribute_find_by_path(attributes, "filter/expression", + LTTV_POINTER, &value)); + + if(((GString*)*(value.v_pointer))->len != 0) g_string_append_c((GString*)*(value.v_pointer),'&'); + g_string_append_c((GString*)*(value.v_pointer),'('); + g_string_append((GString*)*(value.v_pointer),a_file_content); + g_string_append_c((GString*)*(value.v_pointer),')'); + } /** - * filter to current event depending on the - * filter options tree + * filters the string input from user * @param hook_data the hook data - * @param call_data the call data - * @return success/error of operation + * @return success/failure of operation */ -static gboolean filter_event_content(void *hook_data, void *call_data) { +void filter_analyze_string(void *hook_data) { + +// g_print("textFilter::filter_analyze_string\n"); + + LttvAttributeValue value; + + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + + /* + * User may specify filtering options through static file + * and/or command line string. From these sources, an + * option string is rebuilded and sent to the filter core + */ + g_assert(lttv_iattribute_find_by_path(attributes, "filter/expression", + LTTV_POINTER, &value)); + + if(((GString*)*(value.v_pointer))->len != 0) g_string_append_c((GString*)*(value.v_pointer),'&'); + g_string_append_c((GString*)*(value.v_pointer),'('); + g_string_append((GString*)*(value.v_pointer),a_string); + g_string_append_c((GString*)*(value.v_pointer),')'); - g_print("textFilter::filter_event_content\n"); /* debug */ } /** @@ -112,43 +127,32 @@ static gboolean filter_event_content(void *hook_data, void *call_data) { */ static void init() { - g_print("textFilter::init()"); /* debug */ - +// g_print("textFilter::init()\n"); /* debug */ + LttvAttributeValue value; LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); - g_info("Init textFilter.c"); + g_assert(lttv_iattribute_find_by_path(attributes, "filter/expression", + LTTV_POINTER, &value)); - a_filter_string = NULL; - lttv_option_add("string", 's', + *(value.v_pointer) = g_string_new(""); + + g_info("Init textFilter.c"); + + a_string = NULL; + lttv_option_add("expression", 'e', "filters a string issued by the user on the command line", "string", - LTTV_OPT_STRING, &a_filter_string, NULL, NULL); + LTTV_OPT_STRING, &a_string, filter_analyze_string, NULL); // add function to call for option a_file_name = NULL; lttv_option_add("filename", 'f', "browse the filter options contained in specified file", "file name", - LTTV_OPT_STRING, &a_file_name, NULL, NULL); - - /* - * Note to myself ! - * LttvAttributeValue::v_pointer is a gpointer* --> void** - * see union LttvAttributeValue for more info - */ - g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event", - LTTV_POINTER, &value)); - g_assert((event_hook = *(value.v_pointer)) != NULL); - lttv_hooks_add(event_hook, filter_event_content, NULL, LTTV_PRIO_DEFAULT); - - g_assert(lttv_iattribute_find_by_path(attributes,"hooks/trace/before", - LTTV_POINTER, &value)); - g_assert((before_traceset = *(value.v_pointer)) != NULL); - lttv_hooks_add(before_traceset, parse_filter_options, NULL, LTTV_PRIO_DEFAULT); + LTTV_OPT_STRING, &a_file_name, filter_analyze_file, NULL); - } /** @@ -157,13 +161,18 @@ static void init() { static void destroy() { g_info("Destroy textFilter"); - lttv_option_remove("string"); + lttv_option_remove("expression"); lttv_option_remove("filename"); - lttv_hooks_remove_data(event_hook, filter_event_content, NULL); + LttvAttributeValue value; - lttv_hooks_remove_data(before_traceset, parse_filter_options, NULL); + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + + g_assert(lttv_iattribute_find_by_path(attributes, "filter/expression", + LTTV_POINTER, &value)); + + g_string_free((GString*)*(value.v_pointer),TRUE); }