1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

fset: add support of evaluated condition with filter "c:"

This commit is contained in:
Sébastien Helleu
2017-06-03 14:48:31 +02:00
parent 55350d8a29
commit 4fccf80e64
2 changed files with 115 additions and 4 deletions
+4
View File
@@ -513,6 +513,10 @@ fset_command_init ()
"\"xxx\"\n"
" =xxx show only options with \"xxx\" in value\n"
" ==xxx show only options with exact value \"xxx\"\n"
" c:xxx show only options matching the evaluated "
"condition \"xxx\", using following variables: name, parent_name, "
"type, type_en, value, parent_value, min, max, description, "
"description_en, string_values\n"
" s:x,y sort options by fields x,y "
"(see /help fset.look.sort)\n"
" s: reset sort to its default value "
+111 -4
View File
@@ -30,13 +30,22 @@
#include "fset-config.h"
/* options */
struct t_arraylist *fset_options = NULL;
int fset_option_count_marked = 0;
struct t_hashtable *fset_option_max_length_field = NULL;
/* filters */
char *fset_option_filter = NULL;
struct t_hashtable *fset_option_filter_hashtable_pointers = NULL;
struct t_hashtable *fset_option_filter_hashtable_extra_vars = NULL;
struct t_hashtable *fset_option_filter_hashtable_options = NULL;
/* refresh */
int fset_option_config_changed_timer = 0;
struct t_hook *fset_option_timer_hook = NULL;
/* types */
char *fset_option_type_string[FSET_OPTION_NUM_TYPES] =
{ N_("boolean"), N_("integer"), N_("string"), N_("color") };
char *fset_option_type_string_short[FSET_OPTION_NUM_TYPES] =
@@ -217,7 +226,8 @@ int
fset_option_match_filters (const char *config_name, const char *section_name,
struct t_fset_option *fset_option)
{
int length;
int length, match;
char *result;
if (!weechat_config_boolean (fset_config_look_show_plugin_description)
&& (strcmp (config_name, "plugins") == 0)
@@ -229,12 +239,49 @@ fset_option_match_filters (const char *config_name, const char *section_name,
if (!fset_option_filter || !fset_option_filter[0])
return 1;
if (strncmp (fset_option_filter, "f:", 2) == 0)
if (strncmp (fset_option_filter, "c:", 2) == 0)
{
weechat_hashtable_set (fset_option_filter_hashtable_pointers,
"fset_option", fset_option);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"name", fset_option->name);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"parent_name", fset_option->parent_name);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"type", _(fset_option_type_string[fset_option->type]));
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"type_en", fset_option_type_string[fset_option->type]);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"value", fset_option->value);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"parent_value", fset_option->parent_value);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"min", fset_option->min);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"max", fset_option->max);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"description",
(fset_option->description) ? _(fset_option->description) : "");
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"description_en", fset_option->description);
weechat_hashtable_set (fset_option_filter_hashtable_extra_vars,
"string_values", fset_option->string_values);
result = weechat_string_eval_expression (
fset_option_filter + 2,
fset_option_filter_hashtable_pointers,
fset_option_filter_hashtable_extra_vars,
fset_option_filter_hashtable_options);
match = (result && (strcmp (result, "1") == 0)) ? 1 : 0;
if (result)
free (result);
return match;
}
else if (strncmp (fset_option_filter, "f:", 2) == 0)
{
/* filter by config name */
return (weechat_strcasecmp (config_name, fset_option_filter + 2) == 0) ? 1 : 0;
}
if (strncmp (fset_option_filter, "t:", 2) == 0)
else if (strncmp (fset_option_filter, "t:", 2) == 0)
{
/* filter by type */
length = strlen (fset_option_filter + 2);
@@ -248,7 +295,6 @@ fset_option_match_filters (const char *config_name, const char *section_name,
fset_option_filter + 2,
length) == 0))) ? 1 : 0;
}
else if (strncmp (fset_option_filter, "d==", 3) == 0)
{
/* filter by modified values, exact value */
@@ -1309,8 +1355,54 @@ int
fset_option_init ()
{
fset_options = fset_option_get_arraylist_options ();
if (!fset_options)
return 0;
fset_option_count_marked = 0;
fset_option_max_length_field = fset_option_get_hashtable_max_length_field ();
if (!fset_option_max_length_field)
{
weechat_arraylist_free (fset_options);
return 0;
}
fset_option_filter_hashtable_pointers = weechat_hashtable_new (
8,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_POINTER,
NULL, NULL);
if (!fset_option_filter_hashtable_pointers)
{
weechat_arraylist_free (fset_options);
weechat_hashtable_free (fset_option_max_length_field);
return 0;
}
fset_option_filter_hashtable_extra_vars = weechat_hashtable_new (
128,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (!fset_option_filter_hashtable_extra_vars)
{
weechat_arraylist_free (fset_options);
weechat_hashtable_free (fset_option_max_length_field);
weechat_hashtable_free (fset_option_filter_hashtable_pointers);
return 0;
}
fset_option_filter_hashtable_options = weechat_hashtable_new (
8,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (!fset_option_filter_hashtable_options)
{
weechat_arraylist_free (fset_options);
weechat_hashtable_free (fset_option_max_length_field);
weechat_hashtable_free (fset_option_filter_hashtable_pointers);
weechat_hashtable_free (fset_option_filter_hashtable_extra_vars);
return 0;
}
weechat_hashtable_set (fset_option_filter_hashtable_options,
"type", "condition");
return 1;
}
@@ -1338,4 +1430,19 @@ fset_option_end ()
free (fset_option_filter);
fset_option_filter = NULL;
}
if (fset_option_filter_hashtable_pointers)
{
weechat_hashtable_free (fset_option_filter_hashtable_pointers);
fset_option_filter_hashtable_pointers = NULL;
}
if (fset_option_filter_hashtable_extra_vars)
{
weechat_hashtable_free (fset_option_filter_hashtable_extra_vars);
fset_option_filter_hashtable_extra_vars = NULL;
}
if (fset_option_filter_hashtable_options)
{
weechat_hashtable_free (fset_option_filter_hashtable_options);
fset_option_filter_hashtable_options = NULL;
}
}