TEST(String, SplitBuildWithSplitString) { char **argv, *str; int argc; str = string_build_with_split_string (NULL, NULL); POINTERS_EQUAL(NULL, str); argv = string_split (" abc de fghi ", " ", 0, 0, &argc); str = string_build_with_split_string ((const char **)argv, NULL); STRCMP_EQUAL("abcdefghi", str); free (str); str = string_build_with_split_string ((const char **)argv, ""); STRCMP_EQUAL("abcdefghi", str); free (str); str = string_build_with_split_string ((const char **)argv, ";;"); STRCMP_EQUAL("abc;;de;;fghi", str); free (str); string_free_split (argv); }
int gui_filter_add_to_infolist (struct t_infolist *infolist, struct t_gui_filter *filter) { struct t_infolist_item *ptr_item; char option_name[64], *tags; int i; if (!infolist || !filter) return 0; ptr_item = infolist_new_item (infolist); if (!ptr_item) return 0; if (!infolist_new_var_integer (ptr_item, "enabled", filter->enabled)) return 0; if (!infolist_new_var_string (ptr_item, "name", filter->name)) return 0; if (!infolist_new_var_string (ptr_item, "buffer_name", filter->buffer_name)) return 0; if (!infolist_new_var_string (ptr_item, "tags", filter->tags)) return 0; if (!infolist_new_var_integer (ptr_item, "tags_count", filter->tags_count)) return 0; for (i = 0; i < filter->tags_count; i++) { snprintf (option_name, sizeof (option_name), "tag_%05d", i + 1); tags = string_build_with_split_string ((const char **)filter->tags_array[i], "+"); if (tags) { if (!infolist_new_var_string (ptr_item, option_name, tags)) { free (tags); return 0; } free (tags); } } if (!infolist_new_var_string (ptr_item, "regex", filter->regex)) return 0; return 1; }
struct t_hashtable * gui_focus_to_hashtable (struct t_gui_focus_info *focus_info, const char *key) { struct t_hashtable *hashtable; char str_value[128], *str_time, *str_prefix, *str_tags, *str_message; const char *nick; hashtable = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); if (!hashtable) return NULL; /* key (key from keyboard or mouse event) */ FOCUS_STR("_key", key); /* x,y */ FOCUS_INT("_x", focus_info->x); FOCUS_INT("_y", focus_info->y); /* window */ FOCUS_PTR("_window", focus_info->window); if (focus_info->window) { FOCUS_INT("_window_number", (focus_info->window)->number); } else { FOCUS_STR("_window_number", "*"); } /* buffer */ FOCUS_PTR("_buffer", focus_info->buffer); if (focus_info->buffer) { FOCUS_INT("_buffer_number", (focus_info->buffer)->number); FOCUS_STR("_buffer_plugin", plugin_get_name ((focus_info->buffer)->plugin)); FOCUS_STR("_buffer_name", (focus_info->buffer)->name); FOCUS_STR("_buffer_full_name", (focus_info->buffer)->full_name); hashtable_map ((focus_info->buffer)->local_variables, &gui_focus_buffer_localvar_map_cb, hashtable); } else { FOCUS_PTR("_buffer", NULL); FOCUS_STR("_buffer_number", "-1"); FOCUS_STR("_buffer_plugin", ""); FOCUS_STR("_buffer_name", ""); FOCUS_STR("_buffer_full_name", ""); } /* chat area */ FOCUS_INT("_chat", focus_info->chat); str_time = NULL; str_prefix = NULL; if (focus_info->chat_line) { str_time = gui_color_decode (((focus_info->chat_line)->data)->str_time, NULL); str_prefix = gui_color_decode (((focus_info->chat_line)->data)->prefix, NULL); str_tags = string_build_with_split_string ((const char **)((focus_info->chat_line)->data)->tags_array, ","); str_message = gui_color_decode (((focus_info->chat_line)->data)->message, NULL); nick = gui_line_get_nick_tag (focus_info->chat_line); FOCUS_PTR("_chat_line", focus_info->chat_line); FOCUS_INT("_chat_line_x", focus_info->chat_line_x); FOCUS_INT("_chat_line_y", ((focus_info->chat_line)->data)->y); FOCUS_TIME("_chat_line_date", ((focus_info->chat_line)->data)->date); FOCUS_TIME("_chat_line_date_printed", ((focus_info->chat_line)->data)->date_printed); FOCUS_STR_VAR("_chat_line_time", str_time); FOCUS_STR_VAR("_chat_line_tags", str_tags); FOCUS_STR_VAR("_chat_line_nick", nick); FOCUS_STR_VAR("_chat_line_prefix", str_prefix); FOCUS_STR_VAR("_chat_line_message", str_message); if (str_time) free (str_time); if (str_prefix) free (str_prefix); if (str_tags) free (str_tags); if (str_message) free (str_message); } else { FOCUS_PTR("_chat_line", NULL); FOCUS_STR("_chat_line_x", "-1"); FOCUS_STR("_chat_line_y", "-1"); FOCUS_STR("_chat_line_date", "-1"); FOCUS_STR("_chat_line_date_printed", "-1"); FOCUS_STR("_chat_line_time", ""); FOCUS_STR("_chat_line_tags", ""); FOCUS_STR("_chat_line_nick", ""); FOCUS_STR("_chat_line_prefix", ""); FOCUS_STR("_chat_line_message", ""); } FOCUS_STR_VAR("_chat_word", focus_info->chat_word); FOCUS_STR_VAR("_chat_bol", focus_info->chat_bol); FOCUS_STR_VAR("_chat_eol", focus_info->chat_eol); /* bar/item */ if (focus_info->bar_window) { FOCUS_STR("_bar_name", ((focus_info->bar_window)->bar)->name); FOCUS_STR("_bar_filling", gui_bar_filling_string[gui_bar_get_filling ((focus_info->bar_window)->bar)]); } else { FOCUS_STR("_bar_name", ""); FOCUS_STR("_bar_filling", ""); } FOCUS_STR_VAR("_bar_item_name", focus_info->bar_item); FOCUS_INT("_bar_item_line", focus_info->bar_item_line); FOCUS_INT("_bar_item_col", focus_info->bar_item_col); return hashtable; }
void hook_line_exec (struct t_gui_line *line) { struct t_hook *ptr_hook, *next_hook; struct t_hashtable *hashtable, *hashtable2; char str_value[128], *str_tags; if (!weechat_hooks[HOOK_TYPE_LINE]) return; hashtable = NULL; hook_exec_start (); ptr_hook = weechat_hooks[HOOK_TYPE_LINE]; while (ptr_hook) { next_hook = ptr_hook->next_hook; if (!ptr_hook->deleted && !ptr_hook->running && ((HOOK_LINE(ptr_hook, buffer_type) == -1) || ((int)(line->data->buffer->type) == (HOOK_LINE(ptr_hook, buffer_type)))) && string_match_list (line->data->buffer->full_name, (const char **)HOOK_LINE(ptr_hook, buffers), 0) && (!HOOK_LINE(ptr_hook, tags_array) || gui_line_match_tags (line->data, HOOK_LINE(ptr_hook, tags_count), HOOK_LINE(ptr_hook, tags_array)))) { /* create the hashtable that will be sent to callback */ if (!hashtable) { hashtable = hashtable_new (32, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, NULL, NULL); if (!hashtable) break; } HASHTABLE_SET_POINTER("buffer", line->data->buffer); HASHTABLE_SET_STR("buffer_name", line->data->buffer->full_name); HASHTABLE_SET_STR("buffer_type", gui_buffer_type_string[line->data->buffer->type]); HASHTABLE_SET_INT("y", line->data->y); HASHTABLE_SET_TIME("date", line->data->date); HASHTABLE_SET_TIME("date_printed", line->data->date_printed); HASHTABLE_SET_STR_NOT_NULL("str_time", line->data->str_time); HASHTABLE_SET_INT("tags_count", line->data->tags_count); str_tags = string_build_with_split_string ( (const char **)line->data->tags_array, ","); HASHTABLE_SET_STR_NOT_NULL("tags", str_tags); if (str_tags) free (str_tags); HASHTABLE_SET_INT("displayed", line->data->displayed); HASHTABLE_SET_INT("notify_level", line->data->notify_level); HASHTABLE_SET_INT("highlight", line->data->highlight); HASHTABLE_SET_STR_NOT_NULL("prefix", line->data->prefix); HASHTABLE_SET_STR_NOT_NULL("message", line->data->message); /* run callback */ ptr_hook->running = 1; hashtable2 = (HOOK_LINE(ptr_hook, callback)) (ptr_hook->callback_pointer, ptr_hook->callback_data, hashtable); ptr_hook->running = 0; if (hashtable2) { gui_line_hook_update (line, hashtable, hashtable2); hashtable_free (hashtable2); if (!line->data->buffer) break; } } ptr_hook = next_hook; } hook_exec_end (); if (hashtable) hashtable_free (hashtable); }
TEST(String, Split) { char **argv, *str; int argc; POINTERS_EQUAL(NULL, string_split (NULL, NULL, 0, 0, NULL)); POINTERS_EQUAL(NULL, string_split (NULL, "", 0, 0, NULL)); POINTERS_EQUAL(NULL, string_split ("", NULL, 0, 0, NULL)); POINTERS_EQUAL(NULL, string_split ("", "", 0, 0, NULL)); argc = 1; POINTERS_EQUAL(NULL, string_split (NULL, NULL, 0, 0, &argc)); LONGS_EQUAL(0, argc); argc = 1; POINTERS_EQUAL(NULL, string_split (NULL, "", 0, 0, &argc)); LONGS_EQUAL(0, argc); argc = 1; POINTERS_EQUAL(NULL, string_split ("", NULL, 0, 0, &argc)); LONGS_EQUAL(0, argc); argc = 1; POINTERS_EQUAL(NULL, string_split ("", "", 0, 0, &argc)); LONGS_EQUAL(0, argc); /* free split with NULL */ string_free_split (NULL); string_free_split_shared (NULL); string_free_split_command (NULL); /* standard split */ argv = string_split (" abc de fghi ", " ", 0, 0, &argc); LONGS_EQUAL(3, argc); STRCMP_EQUAL("abc", argv[0]); STRCMP_EQUAL("de", argv[1]); STRCMP_EQUAL("fghi", argv[2]); POINTERS_EQUAL(NULL, argv[3]); string_free_split (argv); /* max 2 items */ argv = string_split (" abc de fghi ", " ", 0, 2, &argc); LONGS_EQUAL(2, argc); STRCMP_EQUAL("abc", argv[0]); STRCMP_EQUAL("de", argv[1]); POINTERS_EQUAL(NULL, argv[2]); string_free_split (argv); /* keep eol */ argv = string_split (" abc de fghi ", " ", 1, 0, &argc); LONGS_EQUAL(3, argc); STRCMP_EQUAL("abc de fghi", argv[0]); STRCMP_EQUAL("de fghi", argv[1]); STRCMP_EQUAL("fghi", argv[2]); POINTERS_EQUAL(NULL, argv[3]); string_free_split (argv); /* keep eol and max 2 items */ argv = string_split (" abc de fghi ", " ", 1, 2, &argc); LONGS_EQUAL(2, argc); STRCMP_EQUAL("abc de fghi", argv[0]); STRCMP_EQUAL("de fghi", argv[1]); POINTERS_EQUAL(NULL, argv[2]); string_free_split (argv); /* split with shared strings */ argv = string_split_shared (" abc de abc ", " ", 0, 0, &argc); LONGS_EQUAL(3, argc); STRCMP_EQUAL("abc", argv[0]); STRCMP_EQUAL("de", argv[1]); STRCMP_EQUAL("abc", argv[2]); POINTERS_EQUAL(NULL, argv[3]); /* same content == same pointer for shared strings */ POINTERS_EQUAL(argv[0], argv[2]); string_free_split_shared (argv); /* build string with split string */ str = string_build_with_split_string (NULL, NULL); POINTERS_EQUAL(NULL, str); argv = string_split (" abc de fghi ", " ", 0, 0, &argc); str = string_build_with_split_string ((const char **)argv, NULL); STRCMP_EQUAL("abcdefghi", str); free (str); str = string_build_with_split_string ((const char **)argv, ""); STRCMP_EQUAL("abcdefghi", str); free (str); str = string_build_with_split_string ((const char **)argv, ";;"); STRCMP_EQUAL("abc;;de;;fghi", str); free (str); string_free_split (argv); /* split command */ POINTERS_EQUAL(NULL, string_split_command (NULL, ';')); POINTERS_EQUAL(NULL, string_split_command ("", ';')); argv = string_split_command ("abc;de;fghi", ';'); LONGS_EQUAL(3, argc); STRCMP_EQUAL("abc", argv[0]); STRCMP_EQUAL("de", argv[1]); STRCMP_EQUAL("fghi", argv[2]); POINTERS_EQUAL(NULL, argv[3]); string_free_split_command (argv); }