summaryrefslogtreecommitdiff
path: root/src/plugins/scripts/script.c
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2009-03-28 20:58:00 +0100
committerSebastien Helleu <flashcode@flashtux.org>2009-03-28 20:58:00 +0100
commitb2f1273c01f2f13f02683a7d31823540f251f951 (patch)
treea3bcdde82e0b3f3aaeaed5d986ec45b5b7dadd99 /src/plugins/scripts/script.c
parent30a50c6999b8ba312abe674470ac052e322211a1 (diff)
downloadweechat-b2f1273c01f2f13f02683a7d31823540f251f951.zip
Add infolists with list of scripts
Diffstat (limited to 'src/plugins/scripts/script.c')
-rw-r--r--src/plugins/scripts/script.c132
1 files changed, 130 insertions, 2 deletions
diff --git a/src/plugins/scripts/script.c b/src/plugins/scripts/script.c
index 9b633d371..ede725dcd 100644
--- a/src/plugins/scripts/script.c
+++ b/src/plugins/scripts/script.c
@@ -87,6 +87,10 @@ script_init (struct t_weechat_plugin *weechat_plugin,
int (*callback_completion)(void *data, const char *completion_item,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion),
+ struct t_infolist *(*callback_infolist)(void *data,
+ const char *infolist_name,
+ void *pointer,
+ const char *arguments),
int (*callback_signal_debug_dump)(void *data, const char *signal,
const char *type_data,
void *signal_data),
@@ -96,6 +100,7 @@ script_init (struct t_weechat_plugin *weechat_plugin,
void (*callback_load_file)(void *data, const char *filename))
{
char *string, *completion = "list|listfull|load|autoload|reload|unload %f";
+ char infolist_description[512];
int length;
/* read script configuration */
@@ -144,14 +149,19 @@ script_init (struct t_weechat_plugin *weechat_plugin,
callback_command, NULL);
if (string)
free (string);
-
- /* add completion */
+
+ /* add completion and infolist */
length = strlen (weechat_plugin->name) + 16;
string = malloc (length);
if (string)
{
snprintf (string, length, "%s_script", weechat_plugin->name);
weechat_hook_completion (string, callback_completion, NULL);
+ snprintf (infolist_description, sizeof (infolist_description),
+ /* TRANSLATORS: %s is language (for example "perl") */
+ _("list of %s scripts"), weechat_plugin->name);
+ weechat_hook_infolist (string, infolist_description,
+ callback_infolist, NULL);
free (string);
}
@@ -166,6 +176,32 @@ script_init (struct t_weechat_plugin *weechat_plugin,
}
/*
+ * script_valid: check if a script pointer exists
+ * return 1 if script exists
+ * 0 if script is not found
+ */
+
+int
+script_valid (struct t_plugin_script *scripts,
+ struct t_plugin_script *script)
+{
+ struct t_plugin_script *ptr_script;
+
+ if (!script)
+ return 0;
+
+ for (ptr_script = scripts; ptr_script;
+ ptr_script = ptr_script->next_script)
+ {
+ if (ptr_script == script)
+ return 1;
+ }
+
+ /* script not found */
+ return 0;
+}
+
+/*
* script_ptr2str: convert pointer to string for usage in a script
* (any language)
* WARNING: result has to be free() after use
@@ -700,6 +736,98 @@ script_display_short_list (struct t_weechat_plugin *weechat_plugin,
}
/*
+ * script_add_to_infolist: add a script in an infolist
+ * return 1 if ok, 0 if error
+ */
+
+int
+script_add_to_infolist (struct t_weechat_plugin *weechat_plugin,
+ struct t_infolist *infolist,
+ struct t_plugin_script *script)
+{
+ struct t_infolist_item *ptr_item;
+
+ if (!infolist || !script)
+ return 0;
+
+ ptr_item = weechat_infolist_new_item (infolist);
+ if (!ptr_item)
+ return 0;
+
+ if (!weechat_infolist_new_var_pointer (ptr_item, "pointer", script))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "filename", script->filename))
+ return 0;
+ if (!weechat_infolist_new_var_pointer (ptr_item, "interpreter", script->interpreter))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "name", script->name))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "author", script->author))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "version", script->version))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "license", script->license))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "description", script->description))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "shutdown_func", script->shutdown_func))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "charset", script->charset))
+ return 0;
+
+ return 1;
+}
+
+/*
+ * script_infolist_list_scripts: build infolist with list of scripts
+ */
+
+struct t_infolist *
+script_infolist_list_scripts (struct t_weechat_plugin *weechat_plugin,
+ struct t_plugin_script *scripts,
+ void *pointer)
+{
+ struct t_infolist *ptr_infolist;
+ struct t_plugin_script *ptr_script;
+
+ if (pointer && !script_valid (scripts, pointer))
+ return NULL;
+
+ ptr_infolist = weechat_infolist_new ();
+ if (ptr_infolist)
+ {
+ if (pointer)
+ {
+ /* build list with only one script */
+ if (!script_add_to_infolist (weechat_plugin,
+ ptr_infolist, pointer))
+ {
+ weechat_infolist_free (ptr_infolist);
+ return NULL;
+ }
+ return ptr_infolist;
+ }
+ else
+ {
+ /* build list with all scripts */
+ for (ptr_script = scripts; ptr_script;
+ ptr_script = ptr_script->next_script)
+ {
+ if (!script_add_to_infolist (weechat_plugin,
+ ptr_infolist, ptr_script))
+ {
+ weechat_infolist_free (ptr_infolist);
+ return NULL;
+ }
+ }
+ return ptr_infolist;
+ }
+ }
+
+ return NULL;
+}
+
+/*
* script_print_log: print script infos in log (usually for crash dump)
*/