summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt28
-rw-r--r--src/common/Makefile.am48
-rw-r--r--src/common/alias.c376
-rw-r--r--src/common/alias.h47
-rw-r--r--src/common/backtrace.c176
-rw-r--r--src/common/backtrace.h27
-rw-r--r--src/common/command.c4521
-rw-r--r--src/common/command.h86
-rw-r--r--src/common/completion.c1727
-rw-r--r--src/common/completion.h65
-rw-r--r--src/common/fifo.c291
-rw-r--r--src/common/fifo.h29
-rw-r--r--src/common/history.c188
-rw-r--r--src/common/history.h41
-rw-r--r--src/common/hotlist.c351
-rw-r--r--src/common/hotlist.h54
-rw-r--r--src/common/log.c233
-rw-r--r--src/common/log.h31
-rw-r--r--src/common/session.c1867
-rw-r--r--src/common/session.h205
-rw-r--r--src/common/utf8.c426
-rw-r--r--src/common/utf8.h50
-rw-r--r--src/common/util.c730
-rw-r--r--src/common/util.h41
-rw-r--r--src/common/weechat.c884
-rw-r--r--src/common/weechat.h121
-rw-r--r--src/common/weeconfig.c2597
-rw-r--r--src/common/weeconfig.h291
-rw-r--r--src/common/weelist.c241
-rw-r--r--src/common/weelist.h43
30 files changed, 0 insertions, 15815 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
deleted file mode 100644
index 8f48d90b2..000000000
--- a/src/common/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2003-2007 FlashCode <flashcode@flashtux.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-SET(LIB_MAIN_SRC weechat.c weechat.h alias.c alias.h backtrace.c backtrace.h
-command.c command.h completion.c completion.h weelist.c weelist.h weeconfig.c
-weeconfig.h history.c history.h hotlist.c hotlist.h log.c log.h fifo.c fifo.h
-session.c session.h utf8.c utf8.h util.c util.h)
-
-# Check for flock support
-INCLUDE(CheckSymbolExists)
-CHECK_INCLUDE_FILES("sys/file.h" HAVE_SYS_FILE_H)
-CHECK_SYMBOL_EXISTS(flock "sys/file.h" HAVE_FLOCK)
-
-INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
-ADD_LIBRARY(weechat_main STATIC ${LIB_MAIN_SRC})
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
deleted file mode 100644
index ca0701c73..000000000
--- a/src/common/Makefile.am
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2003-2007 FlashCode <flashcode@flashtux.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\" $(GNUTLS_CFLAGS)
-
-noinst_LIBRARIES = lib_weechat_main.a
-
-lib_weechat_main_a_SOURCES = weechat.c \
- weechat.h \
- alias.c \
- alias.h \
- backtrace.c \
- backtrace.h \
- command.c \
- command.h \
- completion.c \
- completion.h \
- weelist.c \
- weelist.h \
- weeconfig.c \
- weeconfig.h \
- history.c \
- history.h \
- hotlist.c \
- hotlist.h \
- log.c \
- log.h \
- fifo.c \
- fifo.h \
- session.c \
- session.h \
- utf8.c \
- utf8.h \
- util.c \
- util.h
diff --git a/src/common/alias.c b/src/common/alias.c
deleted file mode 100644
index 4a8919f35..000000000
--- a/src/common/alias.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* alias.c: WeeChat alias */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "weechat.h"
-#include "alias.h"
-#include "util.h"
-#include "../protocols/irc/irc.h"
-
-
-t_weechat_alias *weechat_alias = NULL;
-t_weechat_alias *weechat_last_alias = NULL;
-
-
-/*
- * alias_search: search an alias
- */
-
-t_weechat_alias *
-alias_search (char *alias_name)
-{
- t_weechat_alias *ptr_alias;
-
- for (ptr_alias = weechat_alias; ptr_alias; ptr_alias = ptr_alias->next_alias)
- {
- if (ascii_strcasecmp (alias_name, ptr_alias->alias_name) == 0)
- return ptr_alias;
- }
- return NULL;
-}
-
-/*
- * alias_find_pos: find position for an alias (for sorting aliases)
- */
-
-t_weechat_alias *
-alias_find_pos (char *alias_name)
-{
- t_weechat_alias *ptr_alias;
-
- for (ptr_alias = weechat_alias; ptr_alias; ptr_alias = ptr_alias->next_alias)
- {
- if (ascii_strcasecmp (alias_name, ptr_alias->alias_name) < 0)
- return ptr_alias;
- }
- return NULL;
-}
-
-/*
- * alias_insert_sorted: insert alias into sorted list
- */
-
-void
-alias_insert_sorted (t_weechat_alias *alias)
-{
- t_weechat_alias *pos_alias;
-
- pos_alias = alias_find_pos (alias->alias_name);
-
- if (weechat_alias)
- {
- if (pos_alias)
- {
- /* insert alias into the list (before alias found) */
- alias->prev_alias = pos_alias->prev_alias;
- alias->next_alias = pos_alias;
- if (pos_alias->prev_alias)
- pos_alias->prev_alias->next_alias = alias;
- else
- weechat_alias = alias;
- pos_alias->prev_alias = alias;
- }
- else
- {
- /* add alias to the end */
- alias->prev_alias = weechat_last_alias;
- alias->next_alias = NULL;
- weechat_last_alias->next_alias = alias;
- weechat_last_alias = alias;
- }
- }
- else
- {
- alias->prev_alias = NULL;
- alias->next_alias = NULL;
- weechat_alias = alias;
- weechat_last_alias = alias;
- }
-}
-
-/*
- * alias_new: create new alias and add it to alias list
- */
-
-t_weechat_alias *
-alias_new (char *alias_name, char *alias_command)
-{
- t_weechat_alias *new_alias, *ptr_alias;
-
- while (alias_name[0] == '/')
- {
- alias_name++;
- }
-
- if (ascii_strcasecmp (alias_name, "builtin") == 0)
- return NULL;
-
- ptr_alias = alias_search (alias_name);
- if (ptr_alias)
- {
- if (ptr_alias->alias_command)
- free (ptr_alias->alias_command);
- ptr_alias->alias_command = strdup (alias_command);
- return ptr_alias;
- }
-
- if ((new_alias = ((t_weechat_alias *) malloc (sizeof (t_weechat_alias)))))
- {
- new_alias->alias_name = strdup (alias_name);
- new_alias->alias_command = (char *) malloc (strlen (alias_command) + 1);
- new_alias->running = 0;
- if (new_alias->alias_command)
- strcpy (new_alias->alias_command, alias_command);
- alias_insert_sorted (new_alias);
- return new_alias;
- }
- else
- return NULL;
-}
-
-/*
- * alias_get_final_command: get final command pointed by an alias
- */
-
-char *
-alias_get_final_command (t_weechat_alias *alias)
-{
- t_weechat_alias *ptr_alias;
- char *result;
-
- if (alias->running)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s circular reference when calling alias \"/%s\"\n"),
- WEECHAT_ERROR, alias->alias_name);
- return NULL;
- }
-
- ptr_alias = alias_search ((alias->alias_command[0] == '/') ?
- alias->alias_command + 1 : alias->alias_command);
- if (ptr_alias)
- {
- alias->running = 1;
- result = alias_get_final_command (ptr_alias);
- alias->running = 0;
- return result;
- }
- return (alias->alias_command[0] == '/') ?
- alias->alias_command + 1 : alias->alias_command;
-}
-
-/*
- * alias_add_word: add word to string and increment length
- * This function should NOT be called directly.
- */
-
-void
-alias_add_word (char **alias, int *length, char *word)
-{
- int length_word;
-
- if (!word)
- return;
-
- length_word = strlen (word);
- if (length_word == 0)
- return;
-
- if (*alias == NULL)
- {
- *alias = (char *) malloc (length_word + 1);
- strcpy (*alias, word);
- }
- else
- {
- *alias = realloc (*alias, strlen (*alias) + length_word + 1);
- strcat (*alias, word);
- }
- *length += length_word;
-}
-
-/*
- * alias_replace_args: replace arguments ($1, $2, .. or $*) in alias arguments
- */
-
-char *
-alias_replace_args (char *alias_args, char *user_args)
-{
- char **argv, *start, *pos, *res;
- int argc, length_res, args_count;
-
- argv = explode_string (user_args, " ", 0, &argc);
-
- res = NULL;
- length_res = 0;
- args_count = 0;
- start = alias_args;
- pos = start;
- while (pos && pos[0])
- {
- if ((pos[0] == '\\') && (pos[1] == '$'))
- {
- pos[0] = '\0';
- alias_add_word (&res, &length_res, start);
- alias_add_word (&res, &length_res, "$");
- pos[0] = '\\';
- start = pos + 2;
- pos = start;
- }
- else
- {
- if (pos[0] == '$')
- {
- if (pos[1] == '*')
- {
- args_count++;
- pos[0] = '\0';
- alias_add_word (&res, &length_res, start);
- alias_add_word (&res, &length_res, user_args);
- pos[0] = '$';
- start = pos + 2;
- pos = start;
- }
- else
- {
- if ((pos[1] >= '1') && (pos[1] <= '9'))
- {
- args_count++;
- pos[0] = '\0';
- alias_add_word (&res, &length_res, start);
- if (pos[1] - '0' <= argc)
- alias_add_word (&res, &length_res, argv[pos[1] - '1']);
- pos[0] = '$';
- start = pos + 2;
- pos = start;
- }
- else
- pos++;
- }
- }
- else
- pos++;
- }
- }
-
- if (start < pos)
- alias_add_word (&res, &length_res, start);
-
- if ((args_count == 0) && user_args && user_args[0])
- {
- alias_add_word (&res, &length_res, " ");
- alias_add_word (&res, &length_res, user_args);
- }
-
- if (argv)
- free_exploded_string (argv);
-
- return res;
-}
-
-/*
- * alias_replace_vars: replace special vars ($nick, $channel, $server) in a string
- */
-
-char *
-alias_replace_vars (t_irc_server *server, t_irc_channel *channel, char *string)
-{
- char *var_nick, *var_channel, *var_server;
- char empty_string[1] = { '\0' };
- char *res, *temp;
-
- var_nick = (server && server->nick) ? server->nick : empty_string;
- var_channel = (channel) ? channel->name : empty_string;
- var_server = (server) ? server->name : empty_string;
-
- /* replace nick */
- temp = weechat_strreplace (string, "$nick", var_nick);
- if (!temp)
- return NULL;
- res = temp;
-
- /* replace channel */
- temp = weechat_strreplace (res, "$channel", var_channel);
- free (res);
- if (!temp)
- return NULL;
- res = temp;
-
- /* replace server */
- temp = weechat_strreplace (res, "$server", var_server);
- free (res);
- if (!temp)
- return NULL;
- res = temp;
-
- /* return result */
- return res;
-}
-
-/*
- * alias_free: free an alias and reomve it from list
- */
-
-void
-alias_free (t_weechat_alias *alias)
-{
- t_weechat_alias *new_weechat_alias;
-
- /* remove alias from list */
- if (weechat_last_alias == alias)
- weechat_last_alias = alias->prev_alias;
- if (alias->prev_alias)
- {
- (alias->prev_alias)->next_alias = alias->next_alias;
- new_weechat_alias = weechat_alias;
- }
- else
- new_weechat_alias = alias->next_alias;
-
- if (alias->next_alias)
- (alias->next_alias)->prev_alias = alias->prev_alias;
-
- /* free data */
- if (alias->alias_name)
- free (alias->alias_name);
- if (alias->alias_command)
- free (alias->alias_command);
- free (alias);
- weechat_alias = new_weechat_alias;
-}
-
-/*
- * alias_free_all: free all alias
- */
-
-void
-alias_free_all ()
-{
- while (weechat_alias)
- alias_free (weechat_alias);
-}
diff --git a/src/common/alias.h b/src/common/alias.h
deleted file mode 100644
index 759330ddd..000000000
--- a/src/common/alias.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_ALIAS_H
-#define __WEECHAT_ALIAS_H 1
-
-#include "../protocols/irc/irc.h"
-
-typedef struct t_weechat_alias t_weechat_alias;
-
-struct t_weechat_alias
-{
- char *alias_name;
- char *alias_command;
- int running;
- t_weechat_alias *prev_alias;
- t_weechat_alias *next_alias;
-};
-
-extern t_weechat_alias *weechat_alias;
-extern t_weechat_alias *weechat_last_alias;
-
-extern t_weechat_alias *alias_search (char *);
-extern t_weechat_alias *alias_new (char *, char *);
-extern char *alias_get_final_command (t_weechat_alias *);
-extern char *alias_replace_args (char *, char *);
-extern char *alias_replace_vars (t_irc_server *, t_irc_channel *, char *);
-extern void alias_free (t_weechat_alias *);
-extern void alias_free_all ();
-
-#endif /* alias.h */
diff --git a/src/common/backtrace.c b/src/common/backtrace.c
deleted file mode 100644
index d6d0b8b08..000000000
--- a/src/common/backtrace.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* backtrace.c: display backtrace after a segfault */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#ifndef __USE_GNU
-#define __USE_GNU
-#endif
-
-#include <dlfcn.h>
-
-#ifdef HAVE_BACKTRACE
-#include <execinfo.h>
-#endif
-
-#include "weechat.h"
-#include "backtrace.h"
-#include "log.h"
-#include "util.h"
-
-
-/*
- * weechat_backtrace_printf: display a backtrace line (on stderr and in WeeChat log)
- */
-
-void
-weechat_backtrace_printf (char *message, ...)
-{
- static char buffer[4096];
- va_list argptr;
-
- va_start (argptr, message);
- vsnprintf (buffer, sizeof (buffer) - 1, message, argptr);
- va_end (argptr);
-
- weechat_iconv_fprintf (stderr, "%s", buffer);
- weechat_log_printf ("%s", buffer);
-}
-
-/*
- * weechat_backtrace_addr2line: display function name and line with a backtrace address
- */
-
-void
-weechat_backtrace_addr2line (int number, void *address, char *symbol)
-{
-#ifdef HAVE_BACKTRACE
- int rc;
- Dl_info info;
- const void *addr;
- FILE *output;
- char cmd_line[1024];
- char line[1024], *ptr_line, *pos;
- char function_name[1024];
- int file_line;
-
- rc = dladdr (address, &info);
- if ((rc == 0) || !info.dli_fname || !info.dli_fname[0])
- {
- weechat_backtrace_printf ("%03d %s\n", number, symbol);
- return;
- }
-
- addr = address;
- if (info.dli_fbase >= (const void *) 0x40000000)
- addr = (void *)((unsigned long)((const char *) addr) - (unsigned long) info.dli_fbase);
-
- snprintf (cmd_line, sizeof (cmd_line),
- "addr2line --functions --demangle -e $(which %s) %p",
- info.dli_fname, addr);
- output = popen (cmd_line, "r");
- if (!output)
- {
- weechat_backtrace_printf ("%03d %s\n", number, symbol);
- return;
- }
- function_name[0] = '\0';
- file_line = 0;
- while (!feof (output))
- {
- ptr_line = fgets (line, sizeof (line) - 1, output);
- if (ptr_line && ptr_line[0])
- {
- pos = strchr (ptr_line, '\n');
- if (pos)
- pos[0] = '\0';
- if (strchr (ptr_line, ':'))
- {
- file_line = 1;
- weechat_backtrace_printf ("%03d %s%s%s%s\n",
- number,
- ptr_line,
- (function_name[0]) ? " [function " : "",
- function_name,
- (function_name[0]) ? "]" : "");
- function_name[0] = '\0';
- }
- else
- {
- if (function_name[0])
- weechat_backtrace_printf ("%03d %s",
- number, function_name);
- snprintf (function_name, sizeof (function_name),
- "%s", ptr_line);
- }
- }
- }
- if (function_name[0])
- weechat_backtrace_printf ("%03d %s\n",
- number, function_name);
- pclose (output);
-#else
- /* make C compiler happy */
- (void) number;
- (void) address;
- (void) symbol;
-#endif
-}
-
-/*
- * weechat_backtrace: display backtrace (called when a SIGSEGV is received)
- */
-
-void
-weechat_backtrace ()
-{
-#ifdef HAVE_BACKTRACE
- void *trace[BACKTRACE_MAX];
- int trace_size, i;
- char **symbols;
-#endif
-
- weechat_backtrace_printf ("======= WeeChat backtrace =======\n");
- weechat_backtrace_printf ("(written by %s, compiled on %s %s)\n",
- PACKAGE_STRING, __DATE__, __TIME__);
-
-#ifdef HAVE_BACKTRACE
- trace_size = backtrace (trace, BACKTRACE_MAX);
- symbols = backtrace_symbols (trace, trace_size);
-
- for (i = 0; i < trace_size; i++)
- {
- weechat_backtrace_addr2line (i + 1, trace[i], symbols[i]);
- }
-#else
- weechat_backtrace_printf (" No backtrace info (no debug info available "
- "or no backtrace possible on your system).\n");
-#endif
-
- weechat_backtrace_printf ("======= End of backtrace =======\n");
-}
diff --git a/src/common/backtrace.h b/src/common/backtrace.h
deleted file mode 100644
index 80a2c8f41..000000000
--- a/src/common/backtrace.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_BACKTACE_H
-#define __WEECHAT_BACKTACE_H 1
-
-#define BACKTRACE_MAX 128
-
-extern void weechat_backtrace ();
-
-#endif /* backtrace.h */
diff --git a/src/common/command.c b/src/common/command.c
deleted file mode 100644
index 337a961a2..000000000
--- a/src/common/command.c
+++ /dev/null
@@ -1,4521 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* command.c: WeeChat internal commands */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "weechat.h"
-#include "command.h"
-#include "alias.h"
-#include "fifo.h"
-#include "log.h"
-#include "session.h"
-#include "utf8.h"
-#include "util.h"
-#include "weelist.h"
-#include "weeconfig.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-#ifdef PLUGINS
-#include "../plugins/plugins.h"
-#endif
-
-
-/* WeeChat internal commands */
-
-t_weechat_command weechat_commands[] =
-{ { "alias", N_("create an alias for a command"),
- N_("[alias_name [command [arguments]]]"),
- N_("alias_name: name of alias\n"
- " command: command name (WeeChat or IRC command, many commands "
- "can be separated by semicolons)\n"
- " arguments: arguments for command\n\n"
- "Note: in command, special variables $1, $2,..,$9 are replaced by "
- "arguments given by user, and $* is replaced by all arguments.\n"
- "Variables $nick, $channel and $server are replaced by current "
- "nick/channel/server."),
- "%- %A", 0, MAX_ARGS, 1, NULL, weechat_cmd_alias },
- { "buffer", N_("manage buffers"),
- N_("[action [args] | number | [[server] [channel]]]"),
- N_(" action: action to do:\n"
- " move: move buffer in the list (may be relative, for example -1)\n"
- " close: close buffer (optional arg is part message, for a channel)\n"
- " list: list open buffers (no parameter implies this list)\n"
- " notify: set notify level for buffer (0=never, 1=highlight, 2=1+msg, "
- "3=2+join/part)\n"
- " (when executed on server buffer, this sets default notify "
- "level for whole server)\n"
- " scroll: scroll in history (may be relative, and may end by a letter: "
- "s=sec, m=min, h=hour, d=day, M=month, y=year); if there is "
- "only letter, then scroll to beginning of this item\n\n"
- " number: jump to buffer by number\n"
- "server,\n"
- "channel: jump to buffer by server and/or channel name\n\n"
- "Examples:\n"
- " move buffer: /buffer move 5\n"
- " close buffer: /buffer close this is part msg\n"
- " set notify: /buffer notify 2\n"
- " scroll 1 day up: /buffer scroll 1d == /buffer scroll -1d == /buffer scroll -24h\n"
- "scroll to beginning\n"
- " of this day: /buffer scroll d\n"
- " scroll 15 min down: /buffer scroll +15m\n"
- " scroll 20 msgs up: /buffer scroll -20\n"
- " jump to #weechat: /buffer #weechat"),
- "move|close|list|notify|scroll|%S|%C %S|%C", 0, MAX_ARGS, 0, NULL, weechat_cmd_buffer },
- { "builtin", N_("launch WeeChat/IRC builtin command (do not look at plugins handlers or aliases)"),
- N_("command"),
- N_("command: command to execute (a '/' is automatically added if not found at beginning of command)\n"),
- "%w|%i", 0, MAX_ARGS, 1, NULL, weechat_cmd_builtin },
- { "clear", N_("clear window(s)"),
- N_("[-all | number [number ...]]"),
- N_(" -all: clear all buffers\n"
- "number: clear buffer by number"),
- "-all", 0, MAX_ARGS, 0, weechat_cmd_clear, NULL },
- { "connect", N_("connect to server(s)"),
- N_("[-all [-nojoin] | servername [servername ...] [-nojoin] | hostname "
- "[-port port] [-ipv6] [-ssl]]"),
- N_(" -all: connect to all servers\n"
- "servername: internal server name to connect\n"
- " -nojoin: do not join any channel (even if autojoin is enabled on server)\n"
- " hostname: hostname to connect, creating temporary server\n"
- " port: port for server (integer, default is 6667)\n"
- " ipv6: use IPv6 protocol\n"
- " ssl: use SSL protocol"),
- "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, weechat_cmd_connect, NULL },
- { "disconnect", N_("disconnect from server(s)"),
- N_("[-all | servername [servername ...]]"),
- N_(" -all: disconnect from all servers\n"
- "servername: server name to disconnect"),
- "%S|-all", 0, MAX_ARGS, 0, weechat_cmd_disconnect, NULL },
- { "dcc", N_("starts DCC (file or chat) or close chat"),
- N_("action [nickname [file]]"),
- N_(" action: 'send' (file) or 'chat' or 'close' (chat)\n"
- "nickname: nickname to send file or chat\n"
- " file: filename (on local host)"),
- "chat|send|close %n %f", 1, MAX_ARGS, 0, NULL, weechat_cmd_dcc },
- { "debug", N_("print debug messages"),
- N_("dump | buffer | windows"),
- N_(" dump: save memory dump in WeeChat log file (same dump is written when WeeChat crashes)\n"
- " buffer: dump buffer content with hexadecimal values in log file\n"
- "windows: display windows tree"),
- "dump|buffer|windows", 1, 1, 0, weechat_cmd_debug, NULL },
- { "help", N_("display help about commands"),
- N_("[command]"),
- N_("command: name of a WeeChat or IRC command"),
- "%w|%i|%h", 0, 1, 0, weechat_cmd_help, NULL },
- { "history", N_("show buffer command history"),
- N_("[clear | value]"),
- N_("clear: clear history\n"
- "value: number of history entries to show"),
- "clear", 0, 1, 0, weechat_cmd_history, NULL },
- { "ignore", N_("ignore IRC messages and/or hosts"),
- N_("[mask [[type | command] [channel [server]]]]"),
- N_(" mask: nick or host mask to ignore\n"
- " type: type of message to ignore (action, ctcp, dcc, pv)\n"
- "command: IRC command\n"
- "channel: name of channel for ignore\n"
- " server: name of server for ignore\n\n"
- "For each argument, '*' means all.\n"
- "Without argument, /ignore command lists all defined ignore."),
- "*|%n *|action|ctcp|dcc|pv|%I *|%c *|%s",
- 0, 4, 0, weechat_cmd_ignore, NULL },
- { "key", N_("bind/unbind keys"),
- N_("[key [function/command]] [unbind key] [functions] [call function [\"args\"]] [reset -yes]"),
- N_(" key: display or bind this key to an internal function or a command "
- "(beginning by \"/\")\n"
- " unbind: unbind a key\n"
- "functions: list internal functions for key bindings\n"
- " call: call a function by name (with optional arguments)\n"
- " reset: restore bindings to the default values and delete ALL "
- "personal bindings (use carefully!)"),
- "unbind|functions|call|reset %k", 0, MAX_ARGS, 0, NULL, weechat_cmd_key },
-/* { "panel", N_("manage panels"),
- N_("[list | add type position size | resize # size | close # | move #1 #2]"),
- N_(" list: list open panels (no parameter implies this list)\n"
- " add: add a panel, type is global|local, position is top|bottom|left|right\n"
- " resize: resize a panel with a new size (may be relative, for example -1)\n"
- " close: close a panel by number\n"
- " move: move a panel to another number (may be relative, for example -1)"),
- "list|add|close|move global|local top|bottom|left|right",
- 0, MAX_ARGS, 0, weechat_cmd_panel, NULL },*/
- { "plugin", N_("list/load/unload plugins"),
- N_("[list [name]] | [listfull [name]] | [load filename] | [autoload] | [reload [name]] | [unload [name]]"),
- N_(" list: list loaded plugins\n"
- "listfull: list loaded plugins with detailed info for each plugin\n"
- " load: load a plugin\n"
- "autoload: autoload plugins in system or user directory\n"
- " reload: reload one plugin (if no name given, unload all plugins, then autoload plugins)\n"
- " unload: unload one or all plugins\n\n"
- "Without argument, /plugin command lists loaded plugins."),
- "list|listfull|load|autoload|reload|unload %P", 0, 2, 0, weechat_cmd_plugin, NULL },
- { "reconnect", N_("reconnect to server(s)"),
- N_("[-all [-nojoin] | servername [servername ...] [-nojoin]]"),
- N_(" -all: reconnect to all servers\n"
- "servername: server name to reconnect\n"
- " -nojoin: do not join any channel (even if autojoin is enabled on server)"),
- "%S|-all|-nojoin|%*", 0, MAX_ARGS, 0, weechat_cmd_reconnect, NULL },
- { "save", N_("save config to disk"),
- N_("[file]"), N_("file: filename for writing config"),
- NULL, 0, 1, 0, weechat_cmd_save, NULL },
- { "server", N_("list, add or remove servers"),
- N_("[list [servername]] | [listfull [servername]] | [add servername "
- "hostname [-port port] [-temp] [-auto | -noauto] [-ipv6] [-ssl] "
- "[-pwd password] [-nicks nick1 nick2 nick3] [-username username] "
- "[-realname realname] [-command command] [-autojoin channel[,channel]] ] "
- "| [copy servername newservername] | [rename servername newservername] "
- "| [keep servername] | [del servername]"),
- N_(" list: list servers (no parameter implies this list)\n"
- " listfull: list servers with detailed info for each server\n"
- " add: create a new server\n"
- "servername: server name, for internal and display use\n"
- " hostname: name or IP address of server\n"
- " port: port for server (integer, default is 6667)\n"
- " temp: create temporary server (not saved in config file)\n"
- " auto: automatically connect to server when WeeChat starts\n"
- " noauto: do not connect to server when WeeChat starts (default)\n"
- " ipv6: use IPv6 protocol\n"
- " ssl: use SSL protocol\n"
- " password: password for server\n"
- " nick1: first nick for server\n"
- " nick2: alternate nick for server\n"
- " nick3: second alternate nick for server\n"
- " username: user name\n"
- " realname: real name of user\n"
- " copy: duplicate a server\n"
- " rename: rename a server\n"
- " keep: keep server in config file (for temporary servers only)\n"
- " del: delete a server\n"
- " deloutq: delete messages out queue for all servers (all messages "
- "WeeChat is currently sending)"),
- "add|copy|rename|keep|del|deloutq|list|listfull %S %S",
- 0, MAX_ARGS, 0, weechat_cmd_server, NULL },
- { "set", N_("set config options"),
- N_("[option [ = value]]"),
- N_("option: name of an option (if name is full "
- "and no value is given, then help is displayed on option)\n"
- " value: value for option\n\n"
- "Option may be: servername.server_xxx where \"servername\" is an "
- "internal server name and \"xxx\" an option for this server."),
- "%o = %v", 0, MAX_ARGS, 0, NULL, weechat_cmd_set },
- { "setp", N_("set plugin config options"),
- N_("[option [ = value]]"),
- N_("option: name of a plugin option\n"
- " value: value for option\n\n"
- "Option is format: plugin.option, example: perl.myscript.item1"),
- "%O = %V", 0, MAX_ARGS, 0, NULL, weechat_cmd_setp },
- { "unalias", N_("remove an alias"),
- N_("alias_name"), N_("alias_name: name of alias to remove"),
- "%a", 1, 1, 0, NULL, weechat_cmd_unalias },
- { "unignore", N_("unignore IRC messages and/or hosts"),
- N_("[number | [mask [[type | command] [channel [server]]]]]"),
- N_(" number: # of ignore to unignore (number is displayed by list of ignore)\n"
- " mask: nick or host mask to unignore\n"
- " type: type of message to unignore (action, ctcp, dcc, pv)\n"
- "command: IRC command\n"
- "channel: name of channel for unignore\n"
- " server: name of server for unignore\n\n"
- "For each argument, '*' means all.\n"
- "Without argument, /unignore command lists all defined ignore."),
- "*|%n *|action|ctcp|dcc|pv|%I *|%c *|%s",
- 0, 4, 0, weechat_cmd_unignore, NULL },
- { "upgrade", N_("upgrade WeeChat without disconnecting from servers"),
- N_("[path_to_binary]"),
- N_("path_to_binary: path to WeeChat binary (default is current binary)\n\n"
- "This command run again a WeeChat binary, so it should have been compiled "
- "or installed with a package manager before running this command."),
- "%f", 0, 1, 0, weechat_cmd_upgrade, NULL },
- { "uptime", N_("show WeeChat uptime"),
- N_("[-o]"),
- N_("-o: send uptime on current channel as an IRC message"),
- "-o", 0, 1, 0, weechat_cmd_uptime, NULL },
- { "window", N_("manage windows"),
- N_("[list | -1 | +1 | b# | up | down | left | right | splith [pct] "
- "| splitv [pct] | resize pct | merge [all]]"),
- N_(" list: list open windows (no parameter implies this list)\n"
- " -1: jump to previous window\n"
- " +1: jump to next window\n"
- " b#: jump to next window displaying buffer number #\n"
- " up: switch to window above current one\n"
- " down: switch to window below current one\n"
- " left: switch to window on the left\n"
- " right: switch to window on the right\n"
- "splith: split current window horizontally\n"
- "splitv: split current window vertically\n"
- "resize: resize window size, new size is <pct> pourcentage of parent window\n"
- " merge: merge window with another (all = keep only one window)\n\n"
- "For splith and splitv, pct is a pourcentage which represents "
- "size of new window, computed with current window as size reference. "
- "For example 25 means create a new window with size = current_size / 4"),
- "list|-1|+1|up|down|left|right|splith|splitv|resize|merge all",
- 0, 2, 0, weechat_cmd_window, NULL },
- { NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL }
-};
-
-t_weelist *index_commands;
-t_weelist *last_index_command;
-
-
-/*
- * command_index_build: build an index of commands (internal, irc and alias)
- * This list will be sorted, and used for completion
- */
-
-void
-command_index_build ()
-{
- int i;
-
- index_commands = NULL;
- last_index_command = NULL;
- i = 0;
- while (weechat_commands[i].command_name)
- {
- (void) weelist_add (&index_commands, &last_index_command,
- weechat_commands[i].command_name,
- WEELIST_POS_SORT);
- i++;
- }
- i = 0;
- while (irc_commands[i].command_name)
- {
- if (irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
- (void) weelist_add (&index_commands, &last_index_command,
- irc_commands[i].command_name,
- WEELIST_POS_SORT);
- i++;
- }
-}
-
-/*
- * command_index_free: remove all commands in index
- */
-
-void
-command_index_free ()
-{
- while (index_commands)
- {
- weelist_remove (&index_commands, &last_index_command, index_commands);
- }
-}
-
-/*
- * command_used_by_weechat: return 1 if command is used by weechat
- * (weechat command, IRC command or alias)
- */
-
-int
-command_used_by_weechat (char *command)
-{
- t_weechat_alias *ptr_alias;
- int i;
-
- /* look for alias */
- for (ptr_alias = weechat_alias; ptr_alias;
- ptr_alias = ptr_alias->next_alias)
- {
- if (ascii_strcasecmp (ptr_alias->alias_name, command) == 0)
- return 1;
- }
-
- /* look for WeeChat command */
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- if (ascii_strcasecmp (weechat_commands[i].command_name, command) == 0)
- return 1;
- }
-
- /* look for IRC command */
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if ((ascii_strcasecmp (irc_commands[i].command_name, command) == 0) &&
- ((irc_commands[i].cmd_function_args) ||
- (irc_commands[i].cmd_function_1arg)))
- return 1;
- }
-
- /* no command/alias found */
- return 0;
-}
-
-/*
- * exec_weechat_command: executes a command (WeeChat internal or IRC)
- * if only_builtin == 1, then try only WeeChat/IRC commands
- * (not plugins neither aliases)
- * returns: 1 if command was executed succesfully
- * 0 if error (command not executed)
- */
-
-int
-exec_weechat_command (t_irc_server *server, t_irc_channel *channel, char *string,
- int only_builtin)
-{
- int i, rc, argc, argc2, return_code, length1, length2;
- char *command, *pos, *ptr_args, *ptr_args2;
- char **argv, **argv2, *alias_command;
- char **commands, **ptr_cmd, **ptr_next_cmd;
- char *args_replaced, *vars_replaced, *new_ptr_cmd;
- char *unknown_command;
- int some_args_replaced;
- t_weechat_alias *ptr_alias;
-
- if ((!string) || (!string[0]) || (string[0] != '/'))
- return 0;
-
- command = strdup (string);
-
- /* look for end of command */
- ptr_args = NULL;
-
- pos = &command[strlen (command) - 1];
- if (pos[0] == ' ')
- {
- while ((pos > command) && (pos[0] == ' '))
- pos--;
- pos[1] = '\0';
- }
-
- pos = strchr (command, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- ptr_args = pos;
- if (!ptr_args[0])
- ptr_args = NULL;
- }
-
-#ifdef PLUGINS
- if (only_builtin)
- rc = -1;
- else
- {
- vars_replaced = alias_replace_vars (server, channel, ptr_args);
- rc = plugin_cmd_handler_exec ((server) ? server->name : "", command + 1,
- (vars_replaced) ? vars_replaced : ptr_args);
- if (vars_replaced)
- free (vars_replaced);
- }
-#else
- rc = -1;
-#endif
- switch (rc)
- {
- case 0: /* plugin handler KO */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s command \"%s\" failed\n"),
- WEECHAT_ERROR, command + 1);
- break;
- case 1: /* plugin handler OK, executed */
- break;
- default: /* plugin handler not found */
- argv = explode_string (ptr_args, " ", 0, &argc);
-
- /* look for alias */
- if (!only_builtin)
- {
- for (ptr_alias = weechat_alias; ptr_alias;
- ptr_alias = ptr_alias->next_alias)
- {
- if (ascii_strcasecmp (ptr_alias->alias_name, command + 1) == 0)
- {
- if (ptr_alias->running == 1)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s circular reference when calling alias \"/%s\"\n"),
- WEECHAT_ERROR, ptr_alias->alias_name);
- }
- else
- {
- /* an alias can contain many commands separated by ';' */
- commands = split_multi_command (ptr_alias->alias_command, ';');
- if (commands)
- {
- some_args_replaced = 0;
- ptr_alias->running = 1;
- for (ptr_cmd=commands; *ptr_cmd; ptr_cmd++)
- {
- ptr_next_cmd = ptr_cmd;
- ptr_next_cmd++;
-
- vars_replaced = alias_replace_vars (server, channel, *ptr_cmd);
- new_ptr_cmd = (vars_replaced) ? vars_replaced : *ptr_cmd;
- args_replaced = alias_replace_args (new_ptr_cmd, ptr_args);
- if (args_replaced)
- {
- some_args_replaced = 1;
- if (*ptr_cmd[0] == '/')
- (void) exec_weechat_command (server, channel, args_replaced, only_builtin);
- else
- {
- alias_command = (char *) malloc (1 + strlen(args_replaced) + 1);
- if (alias_command)
- {
- strcpy (alias_command, "/");
- strcat (alias_command, args_replaced);
- (void) exec_weechat_command (server, channel, alias_command, only_builtin);
- free (alias_command);
- }
- }
- free (args_replaced);
- }
- else
- {
- /* if alias has arguments, they are now
- arguments of the last command in the list (if no $1,$2,..$*) was found */
- if ((*ptr_next_cmd == NULL) && ptr_args && (!some_args_replaced))
- {
- length1 = strlen (new_ptr_cmd);
- length2 = strlen (ptr_args);
-
- alias_command = (char *) malloc ( 1 + length1 + 1 + length2 + 1);
- if (alias_command)
- {
- if (*ptr_cmd[0] != '/')
- strcpy (alias_command, "/");
- else
- strcpy (alias_command, "");
-
- strcat (alias_command, new_ptr_cmd);
- strcat (alias_command, " ");
- strcat (alias_command, ptr_args);
-
- (void) exec_weechat_command (server, channel, alias_command, only_builtin);
- free (alias_command);
- }
- }
- else
- {
- if (*ptr_cmd[0] == '/')
- (void) exec_weechat_command (server, channel, new_ptr_cmd, only_builtin);
- else
- {
- alias_command = (char *) malloc (1 + strlen (new_ptr_cmd) + 1);
- if (alias_command)
- {
- strcpy (alias_command, "/");
- strcat (alias_command, new_ptr_cmd);
- (void) exec_weechat_command (server, channel, alias_command, only_builtin);
- free (alias_command);
- }
- }
- }
- }
- if (vars_replaced)
- free (vars_replaced);
- }
- ptr_alias->running = 0;
- free_multi_command (commands);
- }
- }
- free_exploded_string (argv);
- free (command);
- return 1;
- }
- }
- }
-
- /* look for WeeChat command */
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- if (ascii_strcasecmp (weechat_commands[i].command_name, command + 1) == 0)
- {
- if ((argc < weechat_commands[i].min_arg)
- || (argc > weechat_commands[i].max_arg))
- {
- if (weechat_commands[i].min_arg ==
- weechat_commands[i].max_arg)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- NG_("%s wrong argument count for %s command \"%s\" "
- "(expected: %d arg)\n",
- "%s wrong argument count for %s command \"%s\" "
- "(expected: %d args)\n",
- weechat_commands[i].max_arg),
- WEECHAT_ERROR, PACKAGE_NAME,
- command + 1,
- weechat_commands[i].max_arg);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- NG_("%s wrong argument count for %s command \"%s\" "
- "(expected: between %d and %d arg)\n",
- "%s wrong argument count for %s command \"%s\" "
- "(expected: between %d and %d args)\n",
- weechat_commands[i].max_arg),
- WEECHAT_ERROR, PACKAGE_NAME,
- command + 1,
- weechat_commands[i].min_arg,
- weechat_commands[i].max_arg);
- }
- }
- else
- {
- ptr_args2 = (ptr_args) ? (char *)gui_color_encode ((unsigned char *)ptr_args,
- (weechat_commands[i].conversion
- && cfg_irc_colors_send)) : NULL;
- if (weechat_commands[i].cmd_function_args)
- {
- argv2 = explode_string ((ptr_args2) ? ptr_args2 : ptr_args,
- " ", 0, &argc2);
- return_code = (int) (weechat_commands[i].cmd_function_args)
- (server, channel, argc2, argv2);
- free_exploded_string (argv2);
- }
- else
- return_code = (int) (weechat_commands[i].cmd_function_1arg)
- (server, channel, (ptr_args2) ? ptr_args2 : ptr_args);
- if (return_code < 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s command \"%s\" failed\n"),
- WEECHAT_ERROR, command + 1);
- }
- if (ptr_args2)
- free (ptr_args2);
- }
- free_exploded_string (argv);
- free (command);
- return 1;
- }
- }
-
- /* look for IRC command */
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if ((ascii_strcasecmp (irc_commands[i].command_name, command + 1) == 0) &&
- ((irc_commands[i].cmd_function_args) ||
- (irc_commands[i].cmd_function_1arg)))
- {
- if ((argc < irc_commands[i].min_arg)
- || (argc > irc_commands[i].max_arg))
- {
- if (irc_commands[i].min_arg == irc_commands[i].max_arg)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf
- (NULL,
- NG_("%s wrong argument count for IRC command \"%s\" "
- "(expected: %d arg)\n",
- "%s wrong argument count for IRC command \"%s\" "
- "(expected: %d args)\n",
- irc_commands[i].max_arg),
- WEECHAT_ERROR,
- command + 1,
- irc_commands[i].max_arg);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf
- (NULL,
- NG_("%s wrong argument count for IRC command \"%s\" "
- "(expected: between %d and %d arg)\n",
- "%s wrong argument count for IRC command \"%s\" "
- "(expected: between %d and %d args)\n",
- irc_commands[i].max_arg),
- WEECHAT_ERROR,
- command + 1,
- irc_commands[i].min_arg, irc_commands[i].max_arg);
- }
- }
- else
- {
- if ((irc_commands[i].needs_connection) &&
- ((!server) || (!server->is_connected)))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s command \"%s\" needs a server connection!\n"),
- WEECHAT_ERROR, irc_commands[i].command_name);
- free (command);
- return 0;
- }
- if (channel && channel->dcc_chat)
- {
- irc_display_prefix (server, channel->buffer, GUI_PREFIX_ERROR);
- gui_printf (channel->buffer,
- _("%s command \"%s\" can not be "
- "executed on DCC CHAT buffer\n"),
- WEECHAT_ERROR,
- irc_commands[i].command_name);
- free (command);
- return 0;
- }
- ptr_args2 = (ptr_args) ? (char *)gui_color_encode ((unsigned char *)ptr_args,
- (irc_commands[i].conversion
- && cfg_irc_colors_send)) : NULL;
- if (irc_commands[i].cmd_function_args)
- {
- argv2 = explode_string ((ptr_args2) ? ptr_args2 : ptr_args,
- " ", 0, &argc2);
- return_code = (int) (irc_commands[i].cmd_function_args)
- (server, channel, argc2, argv2);
- free_exploded_string (argv2);
- }
- else
- return_code = (int) (irc_commands[i].cmd_function_1arg)
- (server, channel, (ptr_args2) ? ptr_args2 : ptr_args);
- if (return_code < 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s command \"%s\" failed\n"),
- WEECHAT_ERROR, command + 1);
- }
- if (ptr_args2)
- free (ptr_args2);
- }
- free_exploded_string (argv);
- free (command);
- return 1;
- }
- }
-
- /* should we send unknown command to IRC server? */
- if (cfg_irc_send_unknown_commands)
- {
- if (ptr_args)
- unknown_command = (char *)malloc (strlen (command + 1) + 1 + strlen (ptr_args) + 1);
- else
- unknown_command = (char *)malloc (strlen (command + 1) + 1);
-
- if (unknown_command)
- {
- strcpy (unknown_command, command + 1);
- if (ptr_args)
- {
- strcat (unknown_command, " ");
- strcat (unknown_command, ptr_args);
- }
- irc_send_cmd_quote (server, channel, unknown_command);
- free (unknown_command);
- }
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown command \"%s\" (type /help for help). "
- "To send unknown commands to IRC server, enable option "
- "irc_send_unknown_commands.\n"),
- WEECHAT_ERROR,
- command + 1);
- }
-
- free_exploded_string (argv);
- }
- free (command);
- return 0;
-}
-
-/*
- * user_message_display: display user message
- */
-
-void
-user_message_display (t_irc_server *server, t_gui_buffer *buffer, char *text)
-{
- t_irc_nick *ptr_nick;
-
- if ((GUI_CHANNEL(buffer)->type == IRC_CHANNEL_TYPE_PRIVATE)
- || (GUI_CHANNEL(buffer)->type == IRC_CHANNEL_TYPE_DCC_CHAT))
- {
- irc_display_nick (buffer, NULL, server->nick,
- GUI_MSG_TYPE_NICK, 1, GUI_COLOR_WIN_NICK_SELF, 0);
- gui_printf_type (buffer,
- GUI_MSG_TYPE_MSG,
- "%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- text);
- }
- else
- {
- ptr_nick = irc_nick_search (GUI_CHANNEL(buffer), server->nick);
- if (ptr_nick)
- {
- irc_display_nick (buffer, ptr_nick, NULL,
- GUI_MSG_TYPE_NICK, 1, -1, 0);
- gui_printf_type (buffer,
- GUI_MSG_TYPE_MSG,
- "%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- text);
- }
- else
- {
- irc_display_prefix (server, server->buffer, GUI_PREFIX_ERROR);
- gui_printf (server->buffer,
- _("%s cannot find nick for sending message\n"),
- WEECHAT_ERROR);
- }
- }
-}
-
-/*
- * user_message: send a PRIVMSG message, and split it if > 512 bytes
- */
-
-void
-user_message (t_irc_server *server, t_gui_buffer *buffer, char *text)
-{
- int max_length;
- char *pos, *pos_next, *pos_max, *next, saved_char, *last_space;
-
- if (!text || !text[0])
- return;
-
- if (!server->is_connected)
- {
- irc_display_prefix (server, buffer, GUI_PREFIX_ERROR);
- gui_printf (buffer, _("%s you are not connected to server\n"),
- WEECHAT_ERROR);
- return;
- }
-
- next = NULL;
- last_space = NULL;
- saved_char = '\0';
-
- max_length = 512 - 16 - 65 - 10 - strlen (server->nick) -
- strlen (GUI_CHANNEL(buffer)->name);
-
- if (max_length > 0)
- {
- if ((int)strlen (text) > max_length)
- {
- pos = text;
- pos_max = text + max_length;
- while (pos && pos[0])
- {
- if (pos[0] == ' ')
- last_space = pos;
- pos_next = utf8_next_char (pos);
- if (pos_next > pos_max)
- break;
- pos = pos_next;
- }
- if (last_space && (last_space < pos))
- pos = last_space + 1;
- saved_char = pos[0];
- pos[0] = '\0';
- next = pos;
- }
- }
-
- irc_server_sendf_queued (server, "PRIVMSG %s :%s",
- GUI_CHANNEL(buffer)->name, text);
- user_message_display (server, buffer, text);
-
- if (next)
- {
- next[0] = saved_char;
- user_message (server, buffer, next);
- }
-}
-
-/*
- * is_command: return 1 if line is a command, 0 otherwise
- */
-
-int
-is_command (char *line)
-{
- char *pos_slash, *pos_space;
-
- if (strncmp (line, "/*", 2) == 0)
- return 0;
-
- pos_slash = strchr (line + 1, '/');
- pos_space = strchr (line + 1, ' ');
-
- return (line[0] == '/')
- && (!pos_slash || (pos_space && pos_slash > pos_space));
-}
-
-/*
- * user_command: interprets user command (if beginning with '/')
- * any other text is sent to the server, if connected
- */
-
-void
-user_command (t_irc_server *server, t_irc_channel *channel, char *command, int only_builtin)
-{
- t_gui_buffer *buffer;
- char *new_cmd, *ptr_cmd, *pos;
- char *command_with_colors;
-
- if ((!command) || (!command[0]) || (command[0] == '\r') || (command[0] == '\n'))
- return;
-
-#ifdef PLUGINS
- new_cmd = plugin_modifier_exec (PLUGIN_MODIFIER_IRC_USER,
- (server) ? server->name : "",
- command);
-#else
- new_cmd = NULL;
-#endif
-
- /* no changes in new command */
- if (new_cmd && (strcmp (command, new_cmd) == 0))
- {
- free (new_cmd);
- new_cmd = NULL;
- }
-
- /* message not dropped? */
- if (!new_cmd || new_cmd[0])
- {
- /* use new command (returned by plugin) */
- ptr_cmd = (new_cmd) ? new_cmd : command;
-
- while (ptr_cmd && ptr_cmd[0])
- {
- pos = strchr (ptr_cmd, '\n');
- if (pos)
- pos[0] = '\0';
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- if (is_command (ptr_cmd))
- {
- /* WeeChat internal command (or IRC command) */
- (void) exec_weechat_command (server, channel, ptr_cmd, only_builtin);
- }
- else
- {
- if ((ptr_cmd[0] == '/') && (ptr_cmd[1] == '/'))
- ptr_cmd++;
-
- if (server && (!GUI_BUFFER_IS_SERVER(buffer)))
- {
- command_with_colors = (char *)gui_color_encode ((unsigned char *)ptr_cmd,
- cfg_irc_colors_send);
-
- if (GUI_CHANNEL(buffer)->dcc_chat)
- {
- if (((t_irc_dcc *)(GUI_CHANNEL(buffer)->dcc_chat))->sock < 0)
- {
- irc_display_prefix (server, buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (buffer, "%s DCC CHAT is closed\n",
- WEECHAT_ERROR);
- }
- else
- {
- irc_dcc_chat_sendf ((t_irc_dcc *)(GUI_CHANNEL(buffer)->dcc_chat),
- "%s\r\n",
- (command_with_colors) ? command_with_colors : ptr_cmd);
- user_message_display (server, buffer,
- (command_with_colors) ?
- command_with_colors : ptr_cmd);
- }
- }
- else
- user_message (server, buffer,
- (command_with_colors) ? command_with_colors : ptr_cmd);
-
- if (command_with_colors)
- free (command_with_colors);
- }
- else
- {
- irc_display_prefix (NULL, (server) ? server->buffer : NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog ((server) ? server->buffer : NULL,
- _("This window is not a channel!\n"));
- }
- }
-
- if (pos)
- {
- pos[0] = '\n';
- ptr_cmd = pos + 1;
- }
- else
- ptr_cmd = NULL;
- }
- }
-}
-
-/*
- * weechat_cmd_alias: display or create alias
- */
-
-int
-weechat_cmd_alias (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- char *pos;
- t_weechat_alias *ptr_alias;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- if (arguments && arguments[0])
- {
- while (arguments[0] == '/')
- {
- arguments++;
- }
-
- /* Define new alias */
- pos = strchr (arguments, ' ');
- if (pos)
- {
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- if (!pos[0])
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s missing arguments for \"%s\" command\n"),
- WEECHAT_ERROR, "alias");
- return -1;
- }
- if (!alias_new (arguments, pos))
- return -1;
- if (weelist_add (&index_commands, &last_index_command, arguments,
- WEELIST_POS_SORT))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Alias \"%s\" => \"%s\" created\n"),
- arguments, pos);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("Failed to create alias \"%s\" => \"%s\" "
- "(not enough memory)\n"),
- arguments, pos);
- return -1;
- }
- }
- else
- {
- ptr_alias = alias_search (arguments);
- if (ptr_alias)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Alias:\n"));
- gui_printf (NULL, " %s %s=>%s %s\n",
- ptr_alias->alias_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_alias->alias_command);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No alias found.\n"));
- }
- }
- }
- else
- {
- /* List all aliases */
- if (weechat_alias)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("List of aliases:\n"));
- for (ptr_alias = weechat_alias; ptr_alias;
- ptr_alias = ptr_alias->next_alias)
- {
- gui_printf (NULL, " %s %s=>%s %s\n",
- ptr_alias->alias_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_alias->alias_command);
- }
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No alias defined.\n"));
- }
- }
- return 0;
-}
-
-/*
- * weechat_cmd_buffer_display_info: display info about a buffer
- */
-
-void
-weechat_cmd_buffer_display_info (t_gui_buffer *buffer)
-{
- switch (buffer->type)
- {
- case GUI_BUFFER_TYPE_STANDARD:
- if (GUI_BUFFER_IS_SERVER(buffer))
- {
- if (GUI_SERVER(buffer))
- gui_printf (NULL, _("%sServer: %s%s\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- GUI_SERVER(buffer)->name);
- else
- gui_printf (NULL, _("%snot connected\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- else if (GUI_BUFFER_IS_CHANNEL (buffer))
- gui_printf (NULL, _("%sChannel: %s%s %s(server: %s%s%s)\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- GUI_CHANNEL(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- GUI_SERVER(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- else if (GUI_BUFFER_IS_PRIVATE (buffer))
- gui_printf (NULL, _("%sPrivate with: %s%s %s(server: %s%s%s)\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK),
- GUI_CHANNEL(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- GUI_SERVER(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- else
- gui_printf (NULL, _("%sunknown\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- break;
- case GUI_BUFFER_TYPE_DCC:
- gui_printf (NULL, "%sDCC\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL));
- break;
- case GUI_BUFFER_TYPE_RAW_DATA:
- gui_printf (NULL, _("%sraw IRC data\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL));
- break;
- default:
- gui_printf (NULL, _("%sunknown\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- break;
- }
-}
-
-/*
- * weechat_cmd_buffer: manage buffers
- */
-
-int
-weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- t_gui_window *window;
- t_gui_buffer *buffer, *ptr_buffer;
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
- long number;
- char *error, *pos, **argv;
- int argc, target_buffer, count;
-
- gui_buffer_find_context (server, channel, &window, &buffer);
-
- argv = explode_string (arguments, " ", 0, &argc);
-
- if ((argc == 0) || ((argc == 1) && (ascii_strcasecmp (argv[0], "list") == 0)))
- {
- /* list open buffers */
-
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Open buffers:\n"));
-
- for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
- {
- gui_printf (NULL, "%s[%s%d%s] ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_buffer->number,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- weechat_cmd_buffer_display_info (ptr_buffer);
- }
- }
- else
- {
- if (ascii_strcasecmp (argv[0], "move") == 0)
- {
- /* move buffer to another number in the list */
-
- if (argc < 2)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s missing arguments for \"%s\" command\n"),
- WEECHAT_ERROR, "buffer");
- free_exploded_string (argv);
- return -1;
- }
-
- error = NULL;
- number = strtol (((argv[1][0] == '+') || (argv[1][0] == '-')) ? argv[1] + 1 : argv[1],
- &error, 10);
- if ((error) && (error[0] == '\0'))
- {
- if (argv[1][0] == '+')
- gui_buffer_move_to_number (buffer,
- buffer->number + ((int) number));
- else if (argv[1][0] == '-')
- gui_buffer_move_to_number (buffer,
- buffer->number - ((int) number));
- else
- gui_buffer_move_to_number (buffer, (int) number);
- }
- else
- {
- /* invalid number */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect buffer number\n"),
- WEECHAT_ERROR);
- free_exploded_string (argv);
- return -1;
- }
- }
- else if (ascii_strcasecmp (argv[0], "close") == 0)
- {
- /* close buffer (server or channel/private) */
-
- if ((!buffer->next_buffer)
- && (buffer == gui_buffers)
- && ((!buffer->all_servers)
- || (!GUI_SERVER(buffer))))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s can not close the single buffer\n"),
- WEECHAT_ERROR);
- free_exploded_string (argv);
- return -1;
- }
- if (GUI_BUFFER_IS_SERVER(buffer))
- {
- if (GUI_SERVER(buffer))
- {
- if (GUI_SERVER(buffer)->channels)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s can not close server buffer while channels "
- "are open\n"),
- WEECHAT_ERROR);
- free_exploded_string (argv);
- return -1;
- }
- irc_server_disconnect (GUI_SERVER(buffer), 0);
- ptr_server = GUI_SERVER(buffer);
- if (!buffer->all_servers)
- {
- gui_buffer_free (buffer, 1);
- ptr_server->buffer = NULL;
- }
- else
- {
- ptr_server->buffer = NULL;
- buffer->server = NULL;
- gui_window_switch_server (window);
- }
- gui_status_draw (gui_current_window->buffer, 1);
- gui_input_draw (gui_current_window->buffer, 1);
- }
- }
- else
- {
- if (GUI_CHANNEL(buffer)
- && (GUI_CHANNEL(buffer)->type == IRC_CHANNEL_TYPE_DCC_CHAT))
- {
- ptr_server = GUI_SERVER(buffer);
- ptr_channel = GUI_CHANNEL(buffer);
- gui_buffer_free (ptr_channel->buffer, 1);
- irc_channel_free (ptr_server, ptr_channel);
- gui_status_draw (gui_current_window->buffer, 1);
- gui_input_draw (gui_current_window->buffer, 1);
- }
- else
- {
- if (GUI_SERVER(buffer))
- {
- if (GUI_SERVER(buffer)->is_connected
- && GUI_CHANNEL(buffer)
- && GUI_CHANNEL(buffer)->nicks)
- {
- pos = strstr (arguments, "close ");
- if (pos)
- pos += 6;
- GUI_CHANNEL(buffer)->close = 1;
- irc_send_cmd_part (GUI_SERVER(buffer),
- GUI_CHANNEL(buffer),
- pos);
- }
- else
- {
- ptr_channel = GUI_CHANNEL(buffer);
- ptr_server = GUI_SERVER(buffer);
- gui_buffer_free (buffer, 1);
- if (ptr_channel)
- irc_channel_free (ptr_server, ptr_channel);
- }
- }
- else
- gui_buffer_free (buffer, 1);
- gui_status_draw (gui_current_window->buffer, 1);
- }
- }
- }
- else if (ascii_strcasecmp (argv[0], "notify") == 0)
- {
- if (argc < 2)
- {
- gui_printf (NULL, "\n");
-
- /* display default notify level for all connected servers */
- gui_printf (NULL, _("Default notify levels for servers:"));
- count = 0;
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (ptr_server->buffer)
- {
- gui_printf (NULL, " %s:%d",
- ptr_server->name,
- irc_server_get_default_notify_level (ptr_server));
- count++;
- }
- }
- if (count == 0)
- gui_printf (NULL, " -");
- gui_printf (NULL, "\n");
-
- /* display notify level for all buffers */
- gui_printf (NULL, _("Notify levels:"));
- for (ptr_buffer = gui_buffers; ptr_buffer;
- ptr_buffer = ptr_buffer->next_buffer)
- {
- gui_printf (NULL, " %d.%s:",
- ptr_buffer->number,
- (ptr_buffer->type == GUI_BUFFER_TYPE_DCC) ? "DCC" :
- ((ptr_buffer->type == GUI_BUFFER_TYPE_RAW_DATA) ? _("Raw IRC data") :
- ((GUI_BUFFER_IS_SERVER(ptr_buffer) && GUI_SERVER(ptr_buffer)) ? GUI_SERVER(ptr_buffer)->name :
- ((GUI_CHANNEL(ptr_buffer)) ? (GUI_CHANNEL(ptr_buffer)->name) : "-"))));
- if ((!GUI_BUFFER_IS_CHANNEL(ptr_buffer))
- && (!GUI_BUFFER_IS_PRIVATE(ptr_buffer)))
- gui_printf (NULL, "-");
- else
- gui_printf (NULL, "%d", ptr_buffer->notify_level);
- }
- gui_printf (NULL, "\n");
- }
- else
- {
- /* set notify level for buffer */
- error = NULL;
- number = strtol (argv[1], &error, 10);
- if ((error) && (error[0] == '\0'))
- {
- if ((number < GUI_NOTIFY_LEVEL_MIN) || (number > GUI_NOTIFY_LEVEL_MAX))
- {
- /* invalid highlight level */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect notify level (must be between %d and %d)\n"),
- WEECHAT_ERROR, GUI_NOTIFY_LEVEL_MIN, GUI_NOTIFY_LEVEL_MAX);
- free_exploded_string (argv);
- return -1;
- }
- if (!GUI_SERVER(buffer)
- || ((!GUI_BUFFER_IS_SERVER(buffer))
- && (!GUI_BUFFER_IS_CHANNEL(buffer))
- && (!GUI_BUFFER_IS_PRIVATE(buffer))))
- {
- /* invalid buffer type (only ok on server, channel or private) */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s incorrect buffer for notify "
- "(must be server, channel or private)\n"),
- WEECHAT_ERROR);
- free_exploded_string (argv);
- return -1;
- }
- if (GUI_BUFFER_IS_SERVER(buffer))
- {
- irc_server_set_default_notify_level (GUI_SERVER(buffer),
- number);
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("New default notify level for server %s%s%s: %s%d %s"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- GUI_SERVER(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- number,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- else
- {
- irc_channel_set_notify_level (GUI_SERVER(buffer),
- GUI_CHANNEL(buffer),
- number);
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("New notify level for %s%s%s: %s%d %s"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- GUI_CHANNEL(buffer)->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- number,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- switch (number)
- {
- case 0:
- gui_printf (NULL, _("(hotlist: never)\n"));
- break;
- case 1:
- gui_printf (NULL, _("(hotlist: highlights)\n"));
- break;
- case 2:
- gui_printf (NULL, _("(hotlist: highlights + messages)\n"));
- break;
- case 3:
- gui_printf (NULL, _("(hotlist: highlights + messages + join/part (all))\n"));
- break;
- default:
- gui_printf (NULL, "\n");
- break;
- }
- config_change_notify_levels ();
- }
- else
- {
- /* invalid number */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect notify level (must be between %d and %d)\n"),
- WEECHAT_ERROR, GUI_NOTIFY_LEVEL_MIN, GUI_NOTIFY_LEVEL_MAX);
- free_exploded_string (argv);
- return -1;
- }
- }
- }
- else if (ascii_strcasecmp (argv[0], "scroll") == 0)
- {
- if (argc >= 2)
- gui_buffer_scroll (window, argv[1]);
- }
- else
- {
- /* jump to buffer by number or server/channel name */
-
- if (argv[0][0] == '-')
- {
- /* relative jump '-' */
- error = NULL;
- number = strtol (argv[0] + 1, &error, 10);
- if ((error) && (error[0] == '\0'))
- {
- target_buffer = buffer->number - (int) number;
- if (target_buffer < 1)
- target_buffer = (last_gui_buffer) ?
- last_gui_buffer->number + target_buffer : 1;
- gui_buffer_switch_by_number (window,
- target_buffer);
- }
- }
- else if (argv[0][0] == '+')
- {
- /* relative jump '+' */
- error = NULL;
- number = strtol (argv[0] + 1, &error, 10);
- if ((error) && (error[0] == '\0'))
- {
- target_buffer = buffer->number + (int) number;
- if (last_gui_buffer && target_buffer > last_gui_buffer->number)
- target_buffer -= last_gui_buffer->number;
- gui_buffer_switch_by_number (window,
- target_buffer);
- }
- }
- else
- {
- /* absolute jump by number, or by server/channel name */
- error = NULL;
- number = strtol (argv[0], &error, 10);
- if ((error) && (error[0] == '\0'))
- gui_buffer_switch_by_number (window, (int) number);
- else
- {
- ptr_buffer = NULL;
- if (argc > 1)
- ptr_buffer = gui_buffer_search (argv[0], argv[1]);
- else
- {
- ptr_server = irc_server_search (argv[0]);
- if (ptr_server)
- ptr_buffer = gui_buffer_search (argv[0], NULL);
- else
- ptr_buffer = gui_buffer_search (NULL, argv[0]);
- }
- if (ptr_buffer)
- {
- gui_window_switch_to_buffer (window, ptr_buffer);
- gui_window_redraw_buffer (ptr_buffer);
- }
- }
- }
-
- }
- }
- free_exploded_string (argv);
- return 0;
-}
-
-/*
- * weechat_cmd_builtin: launch WeeChat/IRC builtin command
- */
-
-int
-weechat_cmd_builtin (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- char *command;
- int length;
-
- if (arguments && arguments[0])
- {
- if (arguments[0] == '/')
- user_command (server, channel, arguments, 1);
- else
- {
- length = strlen (arguments) + 2;
- command = (char *)malloc (length);
- if (command)
- {
- snprintf (command, length, "/%s", arguments);
- user_command (server, channel, command, 1);
- free (command);
- }
- }
- }
- return 0;
-}
-
-/*
- * weechat_cmd_clear: display or create alias
- */
-
-int
-weechat_cmd_clear (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- char *error;
- long number;
- int i;
-
- if (argc > 0)
- {
- if (ascii_strcasecmp (argv[0], "-all") == 0)
- gui_buffer_clear_all ();
- else
- {
- for (i = 0; i < argc; i++)
- {
- error = NULL;
- number = strtol (argv[i], &error, 10);
- if ((error) && (error[0] == '\0'))
- {
- buffer = gui_buffer_search_by_number (number);
- if (!buffer)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s buffer number \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[i], "clear");
- return -1;
- }
- gui_buffer_clear (buffer);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "clear");
- return -1;
- }
- }
- }
- }
- else
- {
- gui_buffer_find_context (server, channel, NULL, &buffer);
- gui_buffer_clear (buffer);
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_connect_one_server: connect to one server
- * return 0 if error, 1 if ok
- */
-
-int
-weechat_cmd_connect_one_server (t_gui_window *window, t_irc_server *server,
- int no_join)
-{
- if (server->is_connected)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s already connected to server \"%s\"!\n"),
- WEECHAT_ERROR, server->name);
- return 0;
- }
- if (server->child_pid > 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s currently connecting to server \"%s\"!\n"),
- WEECHAT_ERROR, server->name);
- return 0;
- }
- if (!server->buffer)
- {
- if (!gui_buffer_new (window, server, NULL,
- GUI_BUFFER_TYPE_STANDARD, 1))
- return 0;
- }
- if (irc_server_connect (server, no_join))
- {
- server->reconnect_start = 0;
- server->reconnect_join = (server->channels) ? 1 : 0;
- gui_status_draw (server->buffer, 1);
- }
-
- /* connect ok */
- return 1;
-}
-
-/*
- * weechat_cmd_connect: connect to server(s)
- */
-
-int
-weechat_cmd_connect (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_window *window;
- t_gui_buffer *buffer;
- t_irc_server *ptr_server, server_tmp;
- int i, nb_connect, connect_ok, all_servers, no_join, port, ipv6, ssl;
- char *error;
- long number;
-
- gui_buffer_find_context (server, channel, &window, &buffer);
-
- nb_connect = 0;
- connect_ok = 1;
- port = IRC_DEFAULT_PORT;
- ipv6 = 0;
- ssl = 0;
-
- all_servers = 0;
- no_join = 0;
- for (i = 0; i < argc; i++)
- {
- if (ascii_strcasecmp (argv[i], "-all") == 0)
- all_servers = 1;
- if (ascii_strcasecmp (argv[i], "-nojoin") == 0)
- no_join = 1;
- if (ascii_strcasecmp (argv[i], "-ipv6") == 0)
- ipv6 = 1;
- if (ascii_strcasecmp (argv[i], "-ssl") == 0)
- ssl = 1;
- if (ascii_strcasecmp (argv[i], "-port") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-port");
- return -1;
- }
- error = NULL;
- number = strtol (argv[++i], &error, 10);
- if ((error) && (error[0] == '\0'))
- port = number;
- }
- }
-
- if (all_servers)
- {
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- nb_connect++;
- if (!ptr_server->is_connected && (ptr_server->child_pid == 0))
- {
- if (!weechat_cmd_connect_one_server (window, ptr_server,
- no_join))
- connect_ok = 0;
- }
- }
- }
- else
- {
- for (i = 0; i < argc; i++)
- {
- if (argv[i][0] != '-')
- {
- nb_connect++;
- ptr_server = irc_server_search (argv[i]);
- if (ptr_server)
- {
- if (!weechat_cmd_connect_one_server (window, ptr_server,
- no_join))
- connect_ok = 0;
- }
- else
- {
- irc_server_init (&server_tmp);
- server_tmp.name = strdup (argv[i]);
- server_tmp.address = strdup (argv[i]);
- server_tmp.port = port;
- server_tmp.ipv6 = ipv6;
- server_tmp.ssl = ssl;
- ptr_server = irc_server_new (server_tmp.name,
- server_tmp.autoconnect,
- server_tmp.autoreconnect,
- server_tmp.autoreconnect_delay,
- 1, /* temp server */
- server_tmp.address,
- server_tmp.port,
- server_tmp.ipv6,
- server_tmp.ssl,
- server_tmp.password,
- server_tmp.nick1,
- server_tmp.nick2,
- server_tmp.nick3,
- server_tmp.username,
- server_tmp.realname,
- server_tmp.hostname,
- server_tmp.command,
- 1, /* command_delay */
- server_tmp.autojoin,
- 1, /* autorejoin */
- NULL);
- if (ptr_server)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s created (temporary server, NOT SAVED!)\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- server_tmp.name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- if (!weechat_cmd_connect_one_server (window, ptr_server, 0))
- connect_ok = 0;
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unable to create server \"%s\"\n"),
- WEECHAT_ERROR, argv[i]);
- }
- }
- }
- else
- {
- if (ascii_strcasecmp (argv[i], "-port") == 0)
- i++;
- }
- }
- }
-
- if (nb_connect == 0)
- connect_ok = weechat_cmd_connect_one_server (window, server, no_join);
-
- if (!connect_ok)
- return -1;
-
- return 0;
-}
-
-/*
- * weechat_cmd_dcc: DCC control (file or chat)
- */
-
-int
-weechat_cmd_dcc (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- t_gui_buffer *buffer;
- char *pos_nick, *pos_file;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- /* DCC SEND file */
- if (strncasecmp (arguments, "send", 4) == 0)
- {
- pos_nick = strchr (arguments, ' ');
- if (!pos_nick)
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (server->buffer,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "dcc send");
- return -1;
- }
- while (pos_nick[0] == ' ')
- pos_nick++;
-
- pos_file = strchr (pos_nick, ' ');
- if (!pos_file)
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (server->buffer,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "dcc send");
- return -1;
- }
- pos_file[0] = '\0';
- pos_file++;
- while (pos_file[0] == ' ')
- pos_file++;
-
- irc_dcc_send_request (server, IRC_DCC_FILE_SEND, pos_nick, pos_file);
- }
- /* DCC CHAT */
- else if (strncasecmp (arguments, "chat", 4) == 0)
- {
- pos_nick = strchr (arguments, ' ');
- if (!pos_nick)
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (server->buffer,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "dcc chat");
- return -1;
- }
- while (pos_nick[0] == ' ')
- pos_nick++;
-
- irc_dcc_send_request (server, IRC_DCC_CHAT_SEND, pos_nick, NULL);
- }
- /* close DCC CHAT */
- else if (ascii_strcasecmp (arguments, "close") == 0)
- {
- if (GUI_BUFFER_IS_PRIVATE(buffer) &&
- GUI_CHANNEL(buffer)->dcc_chat)
- {
- irc_dcc_close ((t_irc_dcc *)(GUI_CHANNEL(buffer)->dcc_chat),
- IRC_DCC_ABORTED);
- irc_dcc_redraw (1);
- }
- }
- /* unknown DCC action */
- else
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (server->buffer,
- _("%s wrong arguments for \"%s\" command\n"),
- WEECHAT_ERROR, "dcc");
- return -1;
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_debug_display_windows: display tree of windows
- */
-
-void
-weechat_cmd_debug_display_windows (t_gui_window_tree *tree, int indent)
-{
- int i;
-
- if (tree)
- {
- for (i = 0; i < indent; i++)
- gui_printf_nolog (NULL, " ");
-
- if (tree->window)
- {
- /* leaf */
- gui_printf_nolog (NULL, "leaf: %X (parent:%X), win=%X, child1=%X, child2=%X, %d,%d %dx%d, %d%%x%d%%\n",
- tree, tree->parent_node, tree->window,
- tree->child1, tree->child2,
- tree->window->win_x, tree->window->win_y,
- tree->window->win_width, tree->window->win_height,
- tree->window->win_width_pct, tree->window->win_height_pct);
- }
- else
- {
- /* node */
- gui_printf_nolog (NULL, "node: %X (parent:%X), win=%X, child1=%X, child2=%X)\n",
- tree, tree->parent_node, tree->window,
- tree->child1, tree->child2);
- }
-
- if (tree->child1)
- weechat_cmd_debug_display_windows (tree->child1, indent + 1);
- if (tree->child2)
- weechat_cmd_debug_display_windows (tree->child2, indent + 1);
- }
-}
-
-/*
- * weechat_cmd_debug: print debug messages
- */
-
-int
-weechat_cmd_debug (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- if (argc != 1)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "debug");
- return -1;
- }
-
- if (ascii_strcasecmp (argv[0], "dump") == 0)
- {
- weechat_dump (0);
- }
- else if (ascii_strcasecmp (argv[0], "buffer") == 0)
- {
- gui_buffer_dump_hexa (buffer);
- }
- else if (ascii_strcasecmp (argv[0], "windows") == 0)
- {
- gui_printf_nolog (NULL, "\n");
- gui_printf_nolog (NULL, "DEBUG: windows tree:\n");
- weechat_cmd_debug_display_windows (gui_windows_tree, 1);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "debug");
- return -1;
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_disconnect_one_server: disconnect from a server
- * return 0 if error, 1 if ok
- */
-
-int
-weechat_cmd_disconnect_one_server (t_irc_server *server)
-{
- if ((!server->is_connected) && (server->child_pid == 0)
- && (server->reconnect_start == 0))
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf (server->buffer,
- _("%s not connected to server \"%s\"!\n"),
- WEECHAT_ERROR, server->name);
- return 0;
- }
- if (server->reconnect_start > 0)
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_INFO);
- gui_printf (server->buffer,
- _("Auto-reconnection is cancelled\n"));
- }
- irc_send_quit_server (server, NULL);
- irc_server_disconnect (server, 0);
- gui_status_draw (server->buffer, 1);
-
- /* disconnect ok */
- return 1;
-}
-
-/*
- * weechat_cmd_disconnect: disconnect from server(s)
- */
-
-int
-weechat_cmd_disconnect (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- t_irc_server *ptr_server;
- int i, disconnect_ok;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- if (argc == 0)
- disconnect_ok = weechat_cmd_disconnect_one_server (server);
- else
- {
- disconnect_ok = 1;
-
- if (ascii_strcasecmp (argv[0], "-all") == 0)
- {
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if ((ptr_server->is_connected) || (ptr_server->child_pid != 0)
- || (ptr_server->reconnect_start != 0))
- {
- if (!weechat_cmd_disconnect_one_server (ptr_server))
- disconnect_ok = 0;
- }
- }
- }
- else
- {
- for (i = 0; i < argc; i++)
- {
- ptr_server = irc_server_search (argv[i]);
- if (ptr_server)
- {
- if (!weechat_cmd_disconnect_one_server (ptr_server))
- disconnect_ok = 0;
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s server \"%s\" not found\n"),
- WEECHAT_ERROR, argv[i]);
- disconnect_ok = 0;
- }
- }
- }
- }
-
- if (!disconnect_ok)
- return -1;
-
- return 0;
-}
-
-/*
- * weechat_cmd_help: display help
- */
-
-int
-weechat_cmd_help (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- int i;
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
- t_plugin_handler *ptr_handler;
-#endif
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- switch (argc)
- {
- case 0:
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("%s internal commands:\n"), PACKAGE_NAME);
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- gui_printf (NULL, " %s%s %s- %s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- weechat_commands[i].command_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- _(weechat_commands[i].command_description));
- }
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("IRC commands:\n"));
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if (irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
- {
- gui_printf (NULL, " %s%s %s- %s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- irc_commands[i].command_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- _(irc_commands[i].command_description));
- }
- }
-#ifdef PLUGINS
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Plugin commands:\n"));
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_COMMAND)
- {
- gui_printf (NULL, " %s%s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_handler->command);
- if (ptr_handler->description
- && ptr_handler->description[0])
- gui_printf (NULL, " %s- %s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_handler->description);
- gui_printf (NULL, "\n");
- }
- }
- }
-#endif
- break;
- case 1:
-#ifdef PLUGINS
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if ((ptr_handler->type == PLUGIN_HANDLER_COMMAND)
- && (ascii_strcasecmp (ptr_handler->command, argv[0]) == 0))
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "[p]");
- gui_printf (NULL, " %s/%s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_handler->command);
- if (ptr_handler->arguments &&
- ptr_handler->arguments[0])
- gui_printf (NULL, " %s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_handler->arguments);
- else
- gui_printf (NULL, "\n");
- if (ptr_handler->description &&
- ptr_handler->description[0])
- gui_printf (NULL, "\n%s\n",
- ptr_handler->description);
- if (ptr_handler->arguments_description &&
- ptr_handler->arguments_description[0])
- gui_printf (NULL, "\n%s\n",
- ptr_handler->arguments_description);
- return 0;
- }
- }
- }
-#endif
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- if (ascii_strcasecmp (weechat_commands[i].command_name, argv[0]) == 0)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "[w]");
- gui_printf (NULL, " %s/%s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- weechat_commands[i].command_name);
- if (weechat_commands[i].arguments &&
- weechat_commands[i].arguments[0])
- gui_printf (NULL, " %s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- _(weechat_commands[i].arguments));
- else
- gui_printf (NULL, "\n");
- if (weechat_commands[i].command_description &&
- weechat_commands[i].command_description[0])
- gui_printf (NULL, "\n%s\n",
- _(weechat_commands[i].command_description));
- if (weechat_commands[i].arguments_description &&
- weechat_commands[i].arguments_description[0])
- gui_printf (NULL, "\n%s\n",
- _(weechat_commands[i].arguments_description));
- return 0;
- }
- }
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if ((ascii_strcasecmp (irc_commands[i].command_name, argv[0]) == 0)
- && (irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg))
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "[i]");
- gui_printf (NULL, " %s/%s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- irc_commands[i].command_name);
- if (irc_commands[i].arguments &&
- irc_commands[i].arguments[0])
- gui_printf (NULL, " %s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- _(irc_commands[i].arguments));
- else
- gui_printf (NULL, "\n");
- if (irc_commands[i].command_description &&
- irc_commands[i].command_description[0])
- gui_printf (NULL, "\n%s\n",
- _(irc_commands[i].command_description));
- if (irc_commands[i].arguments_description &&
- irc_commands[i].arguments_description[0])
- gui_printf (NULL, "\n%s\n",
- _(irc_commands[i].arguments_description));
- return 0;
- }
- }
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("No help available, \"%s\" is an unknown command\n"),
- argv[0]);
- break;
- }
- return 0;
-}
-
-/*
- * weechat_cmd_history: display current buffer history
- */
-
-int
-weechat_cmd_history (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- t_history *ptr_history;
- int n;
- int n_total;
- int n_user;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- n_user = cfg_history_display_default;
-
- if (argc == 1)
- {
- if (ascii_strcasecmp (argv[0], "clear") == 0)
- {
- history_buffer_free (buffer);
- return 0;
- }
- else
- n_user = atoi (argv[0]);
- }
-
- if (buffer->history)
- {
- n_total = 1;
- for (ptr_history = buffer->history;
- ptr_history->next_history;
- ptr_history = ptr_history->next_history)
- {
- n_total++;
- }
- for (n = 0; ptr_history; ptr_history = ptr_history->prev_history, n++)
- {
- if ((n_user > 0) && ((n_total - n_user) > n))
- continue;
- irc_display_prefix (NULL, buffer, GUI_PREFIX_INFO);
- gui_printf_nolog (buffer, "%s\n", ptr_history->text);
- }
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_ignore_display: display an ignore entry
- */
-
-void
-weechat_cmd_ignore_display (char *text, t_irc_ignore *ptr_ignore)
-{
- if (text)
- gui_printf (NULL, "%s%s ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- text);
-
- gui_printf (NULL, _("%son %s%s%s/%s%s%s:%s ignoring %s%s%s from %s%s\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_ignore->server_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_ignore->channel_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_ignore->type,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- ptr_ignore->mask);
-}
-
-/*
- * weechat_cmd_ignore: ignore IRC commands and/or hosts
- */
-
-int
-weechat_cmd_ignore (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- t_irc_ignore *ptr_ignore;
- int i;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- ptr_ignore = NULL;
- switch (argc)
- {
- case 0:
- /* List all ignore */
- if (irc_ignore)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("List of ignore:\n"));
- i = 0;
- for (ptr_ignore = irc_ignore; ptr_ignore;
- ptr_ignore = ptr_ignore->next_ignore)
- {
- i++;
- gui_printf (NULL, "%s[%s%d%s] ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- i,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- weechat_cmd_ignore_display (NULL, ptr_ignore);
- }
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No ignore defined.\n"));
- }
- return 0;
- break;
- case 1:
- ptr_ignore = irc_ignore_add (argv[0], "*", "*",
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 2:
- ptr_ignore = irc_ignore_add (argv[0], argv[1], "*",
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 3:
- ptr_ignore = irc_ignore_add (argv[0], argv[1], argv[2],
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 4:
- ptr_ignore = irc_ignore_add (argv[0], argv[1], argv[2], argv[3]);
- break;
- }
- if (ptr_ignore)
- {
- gui_printf (NULL, "\n");
- weechat_cmd_ignore_display (_("New ignore:"), ptr_ignore);
- return 0;
- }
- else
- return -1;
-}
-
-/*
- * weechat_cmd_key_display: display a key binding
- */
-
-void
-weechat_cmd_key_display (t_gui_key *key, int new_key)
-{
- char *expanded_name;
-
- expanded_name = gui_keyboard_get_expanded_name (key->key);
- if (new_key)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("New key binding: %s"),
- (expanded_name) ? expanded_name : key->key);
- }
- else
- gui_printf (NULL, " %20s", (expanded_name) ? expanded_name : key->key);
- gui_printf (NULL, "%s => %s%s%s%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- (key->function) ?
- gui_keyboard_function_search_by_ptr (key->function) : key->command,
- (key->args) ? " \"" : "",
- (key->args) ? key->args : "",
- (key->args) ? "\"" : "");
- if (expanded_name)
- free (expanded_name);
-}
-
-/*
- * weechat_cmd_key: bind/unbind keys
- */
-
-int
-weechat_cmd_key (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- t_gui_window *window;
- t_gui_buffer *buffer;
- char *pos, *pos_args, *args_tmp, *internal_code;
- int i, length;
- t_gui_key *ptr_key;
- void (*ptr_function)(t_gui_window *, char *);
-
- gui_buffer_find_context (server, channel, &window, &buffer);
-
- if (arguments)
- {
- while (arguments[0] == ' ')
- arguments++;
- }
-
- if (!arguments || (arguments[0] == '\0'))
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Key bindings:\n"));
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
- {
- weechat_cmd_key_display (ptr_key, 0);
- }
- }
- else if (ascii_strncasecmp (arguments, "unbind ", 7) == 0)
- {
- arguments += 7;
- while (arguments[0] == ' ')
- arguments++;
- if (gui_keyboard_unbind (arguments))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Key \"%s\" unbound\n"), arguments);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unable to unbind key \"%s\"\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
- }
- else if (ascii_strcasecmp (arguments, "functions") == 0)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Internal key functions:\n"));
- i = 0;
- while (gui_key_functions[i].function_name)
- {
- gui_printf (NULL, "%25s %s\n",
- gui_key_functions[i].function_name,
- _(gui_key_functions[i].description));
- i++;
- }
- }
- else if (ascii_strncasecmp (arguments, "call ", 5) == 0)
- {
- arguments += 5;
- while (arguments[0] == ' ')
- arguments++;
- pos = strchr (arguments, ' ');
- if (pos)
- pos[0] = '\0';
- ptr_function = gui_keyboard_function_search_by_name (arguments);
- if (pos)
- pos[0] = ' ';
- if (ptr_function)
- {
- pos_args = pos;
- args_tmp = NULL;
- if (pos_args)
- {
- pos_args++;
- while (pos_args[0] == ' ')
- pos_args++;
- if (pos_args[0] == '"')
- {
- length = strlen (pos_args);
- if ((length > 1) && (pos_args[length - 1] == '"'))
- args_tmp = strndup (pos_args + 1, length - 2);
- else
- args_tmp = strdup (pos_args);
- }
- else
- args_tmp = strdup (pos_args);
- }
- (void)(*ptr_function)(window, args_tmp);
- if (args_tmp)
- free (args_tmp);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown key function \"%s\"\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
- }
- else if (ascii_strncasecmp (arguments, "reset", 5) == 0)
- {
- arguments += 5;
- while (arguments[0] == ' ')
- arguments++;
- if (ascii_strcasecmp (arguments, "-yes") == 0)
- {
- gui_keyboard_free_all ();
- gui_keyboard_init ();
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Default key bindings restored\n"));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s \"-yes\" argument is required for keys reset (security reason)\n"),
- WEECHAT_ERROR);
- return -1;
- }
- }
- else
- {
- while (arguments[0] == ' ')
- arguments++;
- pos = strchr (arguments, ' ');
- if (!pos)
- {
- ptr_key = NULL;
- internal_code = gui_keyboard_get_internal_code (arguments);
- if (internal_code)
- ptr_key = gui_keyboard_search (internal_code);
- if (ptr_key)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Key:\n"));
- weechat_cmd_key_display (ptr_key, 0);
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No key found.\n"));
- }
- if (internal_code)
- free (internal_code);
- return 0;
- }
- pos[0] = '\0';
- pos++;
- while (pos[0] == ' ')
- pos++;
- ptr_key = gui_keyboard_bind (arguments, pos);
- if (ptr_key)
- weechat_cmd_key_display (ptr_key, 1);
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unable to bind key \"%s\"\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_panel_display_info: display infos about a panel
- */
-
-void
-weechat_cmd_panel_display_info (t_gui_panel *panel)
-{
- gui_printf (NULL, " %s%2d%s. ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- panel->number,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- gui_printf (NULL, "%s%s%s ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- panel->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- gui_printf (NULL, "(%s%s/%s",
- (panel->panel_window) ? _("global") : _("local"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- switch (panel->position)
- {
- case GUI_PANEL_TOP:
- gui_printf (NULL, "%s", _("top"));
- break;
- case GUI_PANEL_BOTTOM:
- gui_printf (NULL, "%s", _("bottom"));
- break;
- case GUI_PANEL_LEFT:
- gui_printf (NULL, "%s", _("left"));
- break;
- case GUI_PANEL_RIGHT:
- gui_printf (NULL, "%s", _("right"));
- break;
- }
- gui_printf (NULL, "%s/%s%d)\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- panel->size);
-}
-
-/*
- * weechat_cmd_panel: manage panels
- */
-
-int
-weechat_cmd_panel (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_panel *ptr_panel;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- gui_printf (NULL, "\n/panel command is under development!\n");
-
- if ((argc == 0) || ((argc == 1) && (ascii_strcasecmp (argv[0], "list") == 0)))
- {
- /* list open panels */
-
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Open panels:\n"));
-
- for (ptr_panel = gui_panels; ptr_panel; ptr_panel = ptr_panel->next_panel)
- {
- weechat_cmd_panel_display_info (ptr_panel);
- }
- }
- else
- {
- }
- return 0;
-}
-
-/*
- * weechat_cmd_plugin_list: list loaded plugins
- */
-
-void
-weechat_cmd_plugin_list (char *name, int full)
-{
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
- int plugins_found;
- t_plugin_handler *ptr_handler;
- int handler_found;
- t_plugin_modifier *ptr_modifier;
- int modifier_found;
-
- gui_printf (NULL, "\n");
- if (!name)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _("Plugins loaded:\n"));
- }
-
- plugins_found = 0;
-
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- if (!name || (ascii_strcasestr (ptr_plugin->name, name)))
- {
- plugins_found++;
-
- /* plugin info */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, " %s%s%s v%s - %s (%s)\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ptr_plugin->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_plugin->version,
- ptr_plugin->description,
- ptr_plugin->filename);
-
- if (full)
- {
- /* message handlers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" message handlers:\n"));
- handler_found = 0;
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_MESSAGE)
- {
- handler_found = 1;
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" IRC(%s)\n"),
- ptr_handler->irc_command);
- }
- }
- if (!handler_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" (no message handler)\n"));
- }
-
- /* command handlers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" command handlers:\n"));
- handler_found = 0;
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_COMMAND)
- {
- handler_found = 1;
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, " /%s",
- ptr_handler->command);
- if (ptr_handler->description
- && ptr_handler->description[0])
- gui_printf (NULL, " (%s)",
- ptr_handler->description);
- gui_printf (NULL, "\n");
- }
- }
- if (!handler_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" (no command handler)\n"));
- }
-
- /* timer handlers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" timer handlers:\n"));
- handler_found = 0;
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_TIMER)
- {
- handler_found = 1;
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" %d seconds\n"),
- ptr_handler->interval);
- }
- }
- if (!handler_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" (no timer handler)\n"));
- }
-
- /* keyboard handlers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" keyboard handlers:\n"));
- handler_found = 0;
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_KEYBOARD)
- handler_found++;
- }
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- if (!handler_found)
- gui_printf (NULL, _(" (no keyboard handler)\n"));
- else
- gui_printf (NULL, _(" %d defined\n"),
- handler_found);
-
- /* event handlers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" event handlers:\n"));
- handler_found = 0;
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_EVENT)
- handler_found++;
- }
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- if (!handler_found)
- gui_printf (NULL, _(" (no event handler)\n"));
- else
- gui_printf (NULL, _(" %d defined\n"),
- handler_found);
-
- /* modifiers */
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- gui_printf (NULL, _(" modifiers:\n"));
- modifier_found = 0;
- for (ptr_modifier = ptr_plugin->modifiers;
- ptr_modifier; ptr_modifier = ptr_modifier->next_modifier)
- {
- modifier_found++;
- }
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- if (!modifier_found)
- gui_printf (NULL, _(" (no modifier)\n"));
- else
- gui_printf (NULL, _(" %d defined\n"),
- modifier_found);
- }
- }
- }
- if (plugins_found == 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_PLUGIN);
- if (name)
- gui_printf (NULL, _("No plugin found.\n"));
- else
- gui_printf (NULL, _(" (no plugin)\n"));
- }
-#else
- /* make C compiler happy */
- (void) name;
- (void) full;
-#endif
-}
-
-/*
- * weechat_cmd_plugin: list/load/unload WeeChat plugins
- */
-
-int
-weechat_cmd_plugin (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
-#ifdef PLUGINS
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- switch (argc)
- {
- case 0:
- weechat_cmd_plugin_list (NULL, 0);
- break;
- case 1:
- if (ascii_strcasecmp (argv[0], "list") == 0)
- weechat_cmd_plugin_list (NULL, 0);
- else if (ascii_strcasecmp (argv[0], "listfull") == 0)
- weechat_cmd_plugin_list (NULL, 1);
- else if (ascii_strcasecmp (argv[0], "autoload") == 0)
- plugin_auto_load ();
- else if (ascii_strcasecmp (argv[0], "reload") == 0)
- {
- plugin_unload_all ();
- plugin_auto_load ();
- }
- else if (ascii_strcasecmp (argv[0], "unload") == 0)
- plugin_unload_all ();
- break;
- case 2:
- if (ascii_strcasecmp (argv[0], "list") == 0)
- weechat_cmd_plugin_list (argv[1], 0);
- else if (ascii_strcasecmp (argv[0], "listfull") == 0)
- weechat_cmd_plugin_list (argv[1], 1);
- else if (ascii_strcasecmp (argv[0], "load") == 0)
- plugin_load (argv[1]);
- else if (ascii_strcasecmp (argv[0], "reload") == 0)
- plugin_reload_name (argv[1]);
- else if (ascii_strcasecmp (argv[0], "unload") == 0)
- plugin_unload_name (argv[1]);
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "plugin");
- }
- break;
- default:
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s wrong argument count for \"%s\" command\n"),
- WEECHAT_ERROR, "plugin");
- }
-#else
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("Command \"%s\" is not available, WeeChat was built "
- "without plugins support.\n"),
- "plugin");
- /* make C compiler happy */
- (void) server;
- (void) channel;
- (void) argc;
- (void) argv;
-#endif /* PLUGINS */
-
- return 0;
-}
-
-/*
- * weechat_cmd_reconnect_one_server: reconnect to a server
- * return 0 if error, 1 if ok
- */
-
-int
-weechat_cmd_reconnect_one_server (t_irc_server *server, int no_join)
-{
- if ((!server->is_connected) && (server->child_pid == 0))
- {
- irc_display_prefix (NULL, server->buffer, GUI_PREFIX_ERROR);
- gui_printf (server->buffer,
- _("%s not connected to server \"%s\"!\n"),
- WEECHAT_ERROR, server->name);
- return 0;
- }
- irc_send_quit_server (server, NULL);
- irc_server_disconnect (server, 0);
- if (irc_server_connect (server, no_join))
- {
- server->reconnect_start = 0;
- server->reconnect_join = (server->channels) ? 1 : 0;
- }
- gui_status_draw (server->buffer, 1);
-
- /* reconnect ok */
- return 1;
-}
-
-/*
- * weechat_cmd_reconnect: reconnect to server(s)
- */
-
-int
-weechat_cmd_reconnect (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- t_irc_server *ptr_server;
- int i, nb_reconnect, reconnect_ok, all_servers, no_join;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- nb_reconnect = 0;
- reconnect_ok = 1;
-
- all_servers = 0;
- no_join = 0;
- for (i = 0; i < argc; i++)
- {
- if (ascii_strcasecmp (argv[i], "-all") == 0)
- all_servers = 1;
- if (ascii_strcasecmp (argv[i], "-nojoin") == 0)
- no_join = 1;
- }
-
- if (all_servers)
- {
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- nb_reconnect++;
- if ((ptr_server->is_connected) || (ptr_server->child_pid != 0))
- {
- if (!weechat_cmd_reconnect_one_server (ptr_server, no_join))
- reconnect_ok = 0;
- }
- }
- }
- else
- {
- for (i = 0; i < argc; i++)
- {
- if (argv[i][0] != '-')
- {
- nb_reconnect++;
- ptr_server = irc_server_search (argv[i]);
- if (ptr_server)
- {
- if (!weechat_cmd_reconnect_one_server (ptr_server, no_join))
- reconnect_ok = 0;
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s server \"%s\" not found\n"),
- WEECHAT_ERROR, argv[i]);
- reconnect_ok = 0;
- }
- }
- }
- }
-
- if (nb_reconnect == 0)
- reconnect_ok = weechat_cmd_reconnect_one_server (server, no_join);
-
- if (!reconnect_ok)
- return -1;
-
- return 0;
-}
-
-/*
- * weechat_cmd_save: save WeeChat and plugins options to disk
- */
-
-int
-weechat_cmd_save (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- if (config_write ((argc == 1) ? argv[0] : NULL) == 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf_nolog (NULL, _("Configuration file saved\n"));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL, _("%s failed to save configuration file\n"),
- WEECHAT_ERROR);
- }
-
-#ifdef PLUGINS
- if (plugin_config_write () == 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf_nolog (NULL, _("Plugins options saved\n"));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL, _("%s failed to save plugins options\n"),
- WEECHAT_ERROR);
- }
-#endif
-
- return 0;
-}
-
-/*
- * weechat_cmd_server: list, add or remove server(s)
- */
-
-int
-weechat_cmd_server (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_window *window;
- t_gui_buffer *buffer;
- int i, detailed_list, one_server_found;
- t_irc_server server_tmp, *ptr_server, *server_found, *new_server;
- t_gui_buffer *ptr_buffer;
- char *server_name, *error;
- long number;
-
- gui_buffer_find_context (server, channel, &window, &buffer);
-
- if ((argc == 0)
- || (ascii_strcasecmp (argv[0], "list") == 0)
- || (ascii_strcasecmp (argv[0], "listfull") == 0))
- {
- /* list servers */
- server_name = NULL;
- detailed_list = 0;
- for (i = 0; i < argc; i++)
- {
- if (ascii_strcasecmp (argv[i], "list") == 0)
- continue;
- if (ascii_strcasecmp (argv[i], "listfull") == 0)
- {
- detailed_list = 1;
- continue;
- }
- if (!server_name)
- server_name = argv[i];
- }
- if (!server_name)
- {
- if (irc_servers)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("All servers:\n"));
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- irc_display_server (ptr_server, detailed_list);
- }
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No server.\n"));
- }
- }
- else
- {
- one_server_found = 0;
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (ascii_strcasestr (ptr_server->name, server_name))
- {
- if (!one_server_found)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Servers with '%s':\n"),
- server_name);
- }
- one_server_found = 1;
- irc_display_server (ptr_server, detailed_list);
- }
- }
- if (!one_server_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("No server with '%s' found.\n"),
- server_name);
- }
- }
- }
- else
- {
- if (ascii_strcasecmp (argv[0], "add") == 0)
- {
- if (argc < 3)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing parameters for \"%s\" command\n"),
- WEECHAT_ERROR, "server");
- return -1;
- }
-
- if (irc_server_name_already_exists (argv[1]))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" already exists, can't create it!\n"),
- WEECHAT_ERROR, argv[1]);
- return -1;
- }
-
- /* init server struct */
- irc_server_init (&server_tmp);
-
- server_tmp.name = strdup (argv[1]);
- server_tmp.address = strdup (argv[2]);
- server_tmp.port = IRC_DEFAULT_PORT;
-
- /* parse arguments */
- for (i = 3; i < argc; i++)
- {
- if (argv[i][0] == '-')
- {
- if (ascii_strcasecmp (argv[i], "-temp") == 0)
- server_tmp.temp_server = 1;
- if (ascii_strcasecmp (argv[i], "-auto") == 0)
- server_tmp.autoconnect = 1;
- if (ascii_strcasecmp (argv[i], "-noauto") == 0)
- server_tmp.autoconnect = 0;
- if (ascii_strcasecmp (argv[i], "-ipv6") == 0)
- server_tmp.ipv6 = 1;
- if (ascii_strcasecmp (argv[i], "-ssl") == 0)
- server_tmp.ssl = 1;
- if (ascii_strcasecmp (argv[i], "-port") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-port");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- error = NULL;
- number = strtol (argv[++i], &error, 10);
- if ((error) && (error[0] == '\0'))
- server_tmp.port = number;
- }
- if (ascii_strcasecmp (argv[i], "-pwd") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-pwd");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.password = strdup (argv[++i]);
- }
- if (ascii_strcasecmp (argv[i], "-nicks") == 0)
- {
- if (i >= (argc - 3))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-nicks");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.nick1 = strdup (argv[++i]);
- server_tmp.nick2 = strdup (argv[++i]);
- server_tmp.nick3 = strdup (argv[++i]);
- }
- if (ascii_strcasecmp (argv[i], "-username") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-username");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.username = strdup (argv[++i]);
- }
- if (ascii_strcasecmp (argv[i], "-realname") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-realname");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.realname = strdup (argv[++i]);
- }
- if (ascii_strcasecmp (argv[i], "-command") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-command");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.command = strdup (argv[++i]);
- }
- if (ascii_strcasecmp (argv[i], "-autojoin") == 0)
- {
- if (i == (argc - 1))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing argument for \"%s\" option\n"),
- WEECHAT_ERROR, "-autojoin");
- irc_server_destroy (&server_tmp);
- return -1;
- }
- server_tmp.autojoin = strdup (argv[++i]);
- }
- }
- }
-
- /* create new server */
- new_server = irc_server_new (server_tmp.name,
- server_tmp.autoconnect,
- server_tmp.autoreconnect,
- server_tmp.autoreconnect_delay,
- server_tmp.temp_server,
- server_tmp.address,
- server_tmp.port,
- server_tmp.ipv6,
- server_tmp.ssl,
- server_tmp.password,
- server_tmp.nick1,
- server_tmp.nick2,
- server_tmp.nick3,
- server_tmp.username,
- server_tmp.realname,
- server_tmp.hostname,
- server_tmp.command,
- 1, /* command_delay */
- server_tmp.autojoin,
- 1, /* autorejoin */
- NULL);
- if (new_server)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s created\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- server_tmp.name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unable to create server\n"),
- WEECHAT_ERROR);
- irc_server_destroy (&server_tmp);
- return -1;
- }
-
- if (new_server->autoconnect)
- {
- (void) gui_buffer_new (window, new_server, NULL,
- GUI_BUFFER_TYPE_STANDARD, 1);
- irc_server_connect (new_server, 0);
- }
-
- irc_server_destroy (&server_tmp);
- }
- else if (ascii_strcasecmp (argv[0], "copy") == 0)
- {
- if (argc < 3)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing server name for \"%s\" command\n"),
- WEECHAT_ERROR, "server copy");
- return -1;
- }
-
- /* look for server by name */
- server_found = irc_server_search (argv[1]);
- if (!server_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[1], "server copy");
- return -1;
- }
-
- /* check if target name already exists */
- if (irc_server_search (argv[2]))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" already exists for \"%s\" command\n"),
- WEECHAT_ERROR, argv[2], "server copy");
- return -1;
- }
-
- /* duplicate server */
- new_server = irc_server_duplicate (server_found, argv[2]);
- if (new_server)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s has been copied to %s%s\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- argv[1],
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- argv[2]);
- gui_window_redraw_all_buffers ();
- return 0;
- }
-
- return -1;
- }
- else if (ascii_strcasecmp (argv[0], "rename") == 0)
- {
- if (argc < 3)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing server name for \"%s\" command\n"),
- WEECHAT_ERROR, "server rename");
- return -1;
- }
-
- /* look for server by name */
- server_found = irc_server_search (argv[1]);
- if (!server_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[1], "server rename");
- return -1;
- }
-
- /* check if target name already exists */
- if (irc_server_search (argv[2]))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" already exists for \"%s\" command\n"),
- WEECHAT_ERROR, argv[2], "server rename");
- return -1;
- }
-
- /* rename server */
- if (irc_server_rename (server_found, argv[2]))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s has been renamed to %s%s\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- argv[1],
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- argv[2]);
- gui_window_redraw_all_buffers ();
- return 0;
- }
-
- return -1;
- }
- else if (ascii_strcasecmp (argv[0], "keep") == 0)
- {
- if (argc < 2)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing server name for \"%s\" command\n"),
- WEECHAT_ERROR, "server keep");
- return -1;
- }
-
- /* look for server by name */
- server_found = irc_server_search (argv[1]);
- if (!server_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[1], "server keep");
- return -1;
- }
-
- /* check that it is temporary server */
- if (!server_found->temp_server)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" is not a temporary server\n"),
- WEECHAT_ERROR, argv[1]);
- return -1;
- }
-
- /* remove temporary flag on server */
- server_found->temp_server = 0;
-
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s is not temporary any more\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- argv[1],
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
-
- return 0;
- }
- else if (ascii_strcasecmp (argv[0], "del") == 0)
- {
- if (argc < 2)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s missing server name for \"%s\" command\n"),
- WEECHAT_ERROR, "server del");
- return -1;
- }
-
- /* look for server by name */
- server_found = irc_server_search (argv[1]);
- if (!server_found)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" not found for \"%s\" command\n"),
- WEECHAT_ERROR, argv[1], "server del");
- return -1;
- }
- if (server_found->is_connected)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s you can not delete server \"%s\" because you are connected to. "
- "Try /disconnect %s before.\n"),
- WEECHAT_ERROR, argv[1], argv[1]);
- return -1;
- }
-
- for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
- {
- if (GUI_SERVER(ptr_buffer) == server_found)
- {
- ptr_buffer->server = NULL;
- ptr_buffer->channel = NULL;
- }
- }
-
- server_name = strdup (server_found->name);
-
- irc_server_free (server_found);
-
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Server %s%s%s has been deleted\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- server_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- if (server_name)
- free (server_name);
-
- gui_window_redraw_buffer (buffer);
-
- return 0;
- }
- else if (ascii_strcasecmp (argv[0], "deloutq") == 0)
- {
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- irc_server_outqueue_free_all (ptr_server);
- }
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf_nolog (NULL, _("Messages outqueue DELETED for all servers. "
- "Some messages from you or WeeChat may "
- "have been lost!\n"));
- return 0;
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "server");
- return -1;
- }
- }
- return 0;
-}
-
-/*
- * weechat_cmd_set_display_option: display config option
- */
-
-void
-weechat_cmd_set_display_option (t_config_option *option, char *prefix, void *value)
-{
- char *color_name, *value2;
-
- gui_printf (NULL, " %s%s%s%s = ",
- (prefix) ? prefix : "",
- (prefix) ? "." : "",
- option->option_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- if (!value)
- {
- if (option->option_type == OPTION_TYPE_STRING)
- value = option->ptr_string;
- else
- value = option->ptr_int;
- }
- switch (option->option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- gui_printf (NULL, "%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- (*((int *)value)) ? "ON" : "OFF");
- break;
- case OPTION_TYPE_INT:
- gui_printf (NULL, "%s%d\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- *((int *)value));
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- gui_printf (NULL, "%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- option->array_values[*((int *)value)]);
- break;
- case OPTION_TYPE_COLOR:
- color_name = gui_color_get_name (*((int *)value));
- gui_printf (NULL, "%s%s\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- (color_name) ? color_name : _("(unknown)"));
- break;
- case OPTION_TYPE_STRING:
- if (*((char **)value))
- {
- value2 = strdup (*((char **)value));
- if (value2)
- {
- if (cfg_log_hide_nickserv_pwd)
- {
- irc_display_hide_password (value2, 1);
- if (strcmp (*((char **)value), value2) != 0)
- gui_printf (NULL, _("%s(password hidden) "),
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- gui_printf (NULL, "%s\"%s%s%s\"",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- value2,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- free (value2);
- }
- }
- else
- gui_printf (NULL, "%s\"\"",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- gui_printf (NULL, "\n");
- break;
- }
-}
-
-/*
- * weechat_cmd_set: set config options
- */
-
-int
-weechat_cmd_set (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- char *option, *value, *pos;
- int i, j, section_displayed;
- t_config_option *ptr_option;
- t_irc_server *ptr_server;
- char option_name[256];
- void *ptr_option_value;
- int last_section, last_option, number_found;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- option = NULL;
- value = NULL;
- if (arguments && arguments[0])
- {
- option = arguments;
- value = strchr (option, '=');
- if (value)
- {
- value[0] = '\0';
-
- /* remove spaces before '=' */
- pos = value - 1;
- while ((pos > option) && (pos[0] == ' '))
- {
- pos[0] = '\0';
- pos--;
- }
-
- /* skip spaces after '=' */
- value++;
- while (value[0] && (value[0] == ' '))
- {
- value++;
- }
-
- /* remove simple or double quotes
- and spaces at the end */
- if (strlen(value) > 1)
- {
- pos = value + strlen (value) - 1;
- while ((pos > value) && (pos[0] == ' '))
- {
- pos[0] = '\0';
- pos--;
- }
- pos = value + strlen (value) - 1;
- if (((value[0] == '\'') &&
- (pos[0] == '\'')) ||
- ((value[0] == '"') &&
- (pos[0] == '"')))
- {
- pos[0] = '\0';
- value++;
- }
- }
- }
- }
-
- if (value)
- {
- pos = strrchr (option, '.');
- if (pos)
- {
- /* server config option modification */
- pos[0] = '\0';
- ptr_server = irc_server_search (option);
- if (!ptr_server)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s server \"%s\" not found\n"),
- WEECHAT_ERROR, option);
- }
- else
- {
- switch (config_set_server_value (ptr_server, pos + 1, value))
- {
- case 0:
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s[%s%s %s%s%s]\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- config_sections[CONFIG_SECTION_SERVER].section_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- ptr_server->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
- {
- if (strcmp (weechat_options[CONFIG_SECTION_SERVER][i].option_name, pos + 1) == 0)
- break;
- }
- if (weechat_options[CONFIG_SECTION_SERVER][i].option_name)
- {
- ptr_option_value = config_get_server_option_ptr (ptr_server,
- weechat_options[CONFIG_SECTION_SERVER][i].option_name);
- weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
- ptr_server->name,
- ptr_option_value);
- }
- config_change_buffer_content ();
- break;
- case -1:
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s config option \"%s\" not found\n"),
- WEECHAT_ERROR, pos + 1);
- break;
- case -2:
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect value for option \"%s\"\n"),
- WEECHAT_ERROR, pos + 1);
- break;
- }
- }
- pos[0] = '.';
- }
- else
- {
- ptr_option = config_option_search (option);
- if (ptr_option)
- {
- if (ptr_option->handler_change == NULL)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s option \"%s\" can not be changed while WeeChat is running\n"),
- WEECHAT_ERROR, option);
- }
- else
- {
- if (config_option_set_value (ptr_option, value) == 0)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s[%s%s%s]\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- config_get_section (ptr_option),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- weechat_cmd_set_display_option (ptr_option, NULL, NULL);
- (void) (ptr_option->handler_change());
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect value for option \"%s\"\n"),
- WEECHAT_ERROR, option);
- }
- }
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s config option \"%s\" not found\n"),
- WEECHAT_ERROR, option);
- }
- }
- }
- else
- {
- last_section = -1;
- last_option = -1;
- number_found = 0;
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- section_displayed = 0;
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- if ((!option) ||
- ((option) && (option[0])
- && (strstr (weechat_options[i][j].option_name, option)
- != NULL)))
- {
- if (!section_displayed)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s[%s%s%s]\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- config_sections[i].section_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- section_displayed = 1;
- }
- weechat_cmd_set_display_option (&weechat_options[i][j], NULL, NULL);
- last_section = i;
- last_option = j;
- number_found++;
- }
- }
- }
- }
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- section_displayed = 0;
- for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
- {
- snprintf (option_name, sizeof (option_name), "%s.%s",
- ptr_server->name,
- weechat_options[CONFIG_SECTION_SERVER][i].option_name);
- if ((!option) ||
- ((option) && (option[0])
- && (strstr (option_name, option) != NULL)))
- {
- if (!section_displayed)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s[%s%s %s%s%s]\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- config_sections[CONFIG_SECTION_SERVER].section_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_SERVER),
- ptr_server->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- section_displayed = 1;
- }
- ptr_option_value = config_get_server_option_ptr (ptr_server,
- weechat_options[CONFIG_SECTION_SERVER][i].option_name);
- if (ptr_option_value)
- {
- weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
- ptr_server->name,
- ptr_option_value);
- last_section = CONFIG_SECTION_SERVER;
- last_option = i;
- number_found++;
- }
- }
- }
- }
- if (number_found == 0)
- {
- if (option)
- gui_printf (NULL, _("No config option found with \"%s\"\n"),
- option);
- else
- gui_printf (NULL, _("No config option found\n"));
- }
- else
- {
- if ((number_found == 1) && (last_section >= 0) && (last_option >= 0))
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("%sDetail:\n"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL));
- switch (weechat_options[last_section][last_option].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- gui_printf (NULL, _(" . type boolean (values: 'on' or 'off')\n"));
- gui_printf (NULL, _(" . default value: '%s'\n"),
- (weechat_options[last_section][last_option].default_int == BOOL_TRUE) ?
- "on" : "off");
- break;
- case OPTION_TYPE_INT:
- gui_printf (NULL, _(" . type integer (values: between %d and %d)\n"),
- weechat_options[last_section][last_option].min,
- weechat_options[last_section][last_option].max);
- gui_printf (NULL, _(" . default value: %d\n"),
- weechat_options[last_section][last_option].default_int);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- gui_printf (NULL, _(" . type string (values: "));
- i = 0;
- while (weechat_options[last_section][last_option].array_values[i])
- {
- gui_printf (NULL, "'%s'",
- weechat_options[last_section][last_option].array_values[i]);
- if (weechat_options[last_section][last_option].array_values[i + 1])
- gui_printf (NULL, ", ");
- i++;
- }
- gui_printf (NULL, ")\n");
- gui_printf (NULL, _(" . default value: '%s'\n"),
- (weechat_options[last_section][last_option].default_string) ?
- weechat_options[last_section][last_option].default_string : _("empty"));
- break;
- case OPTION_TYPE_COLOR:
- gui_printf (NULL, _(" . type color (Curses or Gtk color, look at WeeChat doc)\n"));
- gui_printf (NULL, _(" . default value: '%s'\n"),
- (weechat_options[last_section][last_option].default_string) ?
- weechat_options[last_section][last_option].default_string : _("empty"));
- break;
- case OPTION_TYPE_STRING:
- switch (weechat_options[last_section][last_option].max)
- {
- case 0:
- gui_printf (NULL, _(" . type string (any string)\n"));
- break;
- case 1:
- gui_printf (NULL, _(" . type: char (any char)\n"));
- break;
- default:
- gui_printf (NULL, _(" . type string (any string, limit: %d chars)\n"),
- weechat_options[last_section][last_option].max);
- break;
- }
- gui_printf (NULL, _(" . default value: '%s'\n"),
- (weechat_options[last_section][last_option].default_string) ?
- weechat_options[last_section][last_option].default_string : _("empty"));
- break;
- }
- gui_printf (NULL, _(" . description: %s\n"),
- _(weechat_options[last_section][last_option].long_description));
- }
- else
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s%d %s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- number_found,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- if (option)
- gui_printf (NULL, _("config option(s) found with \"%s\"\n"),
- option);
- else
- gui_printf (NULL, _("config option(s) found\n"));
- }
- }
- }
- return 0;
-}
-
-/*
- * weechat_cmd_setp: set plugin options
- */
-
-int
-weechat_cmd_setp (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
-#ifdef PLUGINS
- char *option, *value, *pos, *ptr_name;
- t_plugin_option *ptr_option;
- int number_found;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- option = NULL;
- value = NULL;
- if (arguments && arguments[0])
- {
- option = arguments;
- value = strchr (option, '=');
- if (value)
- {
- value[0] = '\0';
-
- /* remove spaces before '=' */
- pos = value - 1;
- while ((pos > option) && (pos[0] == ' '))
- {
- pos[0] = '\0';
- pos--;
- }
-
- /* skip spaces after '=' */
- value++;
- while (value[0] && (value[0] == ' '))
- {
- value++;
- }
-
- /* remove simple or double quotes
- and spaces at the end */
- if (strlen(value) > 1)
- {
- pos = value + strlen (value) - 1;
- while ((pos > value) && (pos[0] == ' '))
- {
- pos[0] = '\0';
- pos--;
- }
- pos = value + strlen (value) - 1;
- if (((value[0] == '\'') &&
- (pos[0] == '\'')) ||
- ((value[0] == '"') &&
- (pos[0] == '"')))
- {
- pos[0] = '\0';
- value++;
- }
- }
- }
- }
-
- if (value)
- {
- ptr_name = NULL;
- ptr_option = plugin_config_search_internal (option);
- if (ptr_option)
- ptr_name = ptr_option->name;
- else
- {
- pos = strchr (option, '.');
- if (pos)
- pos[0] = '\0';
- if (!pos || !pos[1] || (!plugin_search (option)))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s plugin \"%s\" not found\n"),
- WEECHAT_ERROR, option);
- }
- else
- ptr_name = option;
- if (pos)
- pos[0] = '.';
- }
- if (ptr_name)
- {
- if (plugin_config_set_internal (ptr_name, value))
- {
- gui_printf (NULL, "\n %s%s = \"%s%s%s\"\n",
- ptr_name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- value,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s incorrect value for plugin option \"%s\"\n"),
- WEECHAT_ERROR, ptr_name);
- }
- }
- }
- else
- {
- number_found = 0;
- for (ptr_option = plugin_options; ptr_option;
- ptr_option = ptr_option->next_option)
- {
- if ((!option) ||
- ((option) && (option[0])
- && (strstr (ptr_option->name, option) != NULL)))
- {
- if (number_found == 0)
- gui_printf (NULL, "\n");
- gui_printf (NULL, " %s%s = \"%s%s%s\"\n",
- ptr_option->name,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_HOST),
- ptr_option->value,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
- number_found++;
- }
- }
- if (number_found == 0)
- {
- if (option)
- gui_printf (NULL, _("No plugin option found with \"%s\"\n"),
- option);
- else
- gui_printf (NULL, _("No plugin option found\n"));
- }
- else
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, "%s%d %s",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- number_found,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- if (option)
- gui_printf (NULL, _("plugin option(s) found with \"%s\"\n"),
- option);
- else
- gui_printf (NULL, _("plugin option(s) found\n"));
- }
- }
-#else
- /* make C compiler happy */
- (void) server;
- (void) channel;
- (void) arguments;
-
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("Command \"%s\" is not available, WeeChat was built "
- "without plugins support.\n"),
- "setp");
-#endif
-
- return 0;
-}
-
-/*
- * cmd_unalias: remove an alias
- */
-
-int
-weechat_cmd_unalias (t_irc_server *server, t_irc_channel *channel,
- char *arguments)
-{
- t_weelist *ptr_weelist;
- t_weechat_alias *ptr_alias;
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- if (arguments[0] == '/')
- arguments++;
-
- ptr_weelist = weelist_search (index_commands, arguments);
- if (!ptr_weelist)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s alias or command \"%s\" not found\n"),
- WEECHAT_ERROR, arguments);
- return -1;
- }
-
- weelist_remove (&index_commands, &last_index_command, ptr_weelist);
- ptr_alias = alias_search (arguments);
- if (ptr_alias)
- alias_free (ptr_alias);
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL, _("Alias \"%s\" removed\n"),
- arguments);
- return 0;
-}
-
-/*
- * weechat_cmd_unignore: unignore IRC commands and/or hosts
- */
-
-int
-weechat_cmd_unignore (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- char *error;
- int number, ret;
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- ret = 0;
- switch (argc)
- {
- case 0:
- /* List all ignore */
- weechat_cmd_ignore (server, channel, argc, argv);
- return 0;
- break;
- case 1:
- error = NULL;
- number = strtol (argv[0], &error, 10);
- if ((error) && (error[0] == '\0'))
- ret = irc_ignore_search_free_by_number (number);
- else
- ret = irc_ignore_search_free (argv[0], "*", "*",
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 2:
- ret = irc_ignore_search_free (argv[0], argv[1], "*",
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 3:
- ret = irc_ignore_search_free (argv[0], argv[1], argv[2],
- (GUI_SERVER(buffer)) ?
- GUI_SERVER(buffer)->name : "*");
- break;
- case 4:
- ret = irc_ignore_search_free (argv[0], argv[1], argv[2], argv[3]);
- break;
- }
-
- if (ret)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf (NULL,
- NG_("%s%d%s ignore was removed.\n",
- "%s%d%s ignore were removed.\n",
- ret),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ret,
- GUI_COLOR(GUI_COLOR_WIN_CHAT));
- }
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s no ignore found\n"),
- WEECHAT_ERROR);
- return -1;
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_upgrade: upgrade WeeChat
- */
-
-int
-weechat_cmd_upgrade (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_irc_server *ptr_server;
- int filename_length;
- char *filename, *ptr_binary;
- char *exec_args[7] = { NULL, "-a", "--dir", NULL, "--session", NULL, NULL };
-
- /* make C compiler happy */
- (void) server;
- (void) channel;
-
- ptr_binary = (argc > 0) ? argv[0] : weechat_argv0;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (ptr_server->child_pid != 0)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL,
- _("%s can't upgrade: connection to at least "
- "one server is pending\n"),
- WEECHAT_ERROR);
- return -1;
- }
- /* TODO: remove this test, and fix gnutls save/load in session */
- if (ptr_server->is_connected && ptr_server->ssl_connected)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL,
- _("%s can't upgrade: connection to at least "
- "one SSL server is active "
- "(should be fixed in a future version)\n"),
- WEECHAT_ERROR);
- return -1;
- }
- if (ptr_server->outqueue)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL,
- _("%s can't upgrade: anti-flood is active on "
- "at least one server (sending many lines)\n"),
- WEECHAT_ERROR);
- return -1;
- }
- }
-
- filename_length = strlen (weechat_home) + strlen (WEECHAT_SESSION_NAME) + 2;
- filename = (char *) malloc (filename_length * sizeof (char));
- if (!filename)
- return -2;
- snprintf (filename, filename_length, "%s%s" WEECHAT_SESSION_NAME,
- weechat_home, DIR_SEPARATOR);
-
- irc_display_prefix (NULL, NULL, GUI_PREFIX_INFO);
- gui_printf_nolog (NULL, _("Upgrading WeeChat...\n"));
-
- if (!session_save (filename))
- {
- free (filename);
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf_nolog (NULL,
- _("%s unable to save session in file\n"),
- WEECHAT_ERROR);
- return -1;
- }
-
- exec_args[0] = strdup (ptr_binary);
- exec_args[3] = strdup (weechat_home);
- exec_args[5] = strdup (filename);
-
- /* unload plugins, save config, then upgrade */
-#ifdef PLUGINS
- plugin_end ();
-#endif
- if (cfg_look_save_on_exit)
- (void) config_write (NULL);
- gui_main_end ();
- fifo_remove ();
- weechat_log_close ();
-
- execvp (exec_args[0], exec_args);
-
- /* this code should not be reached if execvp is ok */
-#ifdef PLUGINS
- plugin_init (1);
-#endif
-
- weechat_iconv_fprintf (stderr,
- _("%s exec failed (program: \"%s\"), exiting WeeChat\n"),
- WEECHAT_ERROR,
- exec_args[0]);
-
- free (exec_args[0]);
- free (exec_args[3]);
- free (filename);
-
- exit (EXIT_FAILURE);
-
- /* never executed */
- return -1;
-}
-
-/*
- * weechat_cmd_uptime: display WeeChat uptime
- */
-
-int
-weechat_cmd_uptime (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_buffer *buffer;
- time_t running_time;
- int day, hour, min, sec;
- char string[256];
-
- gui_buffer_find_context (server, channel, NULL, &buffer);
-
- running_time = time (NULL) - weechat_start_time;
- day = running_time / (60 * 60 * 24);
- hour = (running_time % (60 * 60 * 24)) / (60 * 60);
- min = ((running_time % (60 * 60 * 24)) % (60 * 60)) / 60;
- sec = ((running_time % (60 * 60 * 24)) % (60 * 60)) % 60;
-
- if ((argc == 1) && (strcmp (argv[0], "-o") == 0)
- && ((GUI_BUFFER_IS_CHANNEL(buffer))
- || (GUI_BUFFER_IS_PRIVATE(buffer))))
- {
- snprintf (string, sizeof (string),
- _("WeeChat uptime: %d %s %02d:%02d:%02d, started on %s"),
- day,
- NG_("day", "days", day),
- hour,
- min,
- sec,
- ctime (&weechat_start_time));
- string[strlen (string) - 1] = '\0';
- user_command (server, channel, string, 0);
- }
- else
- {
- irc_display_prefix (NULL, buffer, GUI_PREFIX_INFO);
- gui_printf_nolog (buffer,
- _("WeeChat uptime: %s%d %s%s "
- "%s%02d%s:%s%02d%s:%s%02d%s, "
- "started on %s%s"),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- day,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- NG_("day", "days", day),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- hour,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- min,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- sec,
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- ctime (&weechat_start_time));
- }
-
- return 0;
-}
-
-/*
- * weechat_cmd_window: manage windows
- */
-
-int
-weechat_cmd_window (t_irc_server *server, t_irc_channel *channel,
- int argc, char **argv)
-{
- t_gui_window *window, *ptr_win;
- t_gui_buffer *buffer;
- int i;
- char *error;
- long number;
-
- gui_buffer_find_context (server, channel, &window, &buffer);
-
- if ((argc == 0) || ((argc == 1) && (ascii_strcasecmp (argv[0], "list") == 0)))
- {
- /* list open windows */
-
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("Open windows:\n"));
-
- i = 1;
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- gui_printf (NULL, "%s[%s%d%s] (%s%d:%d%s;%s%dx%d%s) ",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- i,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_win->win_x,
- ptr_win->win_y,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT),
- ptr_win->win_width,
- ptr_win->win_height,
- GUI_COLOR(GUI_COLOR_WIN_CHAT_DARK));
-
- weechat_cmd_buffer_display_info (ptr_win->buffer);
-
- i++;
- }
- }
- else
- {
- if (ascii_strcasecmp (argv[0], "splith") == 0)
- {
- /* split window horizontally */
- if (argc > 1)
- {
- error = NULL;
- number = strtol (argv[1], &error, 10);
- if ((error) && (error[0] == '\0')
- && (number > 0) && (number < 100))
- gui_window_split_horiz (window, number);
- }
- else
- gui_window_split_horiz (window, 50);
- }
- else if (ascii_strcasecmp (argv[0], "splitv") == 0)
- {
- /* split window vertically */
- if (argc > 1)
- {
- error = NULL;
- number = strtol (argv[1], &error, 10);
- if ((error) && (error[0] == '\0')
- && (number > 0) && (number < 100))
- gui_window_split_vertic (window, number);
- }
- else
- gui_window_split_vertic (window, 50);
- }
- else if (ascii_strcasecmp (argv[0], "resize") == 0)
- {
- /* resize window */
- if (argc > 1)
- {
- error = NULL;
- number = strtol (argv[1], &error, 10);
- if ((error) && (error[0] == '\0')
- && (number > 0) && (number < 100))
- gui_window_resize (window, number);
- }
- }
- else if (ascii_strcasecmp (argv[0], "merge") == 0)
- {
- if (argc >= 2)
- {
- if (ascii_strcasecmp (argv[1], "all") == 0)
- gui_window_merge_all (window);
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "window merge");
- return -1;
- }
- }
- else
- {
- if (!gui_window_merge (window))
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s can not merge windows, "
- "there's no other window with same size "
- "near current one.\n"),
- WEECHAT_ERROR);
- return -1;
- }
- }
- }
- else if (ascii_strncasecmp (argv[0], "b", 1) == 0)
- {
- /* jump to window by buffer number */
- error = NULL;
- number = strtol (argv[0] + 1, &error, 10);
- if ((error) && (error[0] == '\0'))
- gui_window_switch_by_buffer (window, number);
- }
- else if (ascii_strcasecmp (argv[0], "-1") == 0)
- gui_window_switch_previous (window);
- else if (ascii_strcasecmp (argv[0], "+1") == 0)
- gui_window_switch_next (window);
- else if (ascii_strcasecmp (argv[0], "up") == 0)
- gui_window_switch_up (window);
- else if (ascii_strcasecmp (argv[0], "down") == 0)
- gui_window_switch_down (window);
- else if (ascii_strcasecmp (argv[0], "left") == 0)
- gui_window_switch_left (window);
- else if (ascii_strcasecmp (argv[0], "right") == 0)
- gui_window_switch_right (window);
- else
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s unknown option for \"%s\" command\n"),
- WEECHAT_ERROR, "window");
- return -1;
- }
- }
- return 0;
-}
diff --git a/src/common/command.h b/src/common/command.h
deleted file mode 100644
index 644491dd0..000000000
--- a/src/common/command.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_COMMAND_H
-#define __WEECHAT_COMMAND_H 1
-
-#include "weelist.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-#define MAX_ARGS 8192
-
-typedef struct t_weechat_command t_weechat_command;
-
-struct t_weechat_command
-{
- char *command_name; /* WeeChat (internal) command name */
- char *command_description; /* command description (for /help) */
- char *arguments; /* command arguments (for /help) */
- char *arguments_description; /* arguments description (for /help) */
- char *completion_template; /* template for completion */
- /* NULL=no completion, ""=default (nick) */
- int min_arg, max_arg; /* min & max number of arguments */
- int conversion; /* = 1 if cmd args are converted (charset */
- /* and color) before execution */
- int (*cmd_function_args)(t_irc_server *, t_irc_channel *, int, char **);
- /* function called when user enters cmd */
- int (*cmd_function_1arg)(t_irc_server *, t_irc_channel *, char *);
- /* function called when user enters cmd */
-};
-
-extern t_weechat_command weechat_commands[];
-
-extern t_weelist *index_commands;
-extern t_weelist *last_index_command;
-
-extern void command_index_build ();
-extern void command_index_free ();
-extern int command_used_by_weechat (char *);
-extern char **split_multi_command (char *, char);
-extern void free_multi_command (char **);
-extern int exec_weechat_command (t_irc_server *, t_irc_channel *, char *, int);
-extern void user_command (t_irc_server *, t_irc_channel *, char *, int);
-extern int weechat_cmd_alias (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_buffer (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_builtin (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_clear (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_connect (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_dcc (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_debug (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_disconnect (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_help (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_history (t_irc_server *, t_irc_channel *, int, char **);
-extern void weechat_cmd_ignore_display (char *, t_irc_ignore *);
-extern int weechat_cmd_ignore (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_key (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_panel (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_plugin (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_reconnect (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_save (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_server (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_set (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_setp (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_unalias (t_irc_server *, t_irc_channel *, char *);
-extern int weechat_cmd_unignore (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_upgrade (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_uptime (t_irc_server *, t_irc_channel *, int, char **);
-extern int weechat_cmd_window (t_irc_server *, t_irc_channel *, int, char **);
-
-#endif /* command.h */
diff --git a/src/common/completion.c b/src/common/completion.c
deleted file mode 100644
index f04b35406..000000000
--- a/src/common/completion.c
+++ /dev/null
@@ -1,1727 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* completion.c: completes words according to context (cmd/nick) */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <unistd.h>
-
-#include "weechat.h"
-#include "completion.h"
-#include "alias.h"
-#include "command.h"
-#include "log.h"
-#include "utf8.h"
-#include "util.h"
-#include "weelist.h"
-#include "weeconfig.h"
-#include "../protocols/irc/irc.h"
-
-#ifdef PLUGINS
-#include "../plugins/plugins.h"
-#endif
-
-
-/*
- * completion_init: init completion
- */
-
-void
-completion_init (t_completion *completion, void *server, void *channel)
-{
- completion->server = server;
- completion->channel = channel;
- completion->context = COMPLETION_NULL;
- completion->base_command = NULL;
- completion->base_command_arg = 0;
- completion->arg_is_nick = 0;
- completion->base_word = NULL;
- completion->base_word_pos = 0;
- completion->position = -1;
- completion->args = NULL;
- completion->direction = 0;
- completion->add_space = 1;
-
- completion->completion_list = NULL;
- completion->last_completion = NULL;
-
- completion->word_found = NULL;
- completion->position_replace = 0;
- completion->diff_size = 0;
- completion->diff_length = 0;
-}
-
-/*
- * completion_free: free completion
- */
-
-void
-completion_free (t_completion *completion)
-{
- if (completion->base_command)
- free (completion->base_command);
- completion->base_command = NULL;
-
- if (completion->base_word)
- free (completion->base_word);
- completion->base_word = NULL;
-
- if (completion->args)
- free (completion->args);
- completion->args = NULL;
-
- weelist_remove_all (&completion->completion_list,
- &completion->last_completion);
- completion->completion_list = NULL;
- completion->last_completion = NULL;
-
- if (completion->word_found)
- free (completion->word_found);
- completion->word_found = NULL;
-}
-
-/*
- * completion_stop: stop completion (for example after 1 arg of command with 1 arg)
- */
-
-void
-completion_stop (t_completion *completion)
-{
- completion->context = COMPLETION_NULL;
- completion->position = -1;
-}
-
-/*
- * completion_get_command_infos: return completion template and max arg for command
- */
-
-void
-completion_get_command_infos (t_completion *completion,
- char **template, int *max_arg)
-{
- t_weechat_alias *ptr_alias;
- char *ptr_command, *ptr_command2, *pos;
- int i;
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
- t_plugin_handler *ptr_handler;
-#endif
-
- *template = NULL;
- *max_arg = MAX_ARGS;
-
- ptr_alias = alias_search (completion->base_command);
- if (ptr_alias)
- {
- ptr_command = alias_get_final_command (ptr_alias);
- if (!ptr_command)
- return;
- }
- else
- ptr_command = completion->base_command;
-
- ptr_command2 = strdup (ptr_command);
- if (!ptr_command2)
- return;
-
- pos = strchr (ptr_command2, ' ');
- if (pos)
- pos[0] = '\0';
-
-#ifdef PLUGINS
- /* look for plugin command handler */
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if ((ptr_handler->type == PLUGIN_HANDLER_COMMAND)
- && (ascii_strcasecmp (ptr_handler->command,
- ptr_command2) == 0))
- {
- *template = ptr_handler->completion_template;
- *max_arg = MAX_ARGS;
- free (ptr_command2);
- return;
- }
- }
- }
-#endif
-
- /* look for WeeChat internal command */
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- if (ascii_strcasecmp (weechat_commands[i].command_name,
- ptr_command2) == 0)
- {
- *template = weechat_commands[i].completion_template;
- *max_arg = weechat_commands[i].max_arg;
- free (ptr_command2);
- return;
- }
- }
-
- /* look for IRC command */
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if ((irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
- && (ascii_strcasecmp (irc_commands[i].command_name,
- ptr_command2) == 0))
- {
- *template = irc_commands[i].completion_template;
- *max_arg = irc_commands[i].max_arg;
- free (ptr_command2);
- return;
- }
- }
-
- free (ptr_command2);
- return;
-}
-
-/*
- * completion_is_only_alphanum: return 1 if there is only alpha/num chars
- * in a string
- */
-
-int
-completion_is_only_alphanum (char *string)
-{
- while (string[0])
- {
- if (strchr (cfg_look_nick_completion_ignore, string[0]))
- return 0;
- string++;
- }
- return 1;
-}
-
-/*
- * completion_strdup_alphanum: duplicate alpha/num chars in a string
- */
-
-char *
-completion_strdup_alphanum (char *string)
-{
- char *result, *pos;
-
- result = (char *)malloc (strlen (string) + 1);
- pos = result;
- while (string[0])
- {
- if (!strchr (cfg_look_nick_completion_ignore, string[0]))
- {
- pos[0] = string[0];
- pos++;
- }
- string++;
- }
- pos[0] = '\0';
- return result;
-}
-
-/*
- * completion_nickncmp: locale and case independent string comparison
- * with max length for nicks (alpha or digits only)
- */
-
-int
-completion_nickncmp (char *base_word, char *nick, int max)
-{
- char *base_word2, *nick2;
- int return_cmp;
-
- if (!cfg_look_nick_completion_ignore
- || !cfg_look_nick_completion_ignore[0]
- || !base_word || !nick || !base_word[0] || !nick[0]
- || (!completion_is_only_alphanum (base_word)))
- return ascii_strncasecmp (base_word, nick, max);
-
- base_word2 = completion_strdup_alphanum (base_word);
- nick2 = completion_strdup_alphanum (nick);
-
- return_cmp = ascii_strncasecmp (base_word2, nick2, strlen (base_word2));
-
- free (base_word2);
- free (nick2);
-
- return return_cmp;
-}
-
-/*
- * completion_list_add: add a word to completion word list
- */
-
-void
-completion_list_add (t_completion *completion, char *word,
- int nick_completion, int position)
-{
- if (!word || !word[0])
- return;
-
- if (!completion->base_word || !completion->base_word[0]
- || (nick_completion && (completion_nickncmp (completion->base_word, word,
- strlen (completion->base_word)) == 0))
- || (!nick_completion && (ascii_strncasecmp (completion->base_word, word,
- strlen (completion->base_word)) == 0)))
- {
- weelist_add (&completion->completion_list,
- &completion->last_completion,
- word,
- position);
- }
-}
-
-/*
- * completion_list_add_alias: add alias to completion list
- */
-
-void
-completion_list_add_alias (t_completion *completion)
-{
- t_weechat_alias *ptr_alias;
-
- for (ptr_alias = weechat_alias; ptr_alias; ptr_alias = ptr_alias->next_alias)
- {
- completion_list_add (completion, ptr_alias->alias_name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_alias_cmd: add alias and comands to completion list
- */
-
-void
-completion_list_add_alias_cmd (t_completion *completion)
-{
- t_weelist *ptr_list;
-
- for (ptr_list = index_commands; ptr_list; ptr_list = ptr_list->next_weelist)
- {
- completion_list_add (completion, ptr_list->data, 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_channel: add current channel to completion list
- */
-
-void
-completion_list_add_channel (t_completion *completion)
-{
- if (completion->channel)
- completion_list_add (completion,
- ((t_irc_channel *)(completion->channel))->name,
- 0, WEELIST_POS_SORT);
-}
-
-/*
- * completion_list_add_channels: add server channels to completion list
- */
-
-void
-completion_list_add_channels (t_completion *completion)
-{
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
-
- if (completion->server)
- {
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- for (ptr_channel = ptr_server->channels;
- ptr_channel; ptr_channel = ptr_channel->next_channel)
- {
- completion_list_add (completion, ptr_channel->name,
- 0, WEELIST_POS_SORT);
- }
- }
- }
-}
-
-/*
- * completion_list_add_filename: add filename to completion list
- */
-
-void
-completion_list_add_filename (t_completion *completion)
-{
- char *path_d, *path_b, *p, *d_name;
- char *real_prefix, *prefix;
- char *buffer;
- int buffer_len;
- DIR *dp;
- struct dirent *entry;
- struct stat statbuf;
- char home[3] = { '~', DIR_SEPARATOR_CHAR, '\0' };
-
- buffer_len = PATH_MAX;
- buffer = (char *) malloc (buffer_len * sizeof (char));
- if (!buffer)
- return;
-
- completion->add_space = 0;
-
- if ((strncmp (completion->base_word, home, 2) == 0) && getenv("HOME"))
- {
- real_prefix = strdup (getenv("HOME"));
- prefix = strdup (home);
- }
- else if ((strncmp (completion->base_word, DIR_SEPARATOR, 1) != 0)
- || (strcmp (completion->base_word, "") == 0))
- {
- real_prefix = strdup (weechat_home);
- prefix = strdup ("");
- }
- else
- {
- real_prefix = strdup (DIR_SEPARATOR);
- prefix = strdup (DIR_SEPARATOR);
- }
-
- snprintf (buffer, buffer_len, "%s", completion->base_word + strlen (prefix));
- p = strrchr (buffer, DIR_SEPARATOR_CHAR);
- if (p)
- {
- *p = '\0';
- path_d = strdup (buffer);
- p++;
- path_b = strdup (p);
- }
- else {
- path_d = strdup ("");
- path_b = strdup (buffer);
- }
-
- sprintf (buffer, "%s%s%s", real_prefix, DIR_SEPARATOR, path_d);
- d_name = strdup (buffer);
- dp = opendir(d_name);
- if (dp != NULL)
- {
- while((entry = readdir(dp)) != NULL)
- {
- if (strncmp (entry->d_name, path_b, strlen(path_b)) == 0) {
-
- if (strcmp (entry->d_name, ".") == 0 || strcmp (entry->d_name, "..") == 0)
- continue;
-
- snprintf(buffer, buffer_len, "%s%s%s",
- d_name, DIR_SEPARATOR, entry->d_name);
- if (stat(buffer, &statbuf) == -1)
- continue;
-
- snprintf(buffer, buffer_len, "%s%s%s%s%s%s",
- prefix,
- ((strcmp(prefix, "") == 0)
- || strchr(prefix, DIR_SEPARATOR_CHAR)) ? "" : DIR_SEPARATOR,
- path_d,
- strcmp(path_d, "") == 0 ? "" : DIR_SEPARATOR,
- entry->d_name,
- S_ISDIR(statbuf.st_mode) ? DIR_SEPARATOR : "");
-
- completion_list_add (completion, buffer,
- 0, WEELIST_POS_SORT);
- }
- }
- }
-
- free (d_name);
- free (prefix);
- free (real_prefix);
- free (path_d);
- free (path_b);
- free (buffer);
-}
-
-/*
- * completion_list_add_plugin_cmd: add plugin command handlers to completion list
- */
-
-void
-completion_list_add_plugin_cmd (t_completion *completion)
-{
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
- t_plugin_handler *ptr_handler;
-
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- for (ptr_handler = ptr_plugin->handlers;
- ptr_handler; ptr_handler = ptr_handler->next_handler)
- {
- if (ptr_handler->type == PLUGIN_HANDLER_COMMAND)
- completion_list_add (completion, ptr_handler->command,
- 0, WEELIST_POS_SORT);
- }
- }
-#else
- /* make C compiler happy */
- (void) completion;
-#endif
-}
-
-/*
- * completion_list_add_irc_cmd_sent: add IRC command (sent) to completion list
- */
-
-void
-completion_list_add_irc_cmd_sent (t_completion *completion)
-{
- int i;
-
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if (irc_commands[i].cmd_function_args || irc_commands[i].cmd_function_1arg)
- completion_list_add (completion, irc_commands[i].command_name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_irc_cmd_recv: add IRC command (received) to completion list
- */
-
-void
-completion_list_add_irc_cmd_recv (t_completion *completion)
-{
- int i;
-
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if (irc_commands[i].recv_function)
- completion_list_add(completion, irc_commands[i].command_name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_key_cmd: add key commands/functions to completion list
- */
-
-void
-completion_list_add_key_cmd (t_completion *completion)
-{
- int i;
-
- for (i = 0; gui_key_functions[i].function_name; i++)
- {
- completion_list_add (completion, gui_key_functions[i].function_name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_self_nick: add self nick on server to completion list
- */
-
-void
-completion_list_add_self_nick (t_completion *completion)
-{
- if (completion->server)
- completion_list_add (completion,
- ((t_irc_server *)(completion->server))->nick,
- 0, WEELIST_POS_SORT);
-}
-
-/*
- * completion_list_add_server_nicks: add server nicks to completion list
- */
-
-void
-completion_list_add_server_nicks (t_completion *completion)
-{
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- if (completion->server)
- {
- for (ptr_server = (t_irc_server *)(completion->server); ptr_server;
- ptr_server = ptr_server->next_server)
- {
- for (ptr_channel = ptr_server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- if ((!completion->channel || (t_irc_channel *)(completion->channel) != ptr_channel)
- && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL))
- {
- for (ptr_nick = ptr_channel->nicks; ptr_nick;
- ptr_nick = ptr_nick->next_nick)
- {
- completion_list_add (completion, ptr_nick->nick,
- 1, WEELIST_POS_SORT);
- }
- }
- }
- }
-
- /* add current channel nicks at beginning */
- if (completion->channel && (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_CHANNEL))
- {
- for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
- ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- completion_list_add (completion, ptr_nick->nick,
- 1, WEELIST_POS_BEGINNING);
- }
- }
-
- /* add self nick at the end */
- if (completion->server)
- completion_list_add (completion,
- ((t_irc_server *)(completion->server))->nick,
- 1, WEELIST_POS_END);
-
- completion->arg_is_nick = 1;
- }
-}
-
-/*
- * completion_list_add_channel_nicks: add channel nicks to completion list
- */
-
-void
-completion_list_add_channel_nicks (t_completion *completion)
-{
- t_irc_nick *ptr_nick;
- t_weelist *ptr_weelist;
-
- if (completion->channel)
- {
- if (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_CHANNEL)
- {
- /* add channel nicks */
- for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
- ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- completion_list_add (completion, ptr_nick->nick,
- 1, WEELIST_POS_SORT);
- }
-
- /* add nicks speaking recently on this channel */
- if (cfg_look_nick_completion_smart)
- {
- for (ptr_weelist = ((t_irc_channel *)(completion->channel))->nicks_speaking;
- ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
- {
- if (irc_nick_search ((t_irc_channel *)(completion->channel),
- ptr_weelist->data))
- completion_list_add (completion, ptr_weelist->data,
- 1, WEELIST_POS_BEGINNING);
- }
- }
-
- /* add self nick at the end */
- if (completion->server)
- completion_list_add (completion,
- ((t_irc_server *)(completion->server))->nick,
- 1, WEELIST_POS_END);
- }
- if ((((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_PRIVATE)
- || (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_DCC_CHAT))
- {
- completion_list_add (completion,
- ((t_irc_channel *)(completion->channel))->name,
- 1, WEELIST_POS_SORT);
- }
- completion->arg_is_nick = 1;
- }
-}
-
-/*
- * completion_list_add_channel_nicks_hosts: add channel nicks and hosts to completion list
- */
-
-void
-completion_list_add_channel_nicks_hosts (t_completion *completion)
-{
- t_irc_nick *ptr_nick;
- char *buf;
- int length;
-
- if (completion->channel)
- {
- if (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_CHANNEL)
- {
- for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
- ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- completion_list_add (completion, ptr_nick->nick,
- 1, WEELIST_POS_SORT);
- if (ptr_nick->host)
- {
- length = strlen (ptr_nick->nick) + 1 +
- strlen (ptr_nick->host) + 1;
- buf = (char *) malloc (length);
- if (buf)
- {
- snprintf (buf, length, "%s!%s",
- ptr_nick->nick, ptr_nick->host);
- completion_list_add (completion, buf,
- 1, WEELIST_POS_SORT);
- free (buf);
- }
- }
- }
- }
- if ((((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_PRIVATE)
- || (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_PRIVATE))
- {
- completion_list_add (completion,
- ((t_irc_channel *)(completion->channel))->name,
- 1, WEELIST_POS_SORT);
- }
- completion->arg_is_nick = 1;
- }
-}
-
-/*
- * completion_list_add_option: add config option to completion list
- */
-
-void
-completion_list_add_option (t_completion *completion)
-{
- int i, j;
- t_irc_server *ptr_server;
- char option_name[256];
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- completion_list_add (completion,
- weechat_options[i][j].option_name,
- 0, WEELIST_POS_SORT);
- }
- }
- }
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
- {
- snprintf (option_name, sizeof (option_name), "%s.%s",
- ptr_server->name,
- weechat_options[CONFIG_SECTION_SERVER][i].option_name);
- completion_list_add (completion, option_name, 0, WEELIST_POS_SORT);
- }
- }
-}
-
-/*
- * completion_list_add_plugin_option: add plugin option to completion list
- */
-
-void
-completion_list_add_plugin_option (t_completion *completion)
-{
-#ifdef PLUGINS
- t_plugin_option *ptr_option;
-
- for (ptr_option = plugin_options; ptr_option;
- ptr_option = ptr_option->next_option)
- {
- completion_list_add (completion, ptr_option->name, 0, WEELIST_POS_SORT);
- }
-#else
- /* make C compiler happy */
- (void) completion;
-#endif
-}
-
-/*
- * completion_list_add_part: add part message to completion list
- */
-
-void
-completion_list_add_part (t_completion *completion)
-{
- if (cfg_irc_default_msg_part && cfg_irc_default_msg_part[0])
- completion_list_add (completion, cfg_irc_default_msg_part,
- 0, WEELIST_POS_SORT);
-}
-
-/*
- * completion_list_add_plugin: add plugin name to completion list
- */
-
-void
-completion_list_add_plugin (t_completion *completion)
-{
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
-
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- completion_list_add (completion, ptr_plugin->name,
- 0, WEELIST_POS_SORT);
- }
-#else
- /* make C compiler happy */
- (void) completion;
-#endif
-}
-
-/*
- * completion_list_add_quit: add quit message to completion list
- */
-
-void
-completion_list_add_quit (t_completion *completion)
-{
- if (cfg_irc_default_msg_quit && cfg_irc_default_msg_quit[0])
- completion_list_add (completion, cfg_irc_default_msg_quit,
- 0, WEELIST_POS_SORT);
-}
-
-/*
- * completion_list_add_server: add current server to completion list
- */
-
-void
-completion_list_add_server (t_completion *completion)
-{
- if (completion->server)
- completion_list_add (completion,
- ((t_irc_server *)(completion->server))->name,
- 0, WEELIST_POS_SORT);
-}
-
-/*
- * completion_list_add_servers: add all servers to completion list
- */
-
-void
-completion_list_add_servers (t_completion *completion)
-{
- t_irc_server *ptr_server;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- completion_list_add (completion, ptr_server->name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_list_add_topic: add topic to completion list
- */
-
-void
-completion_list_add_topic (t_completion *completion)
-{
- char *string;
-
- if (completion->server && completion->channel
- && ((t_irc_channel *)(completion->channel))->topic
- && ((t_irc_channel *)(completion->channel))->topic[0])
- {
- if (cfg_irc_colors_send)
- string = (char *)gui_color_decode_for_user_entry ((unsigned char *)((t_irc_channel *)(completion->channel))->topic);
- else
- string = (char *)gui_color_decode ((unsigned char *)((t_irc_channel *)(completion->channel))->topic, 0, 0);
- completion_list_add (completion,
- (string) ?
- string : ((t_irc_channel *)(completion->channel))->topic,
- 0, WEELIST_POS_SORT);
- if (string)
- free (string);
- }
-}
-
-/*
- * completion_list_add_option_value: add option value to completion list
- */
-
-void
-completion_list_add_option_value (t_completion *completion)
-{
- char *pos;
- t_config_option *option;
- void *option_value;
- char option_string[2048];
-
- if (completion->args)
- {
- pos = strchr (completion->args, ' ');
- if (pos)
- pos[0] = '\0';
- option = NULL;
- option_value = NULL;
- config_option_search_option_value (completion->args, &option, &option_value);
- if (option && option_value)
- {
- switch (option->option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- if (option_value && (*((int *)(option_value))))
- completion_list_add (completion, "on",
- 0, WEELIST_POS_SORT);
- else
- completion_list_add (completion, "off",
- 0, WEELIST_POS_SORT);
- break;
- case OPTION_TYPE_INT:
- snprintf (option_string, sizeof (option_string) - 1,
- "%d", (option_value) ? *((int *)(option_value)) : option->default_int);
- completion_list_add (completion, option_string,
- 0, WEELIST_POS_SORT);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- completion_list_add (completion,
- (option_value) ?
- option->array_values[*((int *)(option_value))] :
- option->array_values[option->default_int],
- 0, WEELIST_POS_SORT);
- break;
- case OPTION_TYPE_COLOR:
- completion_list_add (completion,
- (option_value) ?
- gui_color_get_name (*((int *)(option_value))) :
- option->default_string,
- 0, WEELIST_POS_SORT);
- break;
- case OPTION_TYPE_STRING:
- snprintf (option_string, sizeof (option_string) - 1,
- "\"%s\"",
- ((option_value) && (*((char **)(option_value)))) ?
- *((char **)(option_value)) :
- option->default_string);
- completion_list_add (completion, option_string,
- 0, WEELIST_POS_SORT);
- break;
- }
- }
- if (pos)
- pos[0] = ' ';
- }
-}
-
-/*
- * completion_list_add_plugin_option_value: add plugin option value to completion list
- */
-
-void
-completion_list_add_plugin_option_value (t_completion *completion)
-{
-#ifdef PLUGINS
- char *pos;
- t_plugin_option *ptr_option;
-
- if (completion->args)
- {
- pos = strchr (completion->args, ' ');
- if (pos)
- pos[0] = '\0';
-
- ptr_option = plugin_config_search_internal (completion->args);
- if (ptr_option)
- completion_list_add (completion, ptr_option->value,
- 0, WEELIST_POS_SORT);
-
- if (pos)
- pos[0] = ' ';
- }
-#else
- /* make C compiler happy */
- (void) completion;
-#endif
-}
-
-/*
- * completion_list_add_weechat_cmd: add WeeChat commands to completion list
- */
-
-void
-completion_list_add_weechat_cmd (t_completion *completion)
-{
- int i;
-
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- completion_list_add (completion, weechat_commands[i].command_name,
- 0, WEELIST_POS_SORT);
- }
-}
-
-/*
- * completion_build_list_template: build data list according to a template
- */
-
-void
-completion_build_list_template (t_completion *completion, char *template)
-{
- char *word, *pos;
- int word_offset;
-
- word = strdup (template);
- word_offset = 0;
- pos = template;
- while (pos)
- {
- switch (pos[0])
- {
- case '\0':
- case ' ':
- case '|':
- if (word_offset > 0)
- {
- word[word_offset] = '\0';
- weelist_add (&completion->completion_list,
- &completion->last_completion,
- word,
- WEELIST_POS_SORT);
- }
- word_offset = 0;
- break;
- case '%':
- pos++;
- if (pos && pos[0])
- {
- switch (pos[0])
- {
- case '-': /* stop completion */
- completion_stop (completion);
- free (word);
- return;
- break;
- case '*': /* repeat last completion (do nothing there) */
- break;
- case 'a': /* alias */
- completion_list_add_alias (completion);
- break;
- case 'A': /* alias or any command */
- completion_list_add_alias_cmd (completion);
- break;
- case 'c': /* current channel */
- completion_list_add_channel (completion);
- break;
- case 'C': /* all channels */
- completion_list_add_channels (completion);
- break;
- case 'f': /* filename */
- completion_list_add_filename (completion);
- break;
- case 'h': /* plugin command handlers */
- completion_list_add_plugin_cmd (completion);
- break;
- case 'i': /* IRC command (sent) */
- completion_list_add_irc_cmd_sent (completion);
- break;
- case 'I': /* IRC command (received) */
- completion_list_add_irc_cmd_recv (completion);
- break;
- case 'k': /* key cmd/funtcions*/
- completion_list_add_key_cmd (completion);
- break;
- case 'm': /* self nickname */
- completion_list_add_self_nick (completion);
- break;
- case 'M': /* nicks of current server (all open channels) */
- completion_list_add_server_nicks (completion);
- break;
- case 'n': /* channel nicks */
- completion_list_add_channel_nicks (completion);
- completion->context = COMPLETION_NICK;
- break;
- case 'N': /* channel nicks and hosts */
- completion_list_add_channel_nicks_hosts (completion);
- break;
- case 'o': /* config option */
- completion_list_add_option (completion);
- break;
- case 'O': /* plugin option */
- completion_list_add_plugin_option (completion);
- break;
- case 'p': /* part message */
- completion_list_add_part (completion);
- break;
- case 'P': /* plugin name */
- completion_list_add_plugin (completion);
- break;
- case 'q': /* quit message */
- completion_list_add_quit (completion);
- break;
- case 's': /* current server */
- completion_list_add_server (completion);
- break;
- case 'S': /* all servers */
- completion_list_add_servers (completion);
- break;
- case 't': /* topic */
- completion_list_add_topic (completion);
- break;
- case 'v': /* value of config option */
- completion_list_add_option_value (completion);
- break;
- case 'V': /* value of plugin option */
- completion_list_add_plugin_option_value (completion);
- break;
- case 'w': /* WeeChat commands */
- completion_list_add_weechat_cmd (completion);
- break;
- }
- }
- break;
- default:
- word[word_offset++] = pos[0];
- }
- /* end of argument in template? */
- if (!pos[0] || (pos[0] == ' '))
- pos = NULL;
- else
- pos++;
- }
- free (word);
-}
-
-/*
- * completion_build_list: build data list according to command and argument #
- */
-
-void
-completion_build_list (t_completion *completion)
-{
- char *template, *pos_template, *pos_space;
- int repeat_last, max_arg, i, length;
-
- repeat_last = 0;
-
- completion_get_command_infos (completion, &template, &max_arg);
- if (!template || (strcmp (template, "-") == 0) ||
- (completion->base_command_arg > max_arg))
- {
- completion_stop (completion);
- return;
- }
-
- length = strlen (template);
- if (length >= 2)
- {
- if (strcmp (template + length - 2, "%*") == 0)
- repeat_last = 1;
- }
-
- i = 1;
- pos_template = template;
- while (pos_template && pos_template[0])
- {
- pos_space = strchr (pos_template, ' ');
- if (i == completion->base_command_arg)
- {
- completion_build_list_template (completion, pos_template);
- return;
- }
- if (pos_space)
- {
- pos_template = pos_space;
- while (pos_template[0] == ' ')
- pos_template++;
- }
- else
- pos_template = NULL;
- i++;
- }
- if (repeat_last)
- {
- pos_space = rindex (template, ' ');
- completion_build_list_template (completion,
- (pos_space) ? pos_space + 1 : template);
- }
-}
-
-/*
- * completion_find_context: find context for completion
- */
-
-void
-completion_find_context (t_completion *completion, char *buffer, int size, int pos)
-{
- int i, command, command_arg, pos_start, pos_end;
-
- /* look for context */
- completion_free (completion);
- completion_init (completion, completion->server, completion->channel);
- command = ((buffer[0] == '/') && (buffer[1] != '/')) ? 1 : 0;
- command_arg = 0;
- i = 0;
- while (i < pos)
- {
- if (buffer[i] == ' ')
- {
- command_arg++;
- i++;
- while ((i < pos) && (buffer[i] == ' ')) i++;
- if (!completion->args)
- completion->args = strdup (buffer + i);
- }
- else
- i++;
- }
- if (command)
- {
- if (command_arg > 0)
- {
- completion->context = COMPLETION_COMMAND_ARG;
- completion->base_command_arg = command_arg;
- }
- else
- {
- completion->context = COMPLETION_COMMAND;
- completion->base_command_arg = 0;
- }
- }
- else
- completion->context = COMPLETION_AUTO;
-
- /* look for word to complete (base word) */
- completion->base_word_pos = 0;
- completion->position_replace = pos;
-
- if (size > 0)
- {
- i = pos;
- pos_start = i;
- if (buffer[i] == ' ')
- {
- if ((i > 0) && (buffer[i-1] != ' '))
- {
- i--;
- while ((i >= 0) && (buffer[i] != ' '))
- i--;
- pos_start = i + 1;
- }
- }
- else
- {
- while ((i >= 0) && (buffer[i] != ' '))
- i--;
- pos_start = i + 1;
- }
- i = pos;
- while ((i < size) && (buffer[i] != ' '))
- i++;
- pos_end = i - 1;
-
- completion->base_word_pos = pos_start;
-
- if (pos_start <= pos_end)
- {
- if (completion->context == COMPLETION_COMMAND)
- completion->position_replace = pos_start + 1;
- else
- completion->position_replace = pos_start;
-
- completion->base_word = (char *) malloc (pos_end - pos_start + 2);
- for (i = pos_start; i <= pos_end; i++)
- completion->base_word[i - pos_start] = buffer[i];
- completion->base_word[pos_end - pos_start + 1] = '\0';
- }
- }
-
- if (!completion->base_word)
- completion->base_word = strdup ("");
-
- /* find command (for command argument completion only) */
- if (completion->context == COMPLETION_COMMAND_ARG)
- {
- pos_start = 0;
- while ((pos_start < size) && (buffer[pos_start] != '/'))
- pos_start++;
- if (buffer[pos_start] == '/')
- {
- pos_start++;
- pos_end = pos_start;
- while ((pos_end < size) && (buffer[pos_end] != ' '))
- pos_end++;
- if (buffer[pos_end] == ' ')
- pos_end--;
-
- completion->base_command = (char *) malloc (pos_end - pos_start + 2);
- for (i = pos_start; i <= pos_end; i++)
- completion->base_command[i - pos_start] = buffer[i];
- completion->base_command[pos_end - pos_start + 1] = '\0';
- completion_build_list (completion);
- }
- }
-
- /* auto completion with nothing as base word is disabled,
- in order to prevent completion when pasting messages with [tab] inside */
- if ((completion->context == COMPLETION_AUTO)
- && ((!completion->base_word) || (!completion->base_word[0])))
- {
- completion->context = COMPLETION_NULL;
- return;
- }
-}
-
-/*
- * completion_command: complete a command
- */
-
-void
-completion_command (t_completion *completion)
-{
- int length, word_found_seen, other_completion;
- t_weelist *ptr_weelist, *ptr_weelist2;
-
- length = strlen (completion->base_word) - 1;
- word_found_seen = 0;
- other_completion = 0;
- if (completion->direction < 0)
- ptr_weelist = last_index_command;
- else
- ptr_weelist = index_commands;
- while (ptr_weelist)
- {
- if (ascii_strncasecmp (ptr_weelist->data, completion->base_word + 1, length) == 0)
- {
- if ((!completion->word_found) || word_found_seen)
- {
- if (completion->word_found)
- free (completion->word_found);
- completion->word_found = strdup (ptr_weelist->data);
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist->next_weelist;
-
- while (ptr_weelist2)
- {
- if (ascii_strncasecmp (ptr_weelist2->data,
- completion->base_word + 1, length) == 0)
- other_completion++;
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist2->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist2->next_weelist;
- }
-
- if (other_completion == 0)
- completion->position = -1;
- else
- if (completion->position < 0)
- completion->position = 0;
- return;
- }
- other_completion++;
- }
- if (completion->word_found &&
- (ascii_strcasecmp (ptr_weelist->data, completion->word_found) == 0))
- word_found_seen = 1;
-
- if (completion->direction < 0)
- ptr_weelist = ptr_weelist->prev_weelist;
- else
- ptr_weelist = ptr_weelist->next_weelist;
- }
- if (completion->word_found)
- {
- free (completion->word_found);
- completion->word_found = NULL;
- completion_command (completion);
- }
-}
-
-/*
- * completion_command_arg: complete a command argument
- */
-
-void
-completion_command_arg (t_completion *completion, int nick_completion)
-{
- int length, word_found_seen, other_completion;
- t_weelist *ptr_weelist, *ptr_weelist2;
-
- length = strlen (completion->base_word);
- word_found_seen = 0;
- other_completion = 0;
- if (completion->direction < 0)
- ptr_weelist = completion->last_completion;
- else
- ptr_weelist = completion->completion_list;
-
- while (ptr_weelist)
- {
- if ((nick_completion && (completion_nickncmp (completion->base_word, ptr_weelist->data, length) == 0))
- || ((!nick_completion) && (ascii_strncasecmp (completion->base_word, ptr_weelist->data, length) == 0)))
- {
- if ((!completion->word_found) || word_found_seen)
- {
- if (completion->word_found)
- free (completion->word_found);
- completion->word_found = strdup (ptr_weelist->data);
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist->next_weelist;
-
- while (ptr_weelist2)
- {
- if ((nick_completion
- && (completion_nickncmp (completion->base_word, ptr_weelist2->data, length) == 0))
- || ((!nick_completion)
- && (ascii_strncasecmp (completion->base_word, ptr_weelist2->data, length) == 0)))
- other_completion++;
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist2->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist2->next_weelist;
- }
-
- if (other_completion == 0)
- completion->position = -1;
- else
- if (completion->position < 0)
- completion->position = 0;
- return;
- }
- other_completion++;
- }
- if (completion->word_found &&
- (ascii_strcasecmp (ptr_weelist->data, completion->word_found) == 0))
- word_found_seen = 1;
-
- if (completion->direction < 0)
- ptr_weelist = ptr_weelist->prev_weelist;
- else
- ptr_weelist = ptr_weelist->next_weelist;
- }
- if (completion->word_found)
- {
- free (completion->word_found);
- completion->word_found = NULL;
- completion_command_arg (completion, nick_completion);
- }
-}
-
-/*
- * completion_nick: complete a nick
- */
-
-void
-completion_nick (t_completion *completion)
-{
- int length, word_found_seen, other_completion;
- t_irc_nick *ptr_nick;
- t_weelist *ptr_weelist, *ptr_weelist2;
-
- if (!completion->channel)
- return;
-
- completion->context = COMPLETION_NICK;
-
- if ((((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_PRIVATE)
- || (((t_irc_channel *)(completion->channel))->type == IRC_CHANNEL_TYPE_DCC_CHAT))
- {
- if (!(completion->completion_list))
- {
- weelist_add (&completion->completion_list,
- &completion->last_completion,
- ((t_irc_channel *)(completion->channel))->name,
- WEELIST_POS_SORT);
- weelist_add (&completion->completion_list,
- &completion->last_completion,
- ((t_irc_server *)(completion->server))->nick,
- WEELIST_POS_SORT);
- }
- completion_command_arg (completion, 1);
- return;
- }
-
- /* rebuild nick list for completion, with nicks speaking at beginning of list */
- if ((((t_irc_channel *)(completion->channel))->nick_completion_reset)
- || (!(completion->completion_list)))
- {
- /* empty completion list */
- if (completion->completion_list)
- {
- weelist_remove_all (&(completion->completion_list),
- &(completion->last_completion));
- completion->completion_list = NULL;
- completion->last_completion = NULL;
- }
-
- /* add channel nicks */
- for (ptr_nick = ((t_irc_channel *)(completion->channel))->nicks;
- ptr_nick; ptr_nick = ptr_nick->next_nick)
- {
- weelist_add (&(completion->completion_list),
- &(completion->last_completion),
- ptr_nick->nick,
- WEELIST_POS_SORT);
- }
-
- /* add nicks speaking recently on this channel */
- if (cfg_look_nick_completion_smart)
- {
- for (ptr_weelist = ((t_irc_channel *)(completion->channel))->nicks_speaking;
- ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
- {
- if (irc_nick_search ((t_irc_channel *)(completion->channel),
- ptr_weelist->data))
- weelist_add (&(completion->completion_list),
- &(completion->last_completion),
- ptr_weelist->data,
- WEELIST_POS_BEGINNING);
- }
- }
-
- /* add self nick at the end */
- if (completion->server)
- weelist_add (&(completion->completion_list),
- &(completion->last_completion),
- ((t_irc_server *)(completion->server))->nick,
- WEELIST_POS_END);
-
- ((t_irc_channel *)(completion->channel))->nick_completion_reset = 0;
- }
-
- length = strlen (completion->base_word);
- word_found_seen = 0;
- other_completion = 0;
-
- if (completion->direction < 0)
- ptr_weelist = completion->last_completion;
- else
- ptr_weelist = completion->completion_list;
-
- while (ptr_weelist)
- {
- if (completion_nickncmp (completion->base_word, ptr_weelist->data, length) == 0)
- {
- if ((!completion->word_found) || word_found_seen)
- {
- if (completion->word_found)
- free (completion->word_found);
- completion->word_found = strdup (ptr_weelist->data);
- if (cfg_look_nick_complete_first)
- {
- completion->position = -1;
- return;
- }
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist->next_weelist;
-
- while (ptr_weelist2)
- {
- if (completion_nickncmp (completion->base_word,
- ptr_weelist2->data,
- length) == 0)
- other_completion++;
-
- if (completion->direction < 0)
- ptr_weelist2 = ptr_weelist2->prev_weelist;
- else
- ptr_weelist2 = ptr_weelist2->next_weelist;
- }
-
- if (other_completion == 0)
- completion->position = -1;
- else
- {
- if (completion->position < 0)
- completion->position = 0;
- }
- return;
- }
- other_completion++;
- }
- if (completion->word_found &&
- (ascii_strcasecmp (ptr_weelist->data, completion->word_found) == 0))
- word_found_seen = 1;
-
- if (completion->direction < 0)
- ptr_weelist = ptr_weelist->prev_weelist;
- else
- ptr_weelist = ptr_weelist->next_weelist;
- }
- if (completion->word_found)
- {
- free (completion->word_found);
- completion->word_found = NULL;
- completion_nick (completion);
- }
-}
-
-/*
- * completion_auto: auto complete: nick, filename or channel
- */
-
-void
-completion_auto (t_completion *completion)
-{
- /* filename completion */
- if ((completion->base_word[0] == '/')
- || (completion->base_word[0] == '~'))
- {
- if (!completion->completion_list)
- completion_list_add_filename (completion);
- completion_command_arg (completion, 0);
- return;
- }
-
- /* channel completion */
- if (irc_channel_is_channel (completion->base_word))
- {
- if (!completion->completion_list)
- completion_list_add_channels (completion);
- completion_command_arg (completion, 0);
- return;
- }
-
- /* default: nick completion (if channel) */
- if (completion->channel)
- completion_nick (completion);
- else
- completion->context = COMPLETION_NULL;
-}
-
-/*
- * completion_search: complete word according to context
- */
-
-void
-completion_search (t_completion *completion, int direction,
- char *buffer, int size, int pos)
-{
- char *old_word_found;
-
- completion->direction = direction;
-
- /* if new completion => look for base word */
- if (pos != completion->position)
- {
- if (completion->word_found)
- free (completion->word_found);
- completion->word_found = NULL;
- completion_find_context (completion, buffer, size, pos);
- }
-
- /* completion */
- old_word_found = (completion->word_found) ?
- strdup (completion->word_found) : NULL;
- switch (completion->context)
- {
- case COMPLETION_NULL:
- /* should never be executed */
- return;
- case COMPLETION_NICK:
- completion_nick (completion);
- break;
- case COMPLETION_COMMAND:
- completion_command (completion);
- break;
- case COMPLETION_COMMAND_ARG:
- if (completion->completion_list)
- completion_command_arg (completion, completion->arg_is_nick);
- else
- {
- completion->context = COMPLETION_AUTO;
- completion_auto (completion);
- }
- break;
- case COMPLETION_AUTO:
- completion_auto (completion);
- break;
- }
- if (completion->word_found)
- {
- if (old_word_found)
- {
- completion->diff_size = strlen (completion->word_found) -
- strlen (old_word_found);
- completion->diff_length = utf8_strlen (completion->word_found) -
- utf8_strlen (old_word_found);
- }
- else
- {
- completion->diff_size = strlen (completion->word_found) -
- strlen (completion->base_word);
- completion->diff_length = utf8_strlen (completion->word_found) -
- utf8_strlen (completion->base_word);
- if (completion->context == COMPLETION_COMMAND)
- {
- completion->diff_size++;
- completion->diff_length++;
- }
- }
- }
- if (old_word_found)
- free (old_word_found);
-}
-
-/*
- * completion_print_log: print completion list in log (usually for crash dump)
- */
-
-void
-completion_print_log (t_completion *completion)
-{
- weechat_log_printf ("[completion (addr:0x%X)]\n", completion);
- weechat_log_printf (" server . . . . . . . . : 0x%X\n", completion->server);
- weechat_log_printf (" channel. . . . . . . . : 0x%X\n", completion->channel);
- weechat_log_printf (" context. . . . . . . . : %d\n", completion->context);
- weechat_log_printf (" base_command . . . . . : '%s'\n", completion->base_command);
- weechat_log_printf (" base_command_arg . . . : %d\n", completion->base_command_arg);
- weechat_log_printf (" arg_is_nick. . . . . . : %d\n", completion->arg_is_nick);
- weechat_log_printf (" base_word. . . . . . . : '%s'\n", completion->base_word);
- weechat_log_printf (" base_word_pos. . . . . : %d\n", completion->base_word_pos);
- weechat_log_printf (" position . . . . . . . : %d\n", completion->position);
- weechat_log_printf (" args . . . . . . . . . : '%s'\n", completion->args);
- weechat_log_printf (" direction. . . . . . . : %d\n", completion->direction);
- weechat_log_printf (" add_space. . . . . . . : %d\n", completion->add_space);
- weechat_log_printf (" completion_list. . . . : 0x%X\n", completion->completion_list);
- weechat_log_printf (" last_completion. . . . : 0x%X\n", completion->last_completion);
- weechat_log_printf (" word_found . . . . . . : '%s'\n", completion->word_found);
- weechat_log_printf (" position_replace . . . : %d\n", completion->position_replace);
- weechat_log_printf (" diff_size. . . . . . . : %d\n", completion->diff_size);
- weechat_log_printf (" diff_length. . . . . . : %d\n", completion->diff_length);
- if (completion->completion_list)
- {
- weechat_log_printf ("\n");
- weelist_print_log (completion->completion_list,
- "completion list element");
- }
-}
diff --git a/src/common/completion.h b/src/common/completion.h
deleted file mode 100644
index 5b9ff9bd7..000000000
--- a/src/common/completion.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_COMPLETION_H
-#define __WEECHAT_COMPLETION_H 1
-
-#include "weelist.h"
-
-#define COMPLETION_NULL 0
-#define COMPLETION_NICK 1
-#define COMPLETION_COMMAND 2
-#define COMPLETION_COMMAND_ARG 3
-#define COMPLETION_AUTO 4
-
-typedef struct t_completion t_completion;
-
-struct t_completion
-{
- /* completion context */
- void *server; /* server pointer */
- void *channel; /* channel pointer */
- int context; /* context: null, nick, command, cmd arg */
- char *base_command; /* command with arg to complete (can be NULL) */
- int base_command_arg; /* # arg to complete (if context is cmd arg) */
- int arg_is_nick; /* argument is nick */
- char *base_word; /* word to complete (when Tab was pressed) */
- int base_word_pos; /* beggining of base word */
- int position; /* position where Tab was pressed */
- char *args; /* command line args (including base word) */
- int direction; /* +1 = search next word, -1 = previous word */
- int add_space; /* add space after completion? */
-
- /* for command argument completion */
- t_weelist *completion_list; /* data list for completion */
- t_weelist *last_completion; /* last data element for completion */
-
- /* completion found */
- char *word_found; /* word found (to replace base word) */
- int position_replace; /* position where word has to be replaced */
- int diff_size; /* size difference (< 0 = char(s) deleted) */
- int diff_length; /* length difference (<= diff_size) */
-};
-
-extern void completion_init (t_completion *, void *, void *);
-extern void completion_free (t_completion *);
-extern void completion_search (t_completion *, int, char *, int, int);
-extern void completion_print_log (t_completion *);
-
-#endif /* completion.h */
diff --git a/src/common/fifo.c b/src/common/fifo.c
deleted file mode 100644
index 9a6f50e77..000000000
--- a/src/common/fifo.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* fifo.c: FIFO pipe for WeeChat remote control */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "weechat.h"
-#include "fifo.h"
-#include "command.h"
-#include "log.h"
-#include "weeconfig.h"
-#include "../gui/gui.h"
-
-
-int weechat_fifo = -1;
-char *weechat_fifo_filename = NULL;
-char *weechat_fifo_unterminated = NULL;
-
-
-/*
- * fifo_create: create FIFO pipe for remote control
- */
-
-void
-fifo_create ()
-{
- int filename_length;
-
- if (cfg_irc_fifo_pipe)
- {
- /* build FIFO filename: "<weechat_home>/weechat_fifo_" + process PID */
- if (!weechat_fifo_filename)
- {
- filename_length = strlen (weechat_home) + 64;
- weechat_fifo_filename = (char *) malloc (filename_length * sizeof (char));
- snprintf (weechat_fifo_filename, filename_length, "%s/weechat_fifo_%d",
- weechat_home, (int) getpid());
- }
-
- /* create FIFO pipe, writable for user only */
- if ((weechat_fifo = mkfifo (weechat_fifo_filename, 0600)) != 0)
- {
- weechat_fifo = -1;
- gui_printf (NULL,
- _("%s unable to create FIFO pipe for remote control (%s)\n"),
- WEECHAT_ERROR, weechat_fifo_filename);
- weechat_log_printf (_("%s unable to create FIFO pipe for "
- "remote control (%s)\n"),
- WEECHAT_ERROR, weechat_fifo_filename);
- return;
- }
-
- /* open FIFO pipe in read-only (for WeeChat), non nlobking mode */
- if ((weechat_fifo = open (weechat_fifo_filename, O_RDONLY | O_NONBLOCK)) == -1)
- {
- gui_printf (NULL,
- _("%s unable to open FIFO pipe (%s) for reading\n"),
- WEECHAT_ERROR, weechat_fifo_filename);
- weechat_log_printf (_("%s unable to open FIFO pipe (%s) for reading\n"),
- WEECHAT_ERROR, weechat_fifo_filename);
- return;
- }
-
- weechat_log_printf (_("FIFO pipe is open\n"));
- }
-}
-
-/*
- * fifo_exec: execute a command/text received by FIFO pipe
- */
-
-void
-fifo_exec (char *text)
-{
- char *pos_msg, *pos;
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
-
- pos = NULL;
- ptr_server = NULL;
- ptr_channel = NULL;
-
- /* look for server/channel at beginning of text */
- /* text may be: "server,channel *text" or "server *text" or "*text" */
- if (text[0] == '*')
- {
- pos_msg = text + 1;
- if (gui_current_window->buffer->has_input)
- {
- ptr_server = GUI_SERVER(gui_current_window->buffer);
- ptr_channel = GUI_CHANNEL(gui_current_window->buffer);
- }
- else
- {
- ptr_server = GUI_SERVER(gui_buffers);
- ptr_channel = NULL;
- }
- }
- else
- {
- pos_msg = strstr (text, " *");
- if (!pos_msg)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s invalid text received on FIFO pipe\n"),
- WEECHAT_WARNING);
- return;
- }
- pos_msg[0] = '\0';
- pos = pos_msg - 1;
- pos_msg += 2;
- while ((pos >= text) && (pos[0] == ' '))
- {
- pos[0] = '\0';
- pos--;
- }
-
- if (text[0])
- {
- pos = strchr (text, ',');
- if (pos)
- pos[0] = '\0';
- ptr_server = irc_server_search (text);
- if (!ptr_server || !ptr_server->buffer)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL, _("%s server \"%s\" not found (FIFO pipe data)\n"),
- WEECHAT_WARNING, text);
- return;
- }
- if (ptr_server && pos)
- {
- ptr_channel = irc_channel_search_any (ptr_server, pos + 1);
- if (!ptr_channel)
- {
- irc_display_prefix (NULL, NULL, GUI_PREFIX_ERROR);
- gui_printf (NULL,
- _("%s channel \"%s\" not found (FIFO pipe data)\n"),
- WEECHAT_WARNING, pos + 1);
- return;
- }
- }
- }
- }
-
- user_command (ptr_server, ptr_channel, pos_msg, 0);
-}
-
-/*
- * fifo_read: read data in FIFO pipe
- */
-
-void
-fifo_read ()
-{
- static char buffer[4096 + 2];
- char *buf2, *pos, *ptr_buf, *next_ptr_buf;
- int num_read;
-
- num_read = read (weechat_fifo, buffer, sizeof (buffer) - 2);
- if (num_read > 0)
- {
- buffer[num_read] = '\0';
-
- buf2 = NULL;
- ptr_buf = buffer;
- if (weechat_fifo_unterminated)
- {
- buf2 = (char *) malloc (strlen (weechat_fifo_unterminated) +
- strlen (buffer) + 1);
- if (buf2)
- {
- strcpy (buf2, weechat_fifo_unterminated);
- strcat (buf2, buffer);
- }
- ptr_buf = buf2;
- free (weechat_fifo_unterminated);
- weechat_fifo_unterminated = NULL;
- }
-
- while (ptr_buf && ptr_buf[0])
- {
- next_ptr_buf = NULL;
- pos = strstr (ptr_buf, "\r\n");
- if (pos)
- {
- pos[0] = '\0';
- next_ptr_buf = pos + 2;
- }
- else
- {
- pos = strstr (ptr_buf, "\n");
- if (pos)
- {
- pos[0] = '\0';
- next_ptr_buf = pos + 1;
- }
- else
- {
- weechat_fifo_unterminated = strdup (ptr_buf);
- ptr_buf = NULL;
- next_ptr_buf = NULL;
- }
- }
-
- if (ptr_buf)
- fifo_exec (ptr_buf);
-
- ptr_buf = next_ptr_buf;
- }
-
- if (buf2)
- free (buf2);
- }
- else
- {
- if (num_read < 0)
- {
- gui_printf (NULL,
- _("%s error reading FIFO pipe, closing it\n"),
- WEECHAT_ERROR);
- weechat_log_printf (_("%s error reading FIFO pipe, closing it\n"),
- WEECHAT_ERROR);
- fifo_remove ();
- }
- else
- {
- close (weechat_fifo);
- weechat_fifo = open (weechat_fifo_filename, O_RDONLY | O_NONBLOCK);
- }
- }
-}
-
-/*
- * fifo_remove: remove FIFO pipe
- */
-
-void
-fifo_remove ()
-{
- if (weechat_fifo != -1)
- {
- /* close FIFO pipe */
- close (weechat_fifo);
- weechat_fifo = -1;
- }
-
- /* remove FIFO from disk */
- if (weechat_fifo_filename)
- unlink (weechat_fifo_filename);
-
- if (weechat_fifo_unterminated)
- {
- free (weechat_fifo_unterminated);
- weechat_fifo_unterminated = NULL;
- }
-
- if (weechat_fifo_filename)
- {
- free (weechat_fifo_filename);
- weechat_fifo_filename = NULL;
- }
-
- weechat_log_printf (_("FIFO pipe is closed\n"));
-}
diff --git a/src/common/fifo.h b/src/common/fifo.h
deleted file mode 100644
index 2dc01bdef..000000000
--- a/src/common/fifo.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_FIFO_H
-#define __WEECHAT_FIFO_H 1
-
-extern int weechat_fifo;
-
-extern void fifo_create ();
-extern void fifo_read ();
-extern void fifo_remove ();
-
-#endif /* fifo.h */
diff --git a/src/common/history.c b/src/common/history.c
deleted file mode 100644
index 0a682f9e9..000000000
--- a/src/common/history.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* history.c: memorize commands or text */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "weechat.h"
-#include "history.h"
-#include "util.h"
-#include "weeconfig.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-
-t_history *history_global = NULL;
-t_history *history_global_last = NULL;
-t_history *history_global_ptr = NULL;
-int num_history_global = 0;
-
-
-/*
- * history_buffer_add: add a text/command to buffer's history
- */
-
-void
-history_buffer_add (void *buffer, char *string)
-{
- t_history *new_history, *ptr_history;
-
- if (!string)
- return;
-
- if ( !((t_gui_buffer *)(buffer))->history
- || ( ((t_gui_buffer *)(buffer))->history
- && ascii_strcasecmp (((t_gui_buffer *)(buffer))->history->text, string) != 0))
- {
- new_history = (t_history *)malloc (sizeof (t_history));
- if (new_history)
- {
- new_history->text = strdup (string);
- if (cfg_log_hide_nickserv_pwd)
- irc_display_hide_password (new_history->text, 1);
-
- if (((t_gui_buffer *)(buffer))->history)
- ((t_gui_buffer *)(buffer))->history->prev_history = new_history;
- else
- ((t_gui_buffer *)(buffer))->last_history = new_history;
- new_history->next_history = ((t_gui_buffer *)(buffer))->history;
- new_history->prev_history = NULL;
- ((t_gui_buffer *)buffer)->history = new_history;
- ((t_gui_buffer *)buffer)->num_history++;
-
- /* remove one command if necessary */
- if ((cfg_history_max_commands > 0)
- && (((t_gui_buffer *)(buffer))->num_history > cfg_history_max_commands))
- {
- ptr_history = ((t_gui_buffer *)buffer)->last_history->prev_history;
- if (((t_gui_buffer *)buffer)->ptr_history == ((t_gui_buffer *)buffer)->last_history)
- ((t_gui_buffer *)buffer)->ptr_history = ptr_history;
- ((t_gui_buffer *)buffer)->last_history->prev_history->next_history = NULL;
- if (((t_gui_buffer *)buffer)->last_history->text)
- free (((t_gui_buffer *)buffer)->last_history->text);
- free (((t_gui_buffer *)buffer)->last_history);
- ((t_gui_buffer *)buffer)->last_history = ptr_history;
- ((t_gui_buffer *)(buffer))->num_history++;
- }
- }
- }
-}
-
-/*
- * history_global_add: add a text/command to buffer's history
- */
-
-void
-history_global_add (char *string)
-{
- t_history *new_history, *ptr_history;
-
- if (!string)
- return;
-
- if (!history_global
- || (history_global
- && ascii_strcasecmp (history_global->text, string) != 0))
- {
- new_history = (t_history *)malloc (sizeof (t_history));
- if (new_history)
- {
- new_history->text = strdup (string);
- if (cfg_log_hide_nickserv_pwd)
- irc_display_hide_password (new_history->text, 1);
-
- if (history_global)
- history_global->prev_history = new_history;
- else
- history_global_last = new_history;
- new_history->next_history = history_global;
- new_history->prev_history = NULL;
- history_global = new_history;
- num_history_global++;
-
- /* remove one command if necessary */
- if ((cfg_history_max_commands > 0)
- && (num_history_global > cfg_history_max_commands))
- {
- ptr_history = history_global_last->prev_history;
- if (history_global_ptr == history_global_last)
- history_global_ptr = ptr_history;
- history_global_last->prev_history->next_history = NULL;
- if (history_global_last->text)
- free (history_global_last->text);
- free (history_global_last);
- history_global_last = ptr_history;
- num_history_global--;
- }
- }
- }
-}
-
-/*
- * history_global_free: free global history
- */
-
-void
-history_global_free ()
-{
- t_history *ptr_history;
-
- while (history_global)
- {
- ptr_history = history_global->next_history;
- if (history_global->text)
- free (history_global->text);
- free (history_global);
- history_global = ptr_history;
- }
- history_global = NULL;
- history_global_last = NULL;
- history_global_ptr = NULL;
- num_history_global = 0;
-}
-
-
-/*
- * history_buffer_free: free history for a buffer
- */
-
-void
-history_buffer_free (void *buffer)
-{
- t_history *ptr_history;
-
- while (((t_gui_buffer *)(buffer))->history)
- {
- ptr_history = ((t_gui_buffer *)(buffer))->history->next_history;
- if (((t_gui_buffer *)(buffer))->history->text)
- free (((t_gui_buffer *)(buffer))->history->text);
- free (((t_gui_buffer *)(buffer))->history);
- ((t_gui_buffer *)(buffer))->history = ptr_history;
- }
- ((t_gui_buffer *)(buffer))->history = NULL;
- ((t_gui_buffer *)(buffer))->last_history = NULL;
- ((t_gui_buffer *)(buffer))->ptr_history = NULL;
- ((t_gui_buffer *)(buffer))->num_history = 0;
-}
diff --git a/src/common/history.h b/src/common/history.h
deleted file mode 100644
index 166893b49..000000000
--- a/src/common/history.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_HISTORY_H
-#define __WEECHAT_HISTORY_H 1
-
-typedef struct t_history t_history;
-
-struct t_history
-{
- char *text; /* text or command (as entered by user) */
- t_history *next_history; /* link to next text/command */
- t_history *prev_history; /* link to previous text/command */
-};
-
-extern t_history *history_global;
-extern t_history *history_global_last;
-extern t_history *history_global_ptr;
-
-extern void history_buffer_add (void *, char *);
-extern void history_global_add (char *);
-extern void history_global_free ();
-extern void history_buffer_free (void *);
-
-#endif /* history.h */
diff --git a/src/common/hotlist.c b/src/common/hotlist.c
deleted file mode 100644
index 10e37ece1..000000000
--- a/src/common/hotlist.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* hotlist.c: WeeChat hotlist (buffers with activity) */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "weechat.h"
-#include "hotlist.h"
-#include "log.h"
-#include "util.h"
-#include "weeconfig.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-
-t_weechat_hotlist *weechat_hotlist = NULL;
-t_weechat_hotlist *last_weechat_hotlist = NULL;
-t_gui_buffer *hotlist_initial_buffer = NULL;
-
-
-/*
- * hotlist_search: find hotlist with buffer pointer
- */
-
-t_weechat_hotlist *
-hotlist_search (t_weechat_hotlist *hotlist, t_gui_buffer *buffer)
-{
- t_weechat_hotlist *ptr_hotlist;
-
- for (ptr_hotlist = hotlist; ptr_hotlist; ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if (ptr_hotlist->buffer == buffer)
- return ptr_hotlist;
- }
- return NULL;
-}
-
-/*
- * hotlist_find_pos: find position for a inserting in hotlist (for sorting hotlist)
- */
-
-t_weechat_hotlist *
-hotlist_find_pos (t_weechat_hotlist *hotlist, t_weechat_hotlist *new_hotlist)
-{
- t_weechat_hotlist *ptr_hotlist;
-
- switch (cfg_look_hotlist_sort)
- {
- case CFG_LOOK_HOTLIST_SORT_GROUP_TIME_ASC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if ((new_hotlist->priority > ptr_hotlist->priority)
- || ((new_hotlist->priority == ptr_hotlist->priority)
- && (get_timeval_diff (&(new_hotlist->creation_time),
- &(ptr_hotlist->creation_time)) > 0)))
- return ptr_hotlist;
- }
- break;
- case CFG_LOOK_HOTLIST_SORT_GROUP_TIME_DESC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if ((new_hotlist->priority > ptr_hotlist->priority)
- || ((new_hotlist->priority == ptr_hotlist->priority)
- && (get_timeval_diff (&(new_hotlist->creation_time),
- &(ptr_hotlist->creation_time)) < 0)))
- return ptr_hotlist;
- }
- break;
- case CFG_LOOK_HOTLIST_SORT_GROUP_NUMBER_ASC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if ((new_hotlist->priority > ptr_hotlist->priority)
- || ((new_hotlist->priority == ptr_hotlist->priority)
- && (new_hotlist->buffer->number < ptr_hotlist->buffer->number)))
- return ptr_hotlist;
- }
- break;
- case CFG_LOOK_HOTLIST_SORT_GROUP_NUMBER_DESC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if ((new_hotlist->priority > ptr_hotlist->priority)
- || ((new_hotlist->priority == ptr_hotlist->priority)
- && (new_hotlist->buffer->number > ptr_hotlist->buffer->number)))
- return ptr_hotlist;
- }
- break;
- case CFG_LOOK_HOTLIST_SORT_NUMBER_ASC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if (new_hotlist->buffer->number < ptr_hotlist->buffer->number)
- return ptr_hotlist;
- }
- break;
- case CFG_LOOK_HOTLIST_SORT_NUMBER_DESC:
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- if (new_hotlist->buffer->number > ptr_hotlist->buffer->number)
- return ptr_hotlist;
- }
- break;
- }
- return NULL;
-}
-
-/*
- * hotlist_add_hotlist: add new hotlist in list
- */
-
-void
-hotlist_add_hotlist (t_weechat_hotlist **hotlist, t_weechat_hotlist **last_hotlist,
- t_weechat_hotlist *new_hotlist)
-{
- t_weechat_hotlist *pos_hotlist;
-
- if (*hotlist)
- {
- pos_hotlist = hotlist_find_pos (*hotlist, new_hotlist);
-
- if (pos_hotlist)
- {
- /* insert hotlist into the hotlist (before hotlist found) */
- new_hotlist->prev_hotlist = pos_hotlist->prev_hotlist;
- new_hotlist->next_hotlist = pos_hotlist;
- if (pos_hotlist->prev_hotlist)
- pos_hotlist->prev_hotlist->next_hotlist = new_hotlist;
- else
- *hotlist = new_hotlist;
- pos_hotlist->prev_hotlist = new_hotlist;
- }
- else
- {
- /* add hotlist to the end */
- new_hotlist->prev_hotlist = *last_hotlist;
- new_hotlist->next_hotlist = NULL;
- (*last_hotlist)->next_hotlist = new_hotlist;
- *last_hotlist = new_hotlist;
- }
- }
- else
- {
- new_hotlist->prev_hotlist = NULL;
- new_hotlist->next_hotlist = NULL;
- *hotlist = new_hotlist;
- *last_hotlist = new_hotlist;
- }
-}
-
-/*
- * hotlist_add: add a buffer to hotlist, with priority
- * if creation_time is NULL, current time is used
- */
-
-void
-hotlist_add (int priority, struct timeval *creation_time,
- t_irc_server *server, t_gui_buffer *buffer,
- int allow_current_buffer)
-{
- t_weechat_hotlist *new_hotlist, *ptr_hotlist;
-
- if (!buffer)
- return;
-
- /* do not highlight current buffer */
- if ((buffer == gui_current_window->buffer)
- && (!allow_current_buffer) && (!gui_buffer_is_scrolled (buffer)))
- return;
-
- if ((ptr_hotlist = hotlist_search (weechat_hotlist, buffer)))
- {
- /* return if priority is greater or equal than the one to add */
- if (ptr_hotlist->priority >= priority)
- return;
- /* remove buffer if present with lower priority and go on */
- hotlist_free (&weechat_hotlist, &last_weechat_hotlist, ptr_hotlist);
- }
-
- if ((new_hotlist = (t_weechat_hotlist *) malloc (sizeof (t_weechat_hotlist))) == NULL)
- {
- gui_printf (NULL,
- _("%s cannot add a buffer to hotlist\n"), WEECHAT_ERROR);
- return;
- }
-
- new_hotlist->priority = priority;
- if (creation_time)
- memcpy (&(new_hotlist->creation_time),
- creation_time, sizeof (creation_time));
- else
- gettimeofday (&(new_hotlist->creation_time), NULL);
- new_hotlist->server = server;
- new_hotlist->buffer = buffer;
- new_hotlist->next_hotlist = NULL;
- new_hotlist->prev_hotlist = NULL;
-
- hotlist_add_hotlist (&weechat_hotlist, &last_weechat_hotlist, new_hotlist);
-}
-
-/*
- * hotlist_dup: duplicate hotlist element
- */
-
-t_weechat_hotlist *
-hotlist_dup (t_weechat_hotlist *hotlist)
-{
- t_weechat_hotlist *new_hotlist;
-
- if ((new_hotlist = (t_weechat_hotlist *) malloc (sizeof (t_weechat_hotlist))))
- {
- new_hotlist->priority = hotlist->priority;
- memcpy (&(new_hotlist->creation_time), &(hotlist->creation_time),
- sizeof (new_hotlist->creation_time));
- new_hotlist->server = hotlist->server;
- new_hotlist->buffer = hotlist->buffer;
- new_hotlist->prev_hotlist = NULL;
- new_hotlist->next_hotlist = NULL;
- return new_hotlist;
- }
- return NULL;
-}
-
-/*
- * hotlist_resort: resort hotlist with new sort type
- */
-
-void
-hotlist_resort ()
-{
- t_weechat_hotlist *new_hotlist, *last_new_hotlist;
- t_weechat_hotlist *ptr_hotlist, *element;
-
- /* copy and resort hotlist in new linked list */
- new_hotlist = NULL;
- last_new_hotlist = NULL;
- for (ptr_hotlist = weechat_hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- element = hotlist_dup (ptr_hotlist);
- hotlist_add_hotlist (&new_hotlist, &last_new_hotlist, element);
- }
-
- hotlist_free_all (&weechat_hotlist, &last_weechat_hotlist);
-
- weechat_hotlist = new_hotlist;
- last_weechat_hotlist = last_new_hotlist;
-}
-
-/*
- * hotlist_free: free a hotlist and remove it from hotlist queue
- */
-
-void
-hotlist_free (t_weechat_hotlist **hotlist, t_weechat_hotlist **last_hotlist,
- t_weechat_hotlist *ptr_hotlist)
-{
- t_weechat_hotlist *new_hotlist;
-
- /* remove hotlist from queue */
- if (*last_hotlist == ptr_hotlist)
- *last_hotlist = ptr_hotlist->prev_hotlist;
- if (ptr_hotlist->prev_hotlist)
- {
- (ptr_hotlist->prev_hotlist)->next_hotlist = ptr_hotlist->next_hotlist;
- new_hotlist = *hotlist;
- }
- else
- new_hotlist = ptr_hotlist->next_hotlist;
-
- if (ptr_hotlist->next_hotlist)
- (ptr_hotlist->next_hotlist)->prev_hotlist = ptr_hotlist->prev_hotlist;
-
- free (ptr_hotlist);
- *hotlist = new_hotlist;
-}
-
-/*
- * hotlist_free_all: free all hotlists
- */
-
-void
-hotlist_free_all (t_weechat_hotlist **hotlist, t_weechat_hotlist **last_hotlist)
-{
- /* remove all hotlists */
- while (*hotlist)
- hotlist_free (hotlist, last_hotlist, *hotlist);
-}
-
-/*
- * hotlist_remove_buffer: remove a buffer from hotlist
- */
-
-void
-hotlist_remove_buffer (t_gui_buffer *buffer)
-{
- t_weechat_hotlist *pos_hotlist;
-
- pos_hotlist = hotlist_search (weechat_hotlist, buffer);
- if (pos_hotlist)
- hotlist_free (&weechat_hotlist, &last_weechat_hotlist, pos_hotlist);
-}
-
-/*
- * hotlist_print_log: print hotlist in log (usually for crash dump)
- */
-
-void
-hotlist_print_log ()
-{
- t_weechat_hotlist *ptr_hotlist;
-
- for (ptr_hotlist = weechat_hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- weechat_log_printf ("[hotlist (addr:0x%X)]\n", ptr_hotlist);
- weechat_log_printf (" priority . . . . . . . : %d\n", ptr_hotlist->priority);
- weechat_log_printf (" creation_time. . . . . : tv_sec:%d, tv_usec:%d\n",
- ptr_hotlist->creation_time.tv_sec,
- ptr_hotlist->creation_time.tv_usec);
- weechat_log_printf (" server . . . . . . . . : 0x%X\n", ptr_hotlist->server);
- weechat_log_printf (" buffer . . . . . . . . : 0x%X\n", ptr_hotlist->buffer);
- weechat_log_printf (" prev_hotlist . . . . . : 0x%X\n", ptr_hotlist->prev_hotlist);
- weechat_log_printf (" next_hotlist . . . . . : 0x%X\n", ptr_hotlist->next_hotlist);
- }
-}
diff --git a/src/common/hotlist.h b/src/common/hotlist.h
deleted file mode 100644
index 2d66e7c71..000000000
--- a/src/common/hotlist.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_HOTLIST_H
-#define __WEECHAT_HOTLIST_H 1
-
-#include "../protocols/irc/irc.h"
-
-#define HOTLIST_LOW 0
-#define HOTLIST_MSG 1
-#define HOTLIST_PRIVATE 2
-#define HOTLIST_HIGHLIGHT 3
-
-typedef struct t_weechat_hotlist t_weechat_hotlist;
-
-struct t_weechat_hotlist
-{
- int priority; /* 0=crappy msg (join/part), 1=msg, */
- /* 2=pv, 3=nick highlight */
- struct timeval creation_time; /* time when entry was added */
- t_irc_server *server; /* associated server */
- t_gui_buffer *buffer; /* associated buffer */
- t_weechat_hotlist *prev_hotlist; /* link to previous hotlist */
- t_weechat_hotlist *next_hotlist; /* link to next hotlist */
-};
-
-extern t_weechat_hotlist *weechat_hotlist;
-extern t_weechat_hotlist *last_weechat_hotlist;
-extern t_gui_buffer *hotlist_initial_buffer;
-
-extern void hotlist_add (int, struct timeval *, t_irc_server *, t_gui_buffer *, int);
-extern void hotlist_resort ();
-extern void hotlist_free (t_weechat_hotlist **, t_weechat_hotlist **, t_weechat_hotlist *);
-extern void hotlist_free_all (t_weechat_hotlist **, t_weechat_hotlist **);
-extern void hotlist_remove_buffer (t_gui_buffer *);
-extern void hotlist_print_log ();
-
-#endif /* hotlist.h */
diff --git a/src/common/log.c b/src/common/log.c
deleted file mode 100644
index 2132e67a8..000000000
--- a/src/common/log.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* log.c: WeeChat log file */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-
-#ifdef HAVE_FLOCK
-#include <sys/file.h>
-#endif
-
-#include <sys/types.h>
-#include <time.h>
-
-#include "weechat.h"
-#include "log.h"
-#include "util.h"
-
-
-char *weechat_log_filename = NULL; /* log name (~/.weechat/weechat.log) */
-FILE *weechat_log_file = NULL; /* WeeChat log file */
-
-
-/*
- * weechat_log_open: initialize log file
- */
-
-int
-weechat_log_open (char *filename, char *mode)
-{
- int filename_length;
-
- /* exit if log already opened */
- if (weechat_log_file)
- return 0;
-
- if (filename)
- weechat_log_filename = strdup (filename);
- else
- {
- filename_length = strlen (weechat_home) + 64;
- weechat_log_filename =
- (char *) malloc (filename_length * sizeof (char));
- snprintf (weechat_log_filename, filename_length,
- "%s/%s", weechat_home, WEECHAT_LOG_NAME);
- }
-
- weechat_log_file = fopen (weechat_log_filename, mode);
- if (!weechat_log_file)
- {
- free (weechat_log_filename);
- weechat_log_filename = NULL;
- return 0;
- }
-
-#ifdef HAVE_FLOCK
- if ((flock (fileno (weechat_log_file), LOCK_EX | LOCK_NB) != 0))
- {
- if (errno == EWOULDBLOCK)
- {
- fclose (weechat_log_file);
- weechat_log_file = NULL;
- free (weechat_log_filename);
- weechat_log_filename = NULL;
- return 0;
- }
- }
-#endif
-
- return 1;
-}
-
-/*
- * weechat_log_init: initialize log file
- */
-
-void
-weechat_log_init ()
-{
- if (!weechat_log_open (NULL, "w"))
- {
- weechat_iconv_fprintf (stderr,
- _("%s unable to create/append to log file (weechat.log)\n"
- "If another WeeChat process is using this file, try to run WeeChat\n"
- "with another home using \"--dir\" command line option.\n"),
- WEECHAT_ERROR);
- exit (1);
- }
-}
-
-/*
- * weechat_log_printf: write a message in WeeChat log (<weechat_home>/weechat.log)
- */
-
-void
-weechat_log_printf (char *message, ...)
-{
- static char buffer[4096];
- char *ptr_buffer;
- va_list argptr;
- static time_t seconds;
- struct tm *date_tmp;
-
- if (!weechat_log_file)
- return;
-
- va_start (argptr, message);
- vsnprintf (buffer, sizeof (buffer) - 1, message, argptr);
- va_end (argptr);
-
- /* keep only valid chars */
- ptr_buffer = buffer;
- while (ptr_buffer[0])
- {
- if ((ptr_buffer[0] != '\n')
- && (ptr_buffer[0] != '\r')
- && ((unsigned char)(ptr_buffer[0]) < 32))
- ptr_buffer[0] = '.';
- ptr_buffer++;
- }
-
- seconds = time (NULL);
- date_tmp = localtime (&seconds);
- if (date_tmp)
- weechat_iconv_fprintf (weechat_log_file, "[%04d-%02d-%02d %02d:%02d:%02d] %s",
- date_tmp->tm_year + 1900, date_tmp->tm_mon + 1, date_tmp->tm_mday,
- date_tmp->tm_hour, date_tmp->tm_min, date_tmp->tm_sec,
- buffer);
- else
- weechat_iconv_fprintf (weechat_log_file, "%s", buffer);
-
- fflush (weechat_log_file);
-}
-
-/*
- * weechat_log_close: close log file
- */
-
-void
-weechat_log_close ()
-{
- /* close log file */
- if (weechat_log_file)
- {
-#ifdef HAVE_FLOCK
- flock (fileno (weechat_log_file), LOCK_UN);
-#endif
- fclose (weechat_log_file);
- weechat_log_file = NULL;
- }
-
- /* free filename */
- if (weechat_log_filename)
- {
- free (weechat_log_filename);
- weechat_log_filename = NULL;
- }
-}
-
-/*
- * weechat_log_crash_rename: rename log file when crashing
- */
-
-int
-weechat_log_crash_rename ()
-{
- char *old_name, *new_name;
- int length;
- time_t time_now;
- struct tm *local_time;
-
- if (!weechat_log_filename)
- return 0;
-
- old_name = strdup (weechat_log_filename);
- if (!old_name)
- return 0;
-
- weechat_log_close ();
-
- length = strlen (weechat_home) + 128;
- new_name = (char *) malloc (length);
- if (new_name)
- {
- time_now = time (NULL);
- local_time = localtime (&time_now);
- snprintf (new_name, length,
- "%s/weechat_crash_%04d%02d%02d_%d.log",
- weechat_home,
- local_time->tm_year + 1900,
- local_time->tm_mon + 1,
- local_time->tm_mday,
- getpid());
- if (rename (old_name, new_name) == 0)
- {
- weechat_iconv_fprintf (stderr, "*** Full crash dump was saved to %s file.\n",
- new_name);
- weechat_log_open (new_name, "a");
- free (old_name);
- free (new_name);
- return 1;
- }
- free (new_name);
- }
-
- free (old_name);
- weechat_log_open (NULL, "a");
- return 0;
-}
diff --git a/src/common/log.h b/src/common/log.h
deleted file mode 100644
index 4f2a9e5ce..000000000
--- a/src/common/log.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_LOG_H
-#define __WEECHAT_LOG_H 1
-
-extern char *weechat_log_filename;
-extern FILE *weechat_log_file;
-
-extern void weechat_log_init ();
-extern void weechat_log_close ();
-extern void weechat_log_printf (char *, ...);
-extern int weechat_log_crash_rename ();
-
-#endif /* log.h */
diff --git a/src/common/session.c b/src/common/session.c
deleted file mode 100644
index f74b015e5..000000000
--- a/src/common/session.c
+++ /dev/null
@@ -1,1867 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* session.c: save/restore session data */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
-#include "weechat.h"
-#include "session.h"
-#include "hotlist.h"
-#include "log.h"
-#include "utf8.h"
-#include "util.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-
-/* current server/channel (used when loading session) */
-t_irc_server *session_current_server = NULL;
-t_irc_channel *session_current_channel = NULL;
-t_gui_buffer *session_current_buffer = NULL;
-
-long session_last_read_pos = 0;
-int session_last_read_length = 0;
-
-
-/*
- * session_write_id: write object ID to file
- */
-
-int
-session_write_id (FILE *file, int id)
-{
- return (fwrite ((void *)(&id), sizeof (int), 1, file) > 0);
-}
-
-/*
- * session_write_int: write an integer to file
- */
-
-int
-session_write_int (FILE *file, int id, int value)
-{
- char type;
-
- if (id >= 0)
- {
- if (!session_write_id (file, id))
- return 0;
- }
- type = SESSION_TYPE_INT;
- if (fwrite ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- return (fwrite ((void *)(&value), sizeof (int), 1, file) > 0);
-}
-
-/*
- * session_write_str: write a string to file
- */
-
-int
-session_write_str (FILE *file, int id, char *string)
-{
- char type;
- int length;
-
- if (id >= 0)
- {
- if (!session_write_id (file, id))
- return 0;
- }
- type = SESSION_TYPE_STR;
- if (fwrite ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (string && string[0])
- {
- length = strlen (string);
- if (fwrite ((void *)(&length), sizeof (int), 1, file) == 0)
- return 0;
- return (fwrite ((void *)string, length, 1, file) > 0);
- }
- else
- {
- length = 0;
- return (fwrite ((void *)(&length), sizeof (int), 1, file) > 0);
- }
-}
-
-/*
- * session_write_buf: write a buffer to file
- */
-
-int
-session_write_buf (FILE *file, int id, void *buffer, int size)
-{
- char type;
-
- if (id >= 0)
- {
- if (!session_write_id (file, id))
- return 0;
- }
- type = SESSION_TYPE_BUF;
- if (fwrite ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (fwrite ((void *)(&size), sizeof (int), 1, file) == 0)
- return 0;
- return (fwrite (buffer, size, 1, file) > 0);
-}
-
-/*
- * session_save_nick: save a nick into session file
- */
-
-int
-session_save_nick (FILE *file, t_irc_nick *nick)
-{
- int rc;
-
- rc = 1;
- rc = rc && (session_write_id (file, SESSION_OBJ_NICK));
- rc = rc && (session_write_str (file, SESSION_NICK_NICK, nick->nick));
- rc = rc && (session_write_int (file, SESSION_NICK_FLAGS, nick->flags));
- rc = rc && (session_write_int (file, SESSION_NICK_COLOR, nick->color));
- rc = rc && (session_write_str (file, SESSION_NICK_HOST, nick->host));
- rc = rc && (session_write_id (file, SESSION_NICK_END));
- return rc;
-}
-
-/*
- * session_save_channel: save a channel into session file
- */
-
-int
-session_save_channel (FILE *file, t_irc_channel *channel)
-{
- int rc;
- t_irc_nick *ptr_nick;
-
- rc = 1;
- rc = rc && (session_write_id (file, SESSION_OBJ_CHANNEL));
- rc = rc && (session_write_int (file, SESSION_CHAN_TYPE, channel->type));
- rc = rc && (session_write_str (file, SESSION_CHAN_NAME, channel->name));
- rc = rc && (session_write_str (file, SESSION_CHAN_TOPIC, channel->topic));
- rc = rc && (session_write_str (file, SESSION_CHAN_MODES, channel->modes));
- rc = rc && (session_write_int (file, SESSION_CHAN_LIMIT, channel->limit));
- rc = rc && (session_write_str (file, SESSION_CHAN_KEY, channel->key));
- rc = rc && (session_write_int (file, SESSION_CHAN_NICKS_COUNT, channel->nicks_count));
- rc = rc && (session_write_int (file, SESSION_CHAN_CHECKING_AWAY, channel->checking_away));
- rc = rc && (session_write_str (file, SESSION_CHAN_AWAY_MESSAGE, channel->away_message));
- rc = rc && (session_write_int (file, SESSION_CHAN_CYCLE, channel->cycle));
- rc = rc && (session_write_int (file, SESSION_CHAN_CLOSE, channel->close));
- rc = rc && (session_write_int (file, SESSION_CHAN_DISPLAY_CREATION_DATE, channel->display_creation_date));
- rc = rc && (session_write_id (file, SESSION_CHAN_END));
-
- if (!rc)
- return 0;
-
- for (ptr_nick = channel->nicks; ptr_nick;
- ptr_nick = ptr_nick->next_nick)
- {
- if (!session_save_nick (file, ptr_nick))
- return 0;
- }
-
- return 1;
-}
-
-/*
- * session_save_servers: save all servers into session file
- */
-
-int
-session_save_servers (FILE *file)
-{
- int rc;
-#ifdef HAVE_GNUTLS
- void *session_data;
- size_t session_size;
-#endif
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
-
- rc = 1;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- rc = rc && (session_write_id (file, SESSION_OBJ_SERVER));
- rc = rc && (session_write_str (file, SESSION_SERV_NAME, ptr_server->name));
- rc = rc && (session_write_int (file, SESSION_SERV_AUTOCONNECT, ptr_server->autoconnect));
- rc = rc && (session_write_int (file, SESSION_SERV_AUTORECONNECT, ptr_server->autoreconnect));
- rc = rc && (session_write_int (file, SESSION_SERV_AUTORECONNECT_DELAY, ptr_server->autoreconnect_delay));
- rc = rc && (session_write_int (file, SESSION_SERV_TEMP_SERVER, ptr_server->temp_server));
- rc = rc && (session_write_str (file, SESSION_SERV_ADDRESS, ptr_server->address));
- rc = rc && (session_write_int (file, SESSION_SERV_PORT, ptr_server->port));
- rc = rc && (session_write_int (file, SESSION_SERV_IPV6, ptr_server->ipv6));
- rc = rc && (session_write_int (file, SESSION_SERV_SSL, ptr_server->ssl));
- rc = rc && (session_write_str (file, SESSION_SERV_PASSWORD, ptr_server->password));
- rc = rc && (session_write_str (file, SESSION_SERV_NICK1, ptr_server->nick1));
- rc = rc && (session_write_str (file, SESSION_SERV_NICK2, ptr_server->nick2));
- rc = rc && (session_write_str (file, SESSION_SERV_NICK3, ptr_server->nick3));
- rc = rc && (session_write_str (file, SESSION_SERV_USERNAME, ptr_server->username));
- rc = rc && (session_write_str (file, SESSION_SERV_REALNAME, ptr_server->realname));
- rc = rc && (session_write_str (file, SESSION_SERV_HOSTNAME, ptr_server->hostname));
- rc = rc && (session_write_str (file, SESSION_SERV_COMMAND, ptr_server->command));
- rc = rc && (session_write_int (file, SESSION_SERV_COMMAND_DELAY, ptr_server->command_delay));
- rc = rc && (session_write_str (file, SESSION_SERV_AUTOJOIN, ptr_server->autojoin));
- rc = rc && (session_write_int (file, SESSION_SERV_AUTOREJOIN, ptr_server->autorejoin));
- rc = rc && (session_write_str (file, SESSION_SERV_NOTIFY_LEVELS, ptr_server->notify_levels));
- rc = rc && (session_write_int (file, SESSION_SERV_CHILD_PID, ptr_server->child_pid));
- rc = rc && (session_write_int (file, SESSION_SERV_CHILD_READ, ptr_server->child_read));
- rc = rc && (session_write_int (file, SESSION_SERV_CHILD_WRITE, ptr_server->child_write));
- rc = rc && (session_write_int (file, SESSION_SERV_SOCK, ptr_server->sock));
- rc = rc && (session_write_int (file, SESSION_SERV_IS_CONNECTED, ptr_server->is_connected));
- rc = rc && (session_write_int (file, SESSION_SERV_SSL_CONNECTED, ptr_server->ssl_connected));
-#ifdef HAVE_GNUTLS
- if (ptr_server->is_connected && ptr_server->ssl_connected)
- {
- gnutls_session_get_data (ptr_server->gnutls_sess, NULL, &session_size);
- if (session_size > 0)
- {
- session_data = malloc (session_size);
- gnutls_session_get_data (ptr_server->gnutls_sess, session_data, &session_size);
- rc = rc && (session_write_buf (file, SESSION_SERV_GNUTLS_SESS, &(session_data), session_size));
- free (session_data);
- }
- }
-#endif
- rc = rc && (session_write_str (file, SESSION_SERV_UNTERMINATED_MESSAGE, ptr_server->unterminated_message));
- rc = rc && (session_write_str (file, SESSION_SERV_NICK, ptr_server->nick));
- rc = rc && (session_write_str (file, SESSION_SERV_NICK_MODES, ptr_server->nick_modes));
- rc = rc && (session_write_str (file, SESSION_SERV_PREFIX, ptr_server->prefix));
- rc = rc && (session_write_buf (file, SESSION_SERV_RECONNECT_START, &(ptr_server->reconnect_start), sizeof (time_t)));
- rc = rc && (session_write_buf (file, SESSION_SERV_COMMAND_TIME, &(ptr_server->command_time), sizeof (time_t)));
- rc = rc && (session_write_int (file, SESSION_SERV_RECONNECT_JOIN, ptr_server->reconnect_join));
- rc = rc && (session_write_int (file, SESSION_SERV_IS_AWAY, ptr_server->is_away));
- rc = rc && (session_write_str (file, SESSION_SERV_AWAY_MESSAGE, ptr_server->away_message));
- rc = rc && (session_write_buf (file, SESSION_SERV_AWAY_TIME, &(ptr_server->away_time), sizeof (time_t)));
- rc = rc && (session_write_int (file, SESSION_SERV_LAG, ptr_server->lag));
- rc = rc && (session_write_buf (file, SESSION_SERV_LAG_CHECK_TIME, &(ptr_server->lag_check_time), sizeof (struct timeval)));
- rc = rc && (session_write_buf (file, SESSION_SERV_LAG_NEXT_CHECK, &(ptr_server->lag_next_check), sizeof (time_t)));
- rc = rc && (session_write_id (file, SESSION_SERV_END));
-
- if (!rc)
- return 0;
-
- for (ptr_channel = ptr_server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- if (!session_save_channel (file, ptr_channel))
- return 0;
- }
- }
- return 1;
-}
-
-/*
- * session_save_dcc: save all DCC into session file
- */
-
-int
-session_save_dcc (FILE *file)
-{
- int rc;
- t_irc_dcc *ptr_dcc;
-
- rc = 1;
-
- for (ptr_dcc = irc_last_dcc; ptr_dcc;
- ptr_dcc = ptr_dcc->prev_dcc)
- {
- rc = rc && (session_write_id (file, SESSION_OBJ_DCC));
- rc = rc && (session_write_str (file, SESSION_DCC_SERVER, (ptr_dcc->server) ? ptr_dcc->server->name : NULL));
- rc = rc && (session_write_str (file, SESSION_DCC_CHANNEL, (ptr_dcc->channel) ? ptr_dcc->channel->name : NULL));
- rc = rc && (session_write_int (file, SESSION_DCC_TYPE, ptr_dcc->type));
- rc = rc && (session_write_int (file, SESSION_DCC_STATUS, ptr_dcc->status));
- rc = rc && (session_write_buf (file, SESSION_DCC_START_TIME, &(ptr_dcc->start_time), sizeof (time_t)));
- rc = rc && (session_write_buf (file, SESSION_DCC_START_TRANSFER, &(ptr_dcc->start_transfer), sizeof (time_t)));
- rc = rc && (session_write_buf (file, SESSION_DCC_ADDR, &(ptr_dcc->addr), sizeof (unsigned long)));
- rc = rc && (session_write_int (file, SESSION_DCC_PORT, ptr_dcc->port));
- rc = rc && (session_write_str (file, SESSION_DCC_NICK, ptr_dcc->nick));
- rc = rc && (session_write_int (file, SESSION_DCC_SOCK, ptr_dcc->sock));
- rc = rc && (session_write_str (file, SESSION_DCC_UNTERMINATED_MESSAGE, ptr_dcc->unterminated_message));
- rc = rc && (session_write_int (file, SESSION_DCC_FILE, ptr_dcc->file));
- rc = rc && (session_write_str (file, SESSION_DCC_FILENAME, ptr_dcc->filename));
- rc = rc && (session_write_str (file, SESSION_DCC_LOCAL_FILENAME, ptr_dcc->local_filename));
- rc = rc && (session_write_int (file, SESSION_DCC_FILENAME_SUFFIX, ptr_dcc->filename_suffix));
- rc = rc && (session_write_buf (file, SESSION_DCC_SIZE, &(ptr_dcc->size), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_POS, &(ptr_dcc->pos), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_ACK, &(ptr_dcc->ack), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_START_RESUME, &(ptr_dcc->start_resume), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_LAST_CHECK_TIME, &(ptr_dcc->last_check_time), sizeof (time_t)));
- rc = rc && (session_write_buf (file, SESSION_DCC_LAST_CHECK_POS, &(ptr_dcc->last_check_pos), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_LAST_ACTIVITY, &(ptr_dcc->last_activity), sizeof (time_t)));
- rc = rc && (session_write_buf (file, SESSION_DCC_BYTES_PER_SEC, &(ptr_dcc->bytes_per_sec), sizeof (unsigned long)));
- rc = rc && (session_write_buf (file, SESSION_DCC_ETA, &(ptr_dcc->eta), sizeof (unsigned long)));
- rc = rc && (session_write_int (file, SESSION_DCC_CHILD_PID, ptr_dcc->child_pid));
- rc = rc && (session_write_int (file, SESSION_DCC_CHILD_READ, ptr_dcc->child_read));
- rc = rc && (session_write_int (file, SESSION_DCC_CHILD_WRITE, ptr_dcc->child_write));
- rc = rc && (session_write_id (file, SESSION_DCC_END));
-
- if (!rc)
- return 0;
- }
- return 1;
-}
-
-/*
- * session_save_history: save history into session file
- * (from last to first, to restore it in good order)
- */
-
-int
-session_save_history (FILE *file, t_history *last_history)
-{
- int rc;
- t_history *ptr_history;
-
- rc = 1;
- rc = rc && (session_write_id (file, SESSION_OBJ_HISTORY));
- ptr_history = last_history;
- while (ptr_history)
- {
- rc = rc && (session_write_str (file, SESSION_HIST_TEXT, ptr_history->text));
- ptr_history = ptr_history->prev_history;
- }
- rc = rc && (session_write_id (file, SESSION_HIST_END));
- return rc;
-}
-
-/*
- * session_save_line: save a buffer line into session file
- */
-
-int
-session_save_line (FILE *file, t_gui_line *line)
-{
- int rc;
-
- rc = 1;
- rc = rc && (session_write_id (file, SESSION_OBJ_LINE));
- rc = rc && (session_write_int (file, SESSION_LINE_LENGTH, line->length));
- rc = rc && (session_write_int (file, SESSION_LINE_LENGTH_ALIGN, line->length_align));
- rc = rc && (session_write_int (file, SESSION_LINE_LOG_WRITE, line->log_write));
- rc = rc && (session_write_int (file, SESSION_LINE_WITH_MESSAGE, line->line_with_message));
- rc = rc && (session_write_int (file, SESSION_LINE_WITH_HIGHLIGHT, line->line_with_highlight));
- rc = rc && (session_write_str (file, SESSION_LINE_DATA, line->data));
- rc = rc && (session_write_int (file, SESSION_LINE_OFS_AFTER_DATE, line->ofs_after_date));
- rc = rc && (session_write_int (file, SESSION_LINE_OFS_START_MESSAGE, line->ofs_start_message));
- rc = rc && (session_write_str (file, SESSION_LINE_NICK, line->nick));
- rc = rc && (session_write_buf (file, SESSION_LINE_DATE, &(line->date), sizeof (time_t)));
- rc = rc && (session_write_id (file, SESSION_LINE_END));
- return rc;
-}
-
-/*
- * session_save_buffers: save all buffers into session file
- */
-
-int
-session_save_buffers (FILE *file)
-{
- int rc;
- t_gui_buffer *ptr_buffer;
- t_gui_line *ptr_line;
-
- rc = 1;
-
- for (ptr_buffer = gui_buffers; ptr_buffer;
- ptr_buffer = ptr_buffer->next_buffer)
- {
- rc = rc && (session_write_id (file, SESSION_OBJ_BUFFER));
- rc = rc && (session_write_str (file, SESSION_BUFF_SERVER, GUI_SERVER(ptr_buffer) ? GUI_SERVER(ptr_buffer)->name : NULL));
- rc = rc && (session_write_str (file, SESSION_BUFF_CHANNEL, GUI_CHANNEL(ptr_buffer) ? GUI_CHANNEL(ptr_buffer)->name : NULL));
- rc = rc && (session_write_int (file, SESSION_BUFF_TYPE, ptr_buffer->type));
- rc = rc && (session_write_int (file, SESSION_BUFF_ALL_SERVERS, ptr_buffer->all_servers));
- rc = rc && (session_write_id (file, SESSION_BUFF_END));
-
- if (!rc)
- return 0;
-
- for (ptr_line = ptr_buffer->lines; ptr_line;
- ptr_line = ptr_line->next_line)
- {
- if (!session_save_line (file, ptr_line))
- return 0;
- }
-
- if (!session_save_history (file, ptr_buffer->last_history))
- return 0;
- }
- return 1;
-}
-
-/*
- * session_save_uptime: save uptime into session file
- */
-
-int
-session_save_uptime (FILE *file)
-{
- int rc;
-
- rc = 1;
-
- rc = rc && (session_write_id (file, SESSION_OBJ_UPTIME));
- rc = rc && (session_write_buf (file, SESSION_UPT_START_TIME, &weechat_start_time, sizeof (time_t)));
- rc = rc && (session_write_id (file, SESSION_UPT_END));
- return rc;
-}
-
-/*
- * session_save_hotlist: save hotlist into session file
- */
-
-int
-session_save_hotlist (FILE *file)
-{
- int rc;
- t_weechat_hotlist *ptr_hotlist;
-
- rc = 1;
-
- for (ptr_hotlist = weechat_hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- rc = rc && (session_write_id (file, SESSION_OBJ_HOTLIST));
- rc = rc && (session_write_int (file, SESSION_HOTL_PRIORITY, ptr_hotlist->priority));
- rc = rc && (session_write_str (file, SESSION_HOTL_SERVER, (ptr_hotlist->server) ? ptr_hotlist->server->name : NULL));
- rc = rc && (session_write_int (file, SESSION_HOTL_BUFFER_NUMBER, ptr_hotlist->buffer->number));
- rc = rc && (session_write_buf (file, SESSION_HOTL_CREATION_TIME, &(ptr_hotlist->creation_time), sizeof (struct timeval)));
- rc = rc && (session_write_id (file, SESSION_HOTL_END));
-
- if (!rc)
- return 0;
- }
- return rc;
-}
-
-/*
- * session_save: save current session
- */
-
-int
-session_save (char *filename)
-{
- FILE *file;
- int rc;
-
- if ((file = fopen (filename, "wb")) == NULL)
- return 0;
-
- rc = 1;
- rc = rc && (session_write_str (file, -1, SESSION_SIGNATURE));
- rc = rc && (session_save_servers (file));
- rc = rc && (session_save_dcc (file));
- rc = rc && (session_save_history (file, history_global_last));
- rc = rc && (session_save_buffers (file));
- rc = rc && (session_save_uptime (file));
- rc = rc && (session_save_hotlist (file));
-
- fclose (file);
-
- return rc;
-}
-
-/* ========================================================================== */
-
-/*
- * session_crash: stop WeeChat if problem during session loading
- */
-
-void
-session_crash (FILE *file, char *message, ...)
-{
- char buffer[4096];
- va_list argptr;
-
- va_start (argptr, message);
- vsnprintf (buffer, sizeof (buffer) - 1, message, argptr);
- va_end (argptr);
-
- fclose (file);
- gui_main_end ();
- weechat_iconv_fprintf (stderr, "%s %s\n",
- WEECHAT_ERROR, buffer);
- weechat_iconv_fprintf (stderr,
- _("Last operation with session file was at position %ld, "
- "read of %d bytes\n"),
- session_last_read_pos,
- session_last_read_length);
- weechat_iconv_fprintf (stderr,
- _("Please send %s/%s, %s/%s and "
- "above messages to WeeChat developers for support.\n"
- "Be careful, private info may be in these files.\n"),
- weechat_home,
- WEECHAT_LOG_NAME,
- weechat_home,
- WEECHAT_SESSION_NAME);
- exit (EXIT_FAILURE);
-}
-
-/*
- * session_read_int: read integer from file
- */
-
-int
-session_read_int (FILE *file, int *value)
-{
- char type;
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (char);
-
- if (fread ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (type != SESSION_TYPE_INT)
- {
- session_crash (file, _("wrong type in file (expected: %d, read: %d)"),
- SESSION_TYPE_INT, type);
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (int);
-
- if (value)
- return (fread ((void *)value, sizeof (int), 1, file) > 0);
- else
- return (fseek (file, sizeof (int), SEEK_CUR) >= 0);
-}
-
-/*
- * session_read_str: read string from file
- */
-
-int
-session_read_str (FILE *file, char **string)
-{
- char type;
- int length;
-
- if (string && *string)
- free (*string);
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (char);
-
- if (fread ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (type != SESSION_TYPE_STR)
- {
- session_crash (file, _("wrong type in file (expected: %d, read: %d)"),
- SESSION_TYPE_STR, type);
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (int);
-
- if (fread ((void *)(&length), sizeof (int), 1, file) == 0)
- return 0;
-
- if (length == 0)
- {
- if (string)
- (*string) = NULL;
- return 1;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = length;
-
- if (string)
- {
- (*string) = (char *) malloc (length + 1);
- if (!(*string))
- return 0;
-
- if (fread ((void *)(*string), length, 1, file) == 0)
- {
- free (*string);
- return 0;
- }
- (*string)[length] = '\0';
- }
- else
- return (fseek (file, length, SEEK_CUR) >= 0);
-
- return 1;
-}
-
-/*
- * session_read_str_utf8: read string from file, then normalize UTF-8
- */
-
-int
-session_read_str_utf8 (FILE *file, char **string)
-{
- int rc;
-
- rc = session_read_str (file, string);
- if (rc && *string)
- utf8_normalize (*string, '?');
-
- return rc;
-}
-
-/*
- * session_read_buf: read buffer from file
- */
-
-int
-session_read_buf (FILE *file, void *buffer, int length_expected)
-{
- char type;
- int length;
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (char);
-
- if (fread ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (type != SESSION_TYPE_BUF)
- {
- session_crash (file, _("wrong type in file (expected: %d, read: %d)"),
- SESSION_TYPE_BUF, type);
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (int);
-
- if (fread ((void *)(&length), sizeof (int), 1, file) == 0)
- return 0;
- if ((length <= 0) || ((length_expected > 0) && (length != length_expected)))
- {
- session_crash (file, _("invalid length for a buffer"));
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = length;
-
- if (buffer)
- return (fread (buffer, length, 1, file) > 0);
- else
- return (fseek (file, length, SEEK_CUR) >= 0);
-}
-
-/*
- * session_read_buf_alloc: read buffer from file and allocate it in memory
- */
-
-int
-session_read_buf_alloc (FILE *file, void **buffer, int *buffer_length)
-{
- char type;
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (char);
-
- if (fread ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (type != SESSION_TYPE_BUF)
- {
- session_crash (file, _("wrong type in file (expected: %d, read: %d)"),
- SESSION_TYPE_BUF, type);
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (int);
-
- if (fread ((void *)(buffer_length), sizeof (int), 1, file) == 0)
- return 0;
- if (*buffer_length <= 0)
- {
- session_crash (file, _("invalid length for a buffer"));
- return 0;
- }
-
- *buffer = malloc (*buffer_length);
-
- session_last_read_pos = ftell (file);
- session_last_read_length = *buffer_length;
-
- return (fread (*buffer, *buffer_length, 1, file) > 0);
-}
-
-/*
- * session_read_object: read an object in file
- */
-
-int
-session_read_object (FILE *file, int object_id, int type, void *target, int max_buf_length)
-{
- int object_id_read;
- char type_read;
-
- if (fread ((void *)(&object_id_read), sizeof (int), 1, file) == 0)
- {
- session_crash (file, _("object read error"));
- return 0;
- }
- if (object_id_read != object_id)
- {
- session_crash (file, _("wrong object (expected: %d, read: %d)"),
- object_id, object_id_read);
- return 0;
- }
-
- session_last_read_pos = ftell (file);
- session_last_read_length = sizeof (char);
-
- if (fread ((void *)(&type_read), sizeof (char), 1, file) == 0)
- {
- session_crash (file, _("type read error"));
- return 0;
- }
- if (type_read != type)
- {
- session_crash (file, _("wrong type (expected: %d, read: %d)"),
- type, type_read);
- return 0;
- }
- if (fseek (file, sizeof (char) * (-1), SEEK_CUR) < 0)
- return 0;
- switch (type)
- {
- case SESSION_TYPE_INT:
- return session_read_int (file, (int *)target);
- case SESSION_TYPE_STR:
- return session_read_str (file, (char **)target);
- case SESSION_TYPE_BUF:
- return session_read_buf (file, target, max_buf_length);
- }
- return 0;
-}
-
-/*
- * session_read_ignore_value: ignore a value from file
- */
-
-int
-session_read_ignore_value (FILE *file)
-{
- char type;
-
- if (fread ((void *)(&type), sizeof (char), 1, file) == 0)
- return 0;
- if (fseek (file, sizeof (char) * (-1), SEEK_CUR) < 0)
- return 0;
- switch (type)
- {
- case SESSION_TYPE_INT:
- return session_read_int (file, NULL);
- case SESSION_TYPE_STR:
- return session_read_str (file, NULL);
- case SESSION_TYPE_BUF:
- return session_read_buf (file, NULL, 0);
- }
- return 0;
-}
-
-/*
- * session_read_ignore_object: ignore an object from file
- */
-
-int
-session_read_ignore_object (FILE *file)
-{
- int object_id;
-
- while (1)
- {
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- if (feof (file))
- return 0;
- if (object_id == SESSION_OBJ_END)
- return 1;
- if (!session_read_ignore_value (file))
- return 0;
- }
-}
-
-/*
- * session_load_server: load server from file
- */
-
-int
-session_load_server (FILE *file)
-{
- int object_id, rc;
- char *server_name;
-#ifdef HAVE_GNUTLS
- void *session_data;
- size_t session_size;
- int session_size_int;
-#endif
-
- /* read server name */
- server_name = NULL;
- if (!session_read_object (file, SESSION_SERV_NAME, SESSION_TYPE_STR, &server_name, 0))
- {
- session_crash (file, _("server name not found"));
- return 0;
- }
-
- /* use or allocate server */
- weechat_log_printf (_("session: loading server \"%s\"\n"),
- server_name);
- session_current_server = irc_server_search (server_name);
- if (session_current_server)
- weechat_log_printf (_("server found, updating values\n"));
- else
- {
- weechat_log_printf (_("server not found, creating new one\n"));
- session_current_server = irc_server_alloc ();
- if (!session_current_server)
- {
- free (server_name);
- session_crash (file, _("can't create new server"));
- return 0;
- }
- irc_server_init (session_current_server);
- session_current_server->name = strdup (server_name);
- }
- free (server_name);
-
- /* read server values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading server)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_SERV_END:
- return 1;
- case SESSION_SERV_AUTOCONNECT:
- rc = rc && (session_read_int (file, &(session_current_server->autoconnect)));
- break;
- case SESSION_SERV_AUTORECONNECT:
- rc = rc && (session_read_int (file, &(session_current_server->autoreconnect)));
- break;
- case SESSION_SERV_AUTORECONNECT_DELAY:
- rc = rc && (session_read_int (file, &(session_current_server->autoreconnect_delay)));
- break;
- case SESSION_SERV_TEMP_SERVER:
- rc = rc && (session_read_int (file, &(session_current_server->temp_server)));
- break;
- case SESSION_SERV_ADDRESS:
- rc = rc && (session_read_str (file, &(session_current_server->address)));
- break;
- case SESSION_SERV_PORT:
- rc = rc && (session_read_int (file, &(session_current_server->port)));
- break;
- case SESSION_SERV_IPV6:
- rc = rc && (session_read_int (file, &(session_current_server->ipv6)));
- break;
- case SESSION_SERV_SSL:
- rc = rc && (session_read_int (file, &(session_current_server->ssl)));
- break;
- case SESSION_SERV_PASSWORD:
- rc = rc && (session_read_str (file, &(session_current_server->password)));
- break;
- case SESSION_SERV_NICK1:
- rc = rc && (session_read_str (file, &(session_current_server->nick1)));
- break;
- case SESSION_SERV_NICK2:
- rc = rc && (session_read_str (file, &(session_current_server->nick2)));
- break;
- case SESSION_SERV_NICK3:
- rc = rc && (session_read_str (file, &(session_current_server->nick3)));
- break;
- case SESSION_SERV_USERNAME:
- rc = rc && (session_read_str (file, &(session_current_server->username)));
- break;
- case SESSION_SERV_REALNAME:
- rc = rc && (session_read_str (file, &(session_current_server->realname)));
- break;
- case SESSION_SERV_HOSTNAME:
- rc = rc && (session_read_str (file, &(session_current_server->hostname)));
- break;
- case SESSION_SERV_COMMAND:
- rc = rc && (session_read_str (file, &(session_current_server->command)));
- break;
- case SESSION_SERV_COMMAND_DELAY:
- rc = rc && (session_read_int (file, &(session_current_server->command_delay)));
- break;
- case SESSION_SERV_AUTOJOIN:
- rc = rc && (session_read_str (file, &(session_current_server->autojoin)));
- break;
- case SESSION_SERV_AUTOREJOIN:
- rc = rc && (session_read_int (file, &(session_current_server->autorejoin)));
- break;
- case SESSION_SERV_NOTIFY_LEVELS:
- rc = rc && (session_read_str (file, &(session_current_server->notify_levels)));
- break;
- case SESSION_SERV_CHILD_PID:
- rc = rc && (session_read_int (file, &(session_current_server->child_pid)));
- break;
- case SESSION_SERV_CHILD_READ:
- rc = rc && (session_read_int (file, &(session_current_server->child_read)));
- break;
- case SESSION_SERV_CHILD_WRITE:
- rc = rc && (session_read_int (file, &(session_current_server->child_write)));
- break;
- case SESSION_SERV_SOCK:
- rc = rc && (session_read_int (file, &(session_current_server->sock)));
- break;
- case SESSION_SERV_IS_CONNECTED:
- rc = rc && (session_read_int (file, &(session_current_server->is_connected)));
- break;
- case SESSION_SERV_SSL_CONNECTED:
- rc = rc && (session_read_int (file, &(session_current_server->ssl_connected)));
- break;
-#ifdef HAVE_GNUTLS
- case SESSION_SERV_GNUTLS_SESS:
- if (gnutls_init (&(session_current_server->gnutls_sess), GNUTLS_CLIENT) != 0)
- {
- session_crash (file, _("gnutls init error"));
- return 0;
- }
- gnutls_set_default_priority (session_current_server->gnutls_sess);
- gnutls_certificate_type_set_priority (session_current_server->gnutls_sess, gnutls_cert_type_prio);
- gnutls_protocol_set_priority (session_current_server->gnutls_sess, gnutls_prot_prio);
- gnutls_credentials_set (session_current_server->gnutls_sess, GNUTLS_CRD_CERTIFICATE, gnutls_xcred);
- session_data = NULL;
- rc = rc && (session_read_buf_alloc (file, &session_data, &session_size_int));
- if (rc)
- {
- session_size = session_size_int;
- gnutls_session_set_data (session_current_server->gnutls_sess, session_data, session_size);
- free (session_data);
- gnutls_transport_set_ptr (session_current_server->gnutls_sess,
- (gnutls_transport_ptr) ((unsigned long) session_current_server->sock));
- if (gnutls_handshake (session_current_server->gnutls_sess) < 0)
- {
- session_crash (file, _("gnutls handshake failed"));
- return 0;
- }
- }
- break;
-#endif
- case SESSION_SERV_UNTERMINATED_MESSAGE:
- rc = rc && (session_read_str (file, &(session_current_server->unterminated_message)));
- break;
- case SESSION_SERV_NICK:
- rc = rc && (session_read_str (file, &(session_current_server->nick)));
- break;
- case SESSION_SERV_NICK_MODES:
- rc = rc && (session_read_str (file, &(session_current_server->nick_modes)));
- break;
- case SESSION_SERV_PREFIX:
- rc = rc && (session_read_str (file, &(session_current_server->prefix)));
- break;
- case SESSION_SERV_RECONNECT_START:
- rc = rc && (session_read_buf (file, &(session_current_server->reconnect_start), sizeof (time_t)));
- break;
- case SESSION_SERV_COMMAND_TIME:
- rc = rc && (session_read_buf (file, &(session_current_server->command_time), sizeof (time_t)));
- break;
- case SESSION_SERV_RECONNECT_JOIN:
- rc = rc && (session_read_int (file, &(session_current_server->reconnect_join)));
- break;
- case SESSION_SERV_IS_AWAY:
- rc = rc && (session_read_int (file, &(session_current_server->is_away)));
- break;
- case SESSION_SERV_AWAY_MESSAGE:
- rc = rc && (session_read_str (file, &(session_current_server->away_message)));
- break;
- case SESSION_SERV_AWAY_TIME:
- rc = rc && (session_read_buf (file, &(session_current_server->away_time), sizeof (time_t)));
- break;
- case SESSION_SERV_LAG:
- rc = rc && (session_read_int (file, &(session_current_server->lag)));
- break;
- case SESSION_SERV_LAG_CHECK_TIME:
- rc = rc && (session_read_buf (file, &(session_current_server->lag_check_time), sizeof (struct timeval)));
- break;
- case SESSION_SERV_LAG_NEXT_CHECK:
- rc = rc && (session_read_buf (file, &(session_current_server->lag_next_check), sizeof (time_t)));
- break;
- case SESSION_SERV_CHARSET_DECODE_ISO__UNUSED:
- rc = rc && (session_read_ignore_value (file));
- break;
- case SESSION_SERV_CHARSET_DECODE_UTF__UNUSED:
- rc = rc && (session_read_ignore_value (file));
- break;
- case SESSION_SERV_CHARSET_ENCODE__UNUSED:
- rc = rc && (session_read_ignore_value (file));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "server (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_channel: load channel from file
- */
-
-int
-session_load_channel (FILE *file)
-{
- int object_id, rc, channel_type;
- char *channel_name;
-
- /* check if server is allocated for this channel */
- if (!session_current_server)
- {
- session_crash (file, _("channel found without server"));
- return 0;
- }
-
- /* read channel type */
- if (!session_read_object (file, SESSION_CHAN_TYPE, SESSION_TYPE_INT, &channel_type, 0))
- {
- session_crash (file, _("channel type not found"));
- return 0;
- }
-
- /* read channel name */
- channel_name = NULL;
- if (!session_read_object (file, SESSION_CHAN_NAME, SESSION_TYPE_STR, &channel_name, 0))
- {
- session_crash (file, _("channel name not found"));
- return 0;
- }
-
- /* allocate channel */
- weechat_log_printf (_("session: loading channel \"%s\"\n"),
- channel_name);
- session_current_channel = irc_channel_new (session_current_server,
- channel_type,
- channel_name);
- free (channel_name);
- if (!session_current_channel)
- {
- session_crash (file, _("can't create new channel"));
- return 0;
- }
-
- /* read channel values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading channel)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_CHAN_END:
- return 1;
- case SESSION_CHAN_TOPIC:
- rc = rc && (session_read_str_utf8 (file, &(session_current_channel->topic)));
- break;
- case SESSION_CHAN_MODES:
- rc = rc && (session_read_str (file, (char **)(&(session_current_channel->modes))));
- break;
- case SESSION_CHAN_LIMIT:
- rc = rc && (session_read_int (file, &(session_current_channel->limit)));
- break;
- case SESSION_CHAN_KEY:
- rc = rc && (session_read_str (file, &(session_current_channel->key)));
- break;
- case SESSION_CHAN_NICKS_COUNT:
- rc = rc && (session_read_int (file, &(session_current_channel->nicks_count)));
- /* will be incremented when adding nicks */
- session_current_channel->nicks_count = 0;
- break;
- case SESSION_CHAN_CHECKING_AWAY:
- rc = rc && (session_read_int (file, &(session_current_channel->checking_away)));
- break;
- case SESSION_CHAN_AWAY_MESSAGE:
- rc = rc && (session_read_str (file, &(session_current_channel->away_message)));
- break;
- case SESSION_CHAN_CYCLE:
- rc = rc && (session_read_int (file, &(session_current_channel->cycle)));
- break;
- case SESSION_CHAN_CLOSE:
- rc = rc && (session_read_int (file, &(session_current_channel->close)));
- break;
- case SESSION_CHAN_DISPLAY_CREATION_DATE:
- rc = rc && (session_read_int (file, &(session_current_channel->display_creation_date)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "channel (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_nick: load nick from file
- */
-
-int
-session_load_nick (FILE *file)
-{
- int rc, object_id;
- char *nick_name;
- t_irc_nick *nick;
-
- /* check if channel is allocated for this nick */
- if (!session_current_channel)
- {
- session_crash (file, _("nick found without channel"));
- return 0;
- }
-
- /* read nick name */
- nick_name = NULL;
- if (!session_read_object (file, SESSION_NICK_NICK, SESSION_TYPE_STR, &nick_name, 0))
- {
- session_crash (file, _("nick name not found"));
- return 0;
- }
-
- /* allocate nick */
- nick = irc_nick_new (session_current_server, session_current_channel,
- nick_name, 0, 0, 0, 0, 0, 0, 0);
- free (nick_name);
- if (!nick)
- {
- session_crash (file, _("can't create new nick"));
- return 0;
- }
-
- /* read nick values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading nick)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_NICK_END:
- return 1;
- case SESSION_NICK_FLAGS:
- rc = rc && (session_read_int (file, &(nick->flags)));
- break;
- case SESSION_NICK_COLOR:
- rc = rc && (session_read_int (file, &(nick->color)));
- break;
- case SESSION_NICK_HOST:
- rc = rc && (session_read_str (file, &(nick->host)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "nick (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_dcc: load DCC from file
- */
-
-int
-session_load_dcc (FILE *file)
-{
- int object_id, rc;
- t_irc_dcc *dcc;
- char *string;
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
-
- /* allocate DCC */
- dcc = irc_dcc_alloc ();
- if (!dcc)
- {
- session_crash (file, _("can't create new DCC"));
- return 0;
- }
-
- weechat_log_printf (_("session: loading DCC\n"));
-
- /* read DCC values */
- ptr_server = NULL;
- ptr_channel = NULL;
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading DCC)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_DCC_END:
- return 1;
- case SESSION_DCC_SERVER:
- string = NULL;
- rc = rc && (session_read_str (file, &string));
- if (!rc)
- return 0;
- if (string && string[0])
- {
- ptr_server = irc_server_search (string);
- if (!ptr_server)
- {
- session_crash (file, _("server not found for DCC"));
- return 0;
- }
- dcc->server = ptr_server;
- }
- break;
- case SESSION_DCC_CHANNEL:
- if (!ptr_server)
- {
- session_crash (file, _("DCC with channel but without server"));
- return 0;
- }
- string = NULL;
- rc = rc && (session_read_str (file, &string));
- if (!rc)
- return 0;
- if (string && string[0])
- {
- ptr_channel = irc_channel_search_any (ptr_server, string);
- if (!ptr_channel)
- {
- session_crash (file, _("channel not found for DCC"));
- return 0;
- }
- dcc->channel = ptr_channel;
- ptr_channel->dcc_chat = dcc;
- }
- break;
- case SESSION_DCC_TYPE:
- rc = rc && (session_read_int (file, &(dcc->type)));
- break;
- case SESSION_DCC_STATUS:
- rc = rc && (session_read_int (file, &(dcc->status)));
- break;
- case SESSION_DCC_START_TIME:
- rc = rc && (session_read_buf (file, &(dcc->start_time), sizeof (time_t)));
- break;
- case SESSION_DCC_START_TRANSFER:
- rc = rc && (session_read_buf (file, &(dcc->start_transfer), sizeof (time_t)));
- break;
- case SESSION_DCC_ADDR:
- rc = rc && (session_read_buf (file, &(dcc->addr), sizeof (unsigned long)));
- break;
- case SESSION_DCC_PORT:
- rc = rc && (session_read_int (file, &(dcc->port)));
- break;
- case SESSION_DCC_NICK:
- rc = rc && (session_read_str (file, &(dcc->nick)));
- break;
- case SESSION_DCC_SOCK:
- rc = rc && (session_read_int (file, &(dcc->sock)));
- break;
- case SESSION_DCC_UNTERMINATED_MESSAGE:
- rc = rc && (session_read_str (file, &(dcc->unterminated_message)));
- break;
- case SESSION_DCC_FILE:
- rc = rc && (session_read_int (file, &(dcc->file)));
- break;
- case SESSION_DCC_FILENAME:
- rc = rc && (session_read_str (file, &(dcc->filename)));
- break;
- case SESSION_DCC_LOCAL_FILENAME:
- rc = rc && (session_read_str (file, &(dcc->local_filename)));
- break;
- case SESSION_DCC_FILENAME_SUFFIX:
- rc = rc && (session_read_int (file, &(dcc->filename_suffix)));
- break;
- case SESSION_DCC_SIZE:
- rc = rc && (session_read_buf (file, &(dcc->size), sizeof (unsigned long)));
- break;
- case SESSION_DCC_POS:
- rc = rc && (session_read_buf (file, &(dcc->pos), sizeof (unsigned long)));
- break;
- case SESSION_DCC_ACK:
- rc = rc && (session_read_buf (file, &(dcc->ack), sizeof (unsigned long)));
- break;
- case SESSION_DCC_START_RESUME:
- rc = rc && (session_read_buf (file, &(dcc->start_resume), sizeof (unsigned long)));
- break;
- case SESSION_DCC_LAST_CHECK_TIME:
- rc = rc && (session_read_buf (file, &(dcc->last_check_time), sizeof (time_t)));
- break;
- case SESSION_DCC_LAST_CHECK_POS:
- rc = rc && (session_read_buf (file, &(dcc->last_check_pos), sizeof (unsigned long)));
- break;
- case SESSION_DCC_LAST_ACTIVITY:
- rc = rc && (session_read_buf (file, &(dcc->last_activity), sizeof (time_t)));
- break;
- case SESSION_DCC_BYTES_PER_SEC:
- rc = rc && (session_read_buf (file, &(dcc->bytes_per_sec), sizeof (unsigned long)));
- break;
- case SESSION_DCC_ETA:
- rc = rc && (session_read_buf (file, &(dcc->eta), sizeof (unsigned long)));
- break;
- case SESSION_DCC_CHILD_PID:
- rc = rc && (session_read_int (file, &(dcc->child_pid)));
- break;
- case SESSION_DCC_CHILD_READ:
- rc = rc && (session_read_int (file, &(dcc->child_read)));
- break;
- case SESSION_DCC_CHILD_WRITE:
- rc = rc && (session_read_int (file, &(dcc->child_write)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "DCC (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_history: load history from file (global or for a buffer)
- */
-
-int
-session_load_history (FILE *file)
-{
- int object_id, rc;
- char *text;
-
- if (session_current_buffer)
- weechat_log_printf (_("session: loading buffer history\n"));
- else
- weechat_log_printf (_("session: loading global history\n"));
-
- /* read history values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading history)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_HIST_END:
- return 1;
- case SESSION_HIST_TEXT:
- text = NULL;
- if (!session_read_str_utf8 (file, &text))
- return 0;
- if (session_current_buffer)
- history_buffer_add (session_current_buffer, text);
- else
- history_global_add (text);
- free (text);
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "history (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_buffer: load buffer from file
- */
-
-int
-session_load_buffer (FILE *file)
-{
- int object_id, rc;
- char *server_name, *channel_name;
- int buffer_type;
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
-
- /* read server name */
- server_name = NULL;
- if (!session_read_object (file, SESSION_BUFF_SERVER, SESSION_TYPE_STR, &server_name, 0))
- {
- session_crash (file, _("server name not found for buffer"));
- return 0;
- }
-
- /* read channel name */
- channel_name = NULL;
- if (!session_read_object (file, SESSION_BUFF_CHANNEL, SESSION_TYPE_STR, &channel_name, 0))
- {
- session_crash (file, _("channel name not found for buffer"));
- return 0;
- }
-
- /* read buffer type */
- if (!session_read_object (file, SESSION_BUFF_TYPE, SESSION_TYPE_INT, &buffer_type, 0))
- {
- session_crash (file, _("buffer type not found"));
- return 0;
- }
-
- /* allocate buffer */
- weechat_log_printf (_("session: loading buffer (server: %s, channel: %s, type: %d)\n"),
- (server_name) ? server_name : "-",
- (channel_name) ? channel_name : "-",
- buffer_type);
- ptr_server = NULL;
- ptr_channel = NULL;
- if (server_name)
- {
- ptr_server = irc_server_search (server_name);
- if (!ptr_server)
- {
- session_crash (file, _("server not found for buffer"));
- return 0;
- }
- }
-
- if (channel_name)
- {
- ptr_channel = irc_channel_search_any_without_buffer (ptr_server, channel_name);
- if (!ptr_channel)
- {
- session_crash (file, _("channel not found for buffer"));
- return 0;
- }
- }
-
- session_current_buffer = gui_buffer_new (gui_windows, ptr_server,
- ptr_channel, buffer_type, 1);
- if (!session_current_buffer)
- {
- session_crash (file, _("can't create new buffer"));
- return 0;
- }
-
- free (server_name);
- free (channel_name);
-
- /* read buffer values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading buffer)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_BUFF_END:
- return 1;
- case SESSION_BUFF_ALL_SERVERS:
- rc = rc && (session_read_int (file, &(session_current_buffer->all_servers)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "buffer (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_line: load buffer line from file
- */
-
-int
-session_load_line (FILE *file)
-{
- int object_id, rc;
- t_gui_line *line;
-
- /* check if buffer is allocated for this line */
- if (!session_current_buffer)
- {
- session_crash (file, _("line found without buffer"));
- return 0;
- }
-
- /* allocate line */
- line = gui_buffer_line_new (session_current_buffer, time (NULL));
- if (!line)
- {
- session_crash (file, _("can't create new line"));
- return 0;
- }
-
- /* read line values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading line)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_LINE_END:
- return 1;
- case SESSION_LINE_LENGTH:
- rc = rc && (session_read_int (file, &(line->length)));
- break;
- case SESSION_LINE_LENGTH_ALIGN:
- rc = rc && (session_read_int (file, &(line->length_align)));
- break;
- case SESSION_LINE_LOG_WRITE:
- rc = rc && (session_read_int (file, &(line->log_write)));
- break;
- case SESSION_LINE_WITH_MESSAGE:
- rc = rc && (session_read_int (file, &(line->line_with_message)));
- break;
- case SESSION_LINE_WITH_HIGHLIGHT:
- rc = rc && (session_read_int (file, &(line->line_with_highlight)));
- break;
- case SESSION_LINE_DATA:
- rc = rc && (session_read_str_utf8 (file, &(line->data)));
- break;
- case SESSION_LINE_OFS_AFTER_DATE:
- rc = rc && (session_read_int (file, &(line->ofs_after_date)));
- break;
- case SESSION_LINE_OFS_START_MESSAGE:
- rc = rc && (session_read_int (file, &(line->ofs_start_message)));
- break;
- case SESSION_LINE_NICK:
- rc = rc && (session_read_str (file, &(line->nick)));
- break;
- case SESSION_LINE_DATE:
- rc = rc && (session_read_buf (file, &(line->date), sizeof (time_t)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "line (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_uptime: load uptime from file
- */
-
-int
-session_load_uptime (FILE *file)
-{
- int object_id, rc;
-
- /* read uptime values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading uptime)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_UPT_END:
- return 1;
- case SESSION_UPT_START_TIME:
- rc = rc && (session_read_buf (file, &weechat_start_time, sizeof (time_t)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "uptime (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load_hotlist: load hotlist from file
- */
-
-int
-session_load_hotlist (FILE *file)
-{
- int object_id, rc;
- int priority;
- struct timeval creation_time;
- char *server_name;
- t_irc_server *ptr_server;
- int buffer_number;
- t_gui_buffer *ptr_buffer;
-
- priority = 0;
- creation_time.tv_sec = 0;
- creation_time.tv_usec = 0;
- ptr_server = NULL;
- ptr_buffer = NULL;
-
- /* read hotlist values */
- rc = 1;
- while (rc)
- {
- if (feof (file))
- {
- session_crash (file, _("unexpected end of file (reading hotlist)"));
- return 0;
- }
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- return 0;
- switch (object_id)
- {
- case SESSION_HOTL_END:
- hotlist_add (priority, &creation_time, ptr_server, ptr_buffer, 1);
- return 1;
- case SESSION_HOTL_PRIORITY:
- rc = rc && (session_read_int (file, &priority));
- break;
- case SESSION_HOTL_SERVER:
- server_name = NULL;
- if (!session_read_str (file, &server_name))
- return 0;
- ptr_server = irc_server_search (server_name);
- free (server_name);
- break;
- case SESSION_HOTL_BUFFER_NUMBER:
- rc = rc && (session_read_int (file, &buffer_number));
- ptr_buffer = gui_buffer_search_by_number (buffer_number);
- break;
- case SESSION_HOTL_CREATION_TIME:
- rc = rc && (session_read_buf (file, &creation_time, sizeof (struct timeval)));
- break;
- default:
- weechat_log_printf (_("session: warning: ignoring value from "
- "history (object id: %d)\n"),
- object_id);
- rc = rc && (session_read_ignore_value (file));
- break;
- }
- }
- return 0;
-}
-
-/*
- * session_load: load session from file
- */
-
-int
-session_load (char *filename)
-{
- FILE *file;
- char *signature;
- int object_id;
- t_irc_server *ptr_server;
-
- session_current_server = NULL;
- session_current_channel = NULL;
- session_current_buffer = NULL;
-
- session_last_read_pos = -1;
- session_last_read_length = -1;
-
- if ((file = fopen (filename, "rb")) == NULL)
- {
- session_crash (file, _("session file not found"));
- return 0;
- }
-
- signature = NULL;
- if (!session_read_str (file, &signature))
- {
- session_crash (file, _("signature not found"));
- return 0;
- }
- if (!signature || (strcmp (signature, SESSION_SIGNATURE) != 0))
- {
- session_crash (file, _("bad session signature"));
- return 0;
- }
- free (signature);
-
- while (!feof (file))
- {
- if (fread ((void *)(&object_id), sizeof (int), 1, file) == 0)
- {
- if (feof (file))
- break;
- session_crash (file, _("object id not found"));
- return 0;
- }
- switch (object_id)
- {
- case SESSION_OBJ_SERVER:
- if (!session_load_server (file))
- {
- session_crash (file, _("failed to load server"));
- return 0;
- }
- break;
- case SESSION_OBJ_CHANNEL:
- if (!session_load_channel (file))
- {
- session_crash (file, _("failed to load channel"));
- return 0;
- }
- break;
- case SESSION_OBJ_NICK:
- if (!session_load_nick (file))
- {
- session_crash (file, _("failed to load nick"));
- return 0;
- }
- break;
- case SESSION_OBJ_DCC:
- if (!session_load_dcc (file))
- {
- session_crash (file, _("failed to load DCC"));
- return 0;
- }
- break;
- case SESSION_OBJ_HISTORY:
- if (!session_load_history (file))
- {
- session_crash (file, _("failed to load history"));
- return 0;
- }
- break;
- case SESSION_OBJ_BUFFER:
- if (!session_load_buffer (file))
- {
- session_crash (file, _("failed to load buffer"));
- return 0;
- }
- break;
- case SESSION_OBJ_LINE:
- if (!session_load_line (file))
- {
- session_crash (file, _("failed to load line"));
- return 0;
- }
- break;
- case SESSION_OBJ_UPTIME:
- if (!session_load_uptime (file))
- {
- session_crash (file, _("failed to load uptime"));
- return 0;
- }
- break;
- case SESSION_OBJ_HOTLIST:
- if (!session_load_hotlist (file))
- {
- session_crash (file, _("failed to load hotlist"));
- return 0;
- }
- break;
- default:
- weechat_log_printf (_("ignoring object (id: %d)\n"),
- object_id);
- if (!session_read_ignore_object (file))
- {
- session_crash (file, _("failed to ignore object (id: %d)"),
- object_id);
- return 0;
- }
- }
- }
-
- /* assign a buffer to all connected servers */
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if ((ptr_server->is_connected) && (!ptr_server->buffer))
- ptr_server->buffer = gui_buffers;
- }
-
- gui_window_switch_to_buffer (gui_windows, gui_buffers);
- gui_window_redraw_buffer (gui_current_window->buffer);
-
- fclose (file);
-
- if (unlink (filename) < 0)
- {
- irc_display_prefix (NULL, gui_current_window->buffer, GUI_PREFIX_ERROR);
- gui_printf_nolog (gui_current_window->buffer,
- _("%s can't delete session file (%s)\n"),
- WEECHAT_ERROR, filename);
- }
-
- irc_display_prefix (NULL, gui_current_window->buffer, GUI_PREFIX_INFO);
- gui_printf_nolog (gui_current_window->buffer,
- _("Upgrade completed successfully\n"));
-
- return 1;
-}
diff --git a/src/common/session.h b/src/common/session.h
deleted file mode 100644
index 7728220f3..000000000
--- a/src/common/session.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_SESSION_H
-#define __WEECHAT_SESSION_H 1
-
-#define WEECHAT_SESSION_NAME "weechat_session.bin"
-
-#define SESSION_SIGNATURE "== WeeChat Upgrade file v1.0 - binary, do not edit! =="
-
-/* For developers: please add new values ONLY AT THE END of enums */
-
-enum t_session_type
-{
- SESSION_TYPE_INT = 0,
- SESSION_TYPE_STR,
- SESSION_TYPE_BUF
-};
-
-enum t_session_object
-{
- SESSION_OBJ_END = 0,
- SESSION_OBJ_SERVER,
- SESSION_OBJ_CHANNEL,
- SESSION_OBJ_NICK,
- SESSION_OBJ_DCC,
- SESSION_OBJ_HISTORY,
- SESSION_OBJ_BUFFER,
- SESSION_OBJ_LINE,
- SESSION_OBJ_UPTIME,
- SESSION_OBJ_HOTLIST
-};
-
-enum t_session_server
-{
- SESSION_SERV_END = 0,
- SESSION_SERV_NAME,
- SESSION_SERV_AUTOCONNECT,
- SESSION_SERV_AUTORECONNECT,
- SESSION_SERV_AUTORECONNECT_DELAY,
- SESSION_SERV_TEMP_SERVER,
- SESSION_SERV_ADDRESS,
- SESSION_SERV_PORT,
- SESSION_SERV_IPV6,
- SESSION_SERV_SSL,
- SESSION_SERV_PASSWORD,
- SESSION_SERV_NICK1,
- SESSION_SERV_NICK2,
- SESSION_SERV_NICK3,
- SESSION_SERV_USERNAME,
- SESSION_SERV_REALNAME,
- SESSION_SERV_COMMAND,
- SESSION_SERV_COMMAND_DELAY,
- SESSION_SERV_AUTOJOIN,
- SESSION_SERV_AUTOREJOIN,
- SESSION_SERV_NOTIFY_LEVELS,
- SESSION_SERV_CHILD_PID,
- SESSION_SERV_CHILD_READ,
- SESSION_SERV_CHILD_WRITE,
- SESSION_SERV_SOCK,
- SESSION_SERV_IS_CONNECTED,
- SESSION_SERV_SSL_CONNECTED,
- SESSION_SERV_GNUTLS_SESS,
- SESSION_SERV_UNTERMINATED_MESSAGE,
- SESSION_SERV_NICK,
- SESSION_SERV_RECONNECT_START,
- SESSION_SERV_RECONNECT_JOIN,
- SESSION_SERV_IS_AWAY,
- SESSION_SERV_AWAY_TIME,
- SESSION_SERV_LAG,
- SESSION_SERV_LAG_CHECK_TIME,
- SESSION_SERV_LAG_NEXT_CHECK,
- SESSION_SERV_CHARSET_DECODE_ISO__UNUSED,
- SESSION_SERV_CHARSET_DECODE_UTF__UNUSED,
- SESSION_SERV_CHARSET_ENCODE__UNUSED,
- SESSION_SERV_HOSTNAME,
- SESSION_SERV_NICK_MODES,
- SESSION_SERV_AWAY_MESSAGE,
- SESSION_SERV_PREFIX,
- SESSION_SERV_COMMAND_TIME
-};
-
-enum t_session_channel
-{
- SESSION_CHAN_END = 0,
- SESSION_CHAN_TYPE,
- SESSION_CHAN_NAME,
- SESSION_CHAN_TOPIC,
- SESSION_CHAN_MODES,
- SESSION_CHAN_LIMIT,
- SESSION_CHAN_KEY,
- SESSION_CHAN_NICKS_COUNT,
- SESSION_CHAN_CHECKING_AWAY,
- SESSION_CHAN_AWAY_MESSAGE,
- SESSION_CHAN_CYCLE,
- SESSION_CHAN_CLOSE,
- SESSION_CHAN_DISPLAY_CREATION_DATE
-};
-
-enum t_session_nick
-{
- SESSION_NICK_END = 0,
- SESSION_NICK_NICK,
- SESSION_NICK_FLAGS,
- SESSION_NICK_COLOR,
- SESSION_NICK_HOST
-};
-
-enum t_session_dcc
-{
- SESSION_DCC_END = 0,
- SESSION_DCC_SERVER,
- SESSION_DCC_CHANNEL,
- SESSION_DCC_TYPE,
- SESSION_DCC_STATUS,
- SESSION_DCC_START_TIME,
- SESSION_DCC_START_TRANSFER,
- SESSION_DCC_ADDR,
- SESSION_DCC_PORT,
- SESSION_DCC_NICK,
- SESSION_DCC_SOCK,
- SESSION_DCC_UNTERMINATED_MESSAGE,
- SESSION_DCC_FILE,
- SESSION_DCC_FILENAME,
- SESSION_DCC_LOCAL_FILENAME,
- SESSION_DCC_FILENAME_SUFFIX,
- SESSION_DCC_SIZE,
- SESSION_DCC_POS,
- SESSION_DCC_ACK,
- SESSION_DCC_START_RESUME,
- SESSION_DCC_LAST_CHECK_TIME,
- SESSION_DCC_LAST_CHECK_POS,
- SESSION_DCC_LAST_ACTIVITY,
- SESSION_DCC_BYTES_PER_SEC,
- SESSION_DCC_ETA,
- SESSION_DCC_CHILD_PID,
- SESSION_DCC_CHILD_READ,
- SESSION_DCC_CHILD_WRITE
-};
-
-enum t_session_history
-{
- SESSION_HIST_END = 0,
- SESSION_HIST_TEXT
-};
-
-enum t_session_buffer
-{
- SESSION_BUFF_END = 0,
- SESSION_BUFF_SERVER,
- SESSION_BUFF_CHANNEL,
- SESSION_BUFF_TYPE,
- SESSION_BUFF_ALL_SERVERS
-};
-
-enum t_session_line
-{
- SESSION_LINE_END = 0,
- SESSION_LINE_LENGTH,
- SESSION_LINE_LENGTH_ALIGN,
- SESSION_LINE_LOG_WRITE,
- SESSION_LINE_WITH_MESSAGE,
- SESSION_LINE_WITH_HIGHLIGHT,
- SESSION_LINE_DATA,
- SESSION_LINE_OFS_AFTER_DATE,
- SESSION_LINE_OFS_START_MESSAGE,
- SESSION_LINE_NICK,
- SESSION_LINE_DATE
-};
-
-enum t_session_uptime
-{
- SESSION_UPT_END = 0,
- SESSION_UPT_START_TIME
-};
-
-enum t_session_hotlist
-{
- SESSION_HOTL_END = 0,
- SESSION_HOTL_PRIORITY,
- SESSION_HOTL_SERVER,
- SESSION_HOTL_BUFFER_NUMBER,
- SESSION_HOTL_CREATION_TIME
-};
-
-int session_save (char *filename);
-int session_load (char *filename);
-
-#endif /* session.h */
diff --git a/src/common/utf8.c b/src/common/utf8.c
deleted file mode 100644
index 176fee797..000000000
--- a/src/common/utf8.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* utf8.c: UTF-8 string functions for WeeChat */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "weechat.h"
-#include "utf8.h"
-#include "util.h"
-#include "weeconfig.h"
-
-
-int local_utf8 = 0;
-
-/*
- * utf8_init: initializes UTF-8 in WeeChat
- */
-
-void
-utf8_init ()
-{
- local_utf8 = (ascii_strcasecmp (local_charset, "UTF-8") == 0);
-}
-
-/*
- * utf8_has_8bits: return 1 if string has 8-bits chars, 0 if only 7-bits chars
- */
-
-int
-utf8_has_8bits (char *string)
-{
- while (string && string[0])
- {
- if (string[0] & 0x80)
- return 1;
- string++;
- }
- return 0;
-}
-
-/*
- * utf8_is_valid: return 1 if UTF-8 string is valid, 0 otherwise
- * if error is not NULL, it's set with first non valid UTF-8
- * char in string, if any
- */
-
-int
-utf8_is_valid (char *string, char **error)
-{
- while (string && string[0])
- {
- /* UTF-8, 2 bytes, should be: 110vvvvv 10vvvvvv */
- if (((unsigned char)(string[0]) & 0xE0) == 0xC0)
- {
- if (!string[1] || (((unsigned char)(string[1]) & 0xC0) != 0x80))
- {
- if (error)
- *error = string;
- return 0;
- }
- string += 2;
- }
- /* UTF-8, 3 bytes, should be: 1110vvvv 10vvvvvv 10vvvvvv */
- else if (((unsigned char)(string[0]) & 0xF0) == 0xE0)
- {
- if (!string[1] || !string[2]
- || (((unsigned char)(string[1]) & 0xC0) != 0x80)
- || (((unsigned char)(string[2]) & 0xC0) != 0x80))
- {
- if (error)
- *error = string;
- return 0;
- }
- string += 3;
- }
- /* UTF-8, 4 bytes, should be: 11110vvv 10vvvvvv 10vvvvvv 10vvvvvv */
- else if (((unsigned char)(string[0]) & 0xF8) == 0xF0)
- {
- if (!string[1] || !string[2] || !string[3]
- || (((unsigned char)(string[1]) & 0xC0) != 0x80)
- || (((unsigned char)(string[2]) & 0xC0) != 0x80)
- || (((unsigned char)(string[3]) & 0xC0) != 0x80))
- {
- if (error)
- *error = string;
- return 0;
- }
- string += 4;
- }
- /* UTF-8, 1 byte, should be: 0vvvvvvv */
- else if ((unsigned char)(string[0]) >= 0x80)
- {
- if (error)
- *error = string;
- return 0;
- }
- else
- string++;
- }
- if (error)
- *error = NULL;
- return 1;
-}
-
-/*
- * utf8_normalize: normalize UTF-8 string: remove non UTF-8 chars and
- * replace them by a char
- */
-
-void
-utf8_normalize (char *string, char replacement)
-{
- char *error;
-
- while (string && string[0])
- {
- if (utf8_is_valid (string, &error))
- return;
- error[0] = replacement;
- string = error + 1;
- }
-}
-
-/*
- * utf8_prev_char: return previous UTF-8 char in a string
- */
-
-char *
-utf8_prev_char (char *string_start, char *string)
-{
- if (!string || (string <= string_start))
- return NULL;
-
- string--;
-
- if (((unsigned char)(string[0]) & 0xC0) == 0x80)
- {
- /* UTF-8, at least 2 bytes */
- string--;
- if (string < string_start)
- return string + 1;
- if (((unsigned char)(string[0]) & 0xC0) == 0x80)
- {
- /* UTF-8, at least 3 bytes */
- string--;
- if (string < string_start)
- return string + 1;
- if (((unsigned char)(string[0]) & 0xC0) == 0x80)
- {
- /* UTF-8, 4 bytes */
- string--;
- if (string < string_start)
- return string + 1;
- return string;
- }
- else
- return string;
- }
- else
- return string;
- }
- return string;
-}
-
-/*
- * utf8_next_char: return next UTF-8 char in a string
- */
-
-char *
-utf8_next_char (char *string)
-{
- if (!string)
- return NULL;
-
- /* UTF-8, 2 bytes: 110vvvvv 10vvvvvv */
- if (((unsigned char)(string[0]) & 0xE0) == 0xC0)
- {
- if (!string[1])
- return string + 1;
- return string + 2;
- }
- /* UTF-8, 3 bytes: 1110vvvv 10vvvvvv 10vvvvvv */
- else if (((unsigned char)(string[0]) & 0xF0) == 0xE0)
- {
- if (!string[1])
- return string + 1;
- if (!string[2])
- return string + 2;
- return string + 3;
- }
- /* UTF-8, 4 bytes: 11110vvv 10vvvvvv 10vvvvvv 10vvvvvv */
- else if (((unsigned char)(string[0]) & 0xF8) == 0xF0)
- {
- if (!string[1])
- return string + 1;
- if (!string[2])
- return string + 2;
- if (!string[3])
- return string + 3;
- return string + 4;
- }
- /* UTF-8, 1 byte: 0vvvvvvv */
- return string + 1;
-}
-
-/*
- * utf8_char_size: return UTF-8 char size
- */
-
-int
-utf8_char_size (char *string)
-{
- if (!string)
- return 0;
-
- return utf8_next_char (string) - string;
-}
-
-/*
- * utf8_strlen: return length of an UTF-8 string (<= strlen(string))
- */
-
-int
-utf8_strlen (char *string)
-{
- int length;
-
- if (!string)
- return 0;
-
- length = 0;
- while (string && string[0])
- {
- string = utf8_next_char (string);
- length++;
- }
- return length;
-}
-
-/*
- * utf8_strnlen: return length of an UTF-8 string, for N bytes
- */
-
-int
-utf8_strnlen (char *string, int bytes)
-{
- char *start;
- int length;
-
- if (!string)
- return 0;
-
- start = string;
- length = 0;
- while (string && string[0] && (string - start < bytes))
- {
- string = utf8_next_char (string);
- length++;
- }
- return length;
-}
-
-/*
- * utf8_width_screen: return number of chars needed on screen to display UTF-8 string
- */
-
-int
-utf8_width_screen (char *string)
-{
- int length, num_char;
- wchar_t *wstring;
-
- if (!string)
- return 0;
-
- if (!local_utf8)
- return utf8_strlen (string);
-
- num_char = mbstowcs (NULL, string, 0) + 1;
- wstring = (wchar_t *) malloc ((num_char + 1) * sizeof (wchar_t));
- if (!wstring)
- return utf8_strlen (string);
-
- if (mbstowcs (wstring, string, num_char) == (size_t)(-1))
- {
- free (wstring);
- return utf8_strlen (string);
- }
-
- length = wcswidth (wstring, num_char);
- free (wstring);
- return length;
-}
-
-/*
- * utf8_add_offset: moves forward N chars in an UTF-8 string
- */
-
-char *
-utf8_add_offset (char *string, int offset)
-{
- int count;
-
- if (!string)
- return string;
-
- count = 0;
- while (string && string[0] && (count < offset))
- {
- string = utf8_next_char (string);
- count++;
- }
- return string;
-}
-
-/*
- * utf8_real_pos: get real position in UTF-8
- * for example: ("aébc", 2) returns 3
- */
-
-int
-utf8_real_pos (char *string, int pos)
-{
- int count, real_pos;
- char *next_char;
-
- if (!string)
- return pos;
-
- count = 0;
- real_pos = 0;
- while (string && string[0] && (count < pos))
- {
- next_char = utf8_next_char (string);
- real_pos += (next_char - string);
- string = next_char;
- count++;
- }
- return real_pos;
-}
-
-/*
- * utf8_pos: get position in UTF-8
- * for example: ("aébc", 3) returns 2
- */
-
-int
-utf8_pos (char *string, int real_pos)
-{
- int count;
- char *limit;
-
- if (!string || !local_charset)
- return real_pos;
-
- count = 0;
- limit = string + real_pos;
- while (string && string[0] && (string < limit))
- {
- string = utf8_next_char (string);
- count++;
- }
- return count;
-}
-
-/*
- * utf8_get_wc: get wide char from string (first char)
- */
-
-wint_t
-utf8_get_wc (char *string)
-{
- int char_size;
- wint_t result;
-
- if (!string || !string[0])
- return WEOF;
-
- char_size = utf8_char_size (string);
- switch (char_size)
- {
- case 1:
- result = (wint_t)string[0];
- break;
- case 2:
- result = ((wint_t)((unsigned char)string[0])) << 8
- | ((wint_t)((unsigned char)string[1]));
- break;
- case 3:
- result = ((wint_t)((unsigned char)string[0])) << 16
- | ((wint_t)((unsigned char)string[1])) << 8
- | ((wint_t)((unsigned char)string[2]));
- break;
- case 4:
- result = ((wint_t)((unsigned char)string[0])) << 24
- | ((wint_t)((unsigned char)string[1])) << 16
- | ((wint_t)((unsigned char)string[2])) << 8
- | ((wint_t)((unsigned char)string[3]));
- break;
- default:
- result = WEOF;
- }
- return result;
-}
diff --git a/src/common/utf8.h b/src/common/utf8.h
deleted file mode 100644
index caf7b7b10..000000000
--- a/src/common/utf8.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_UTF8_H
-#define __WEECHAT_UTF8_H 1
-
-#ifndef __USE_XOPEN
-#define __USE_XOPEN
-#endif
-
-#if defined(__OpenBSD__)
-#include <utf8/wchar.h>
-#else
-#include <wchar.h>
-#endif
-
-extern int local_utf8;
-
-extern void utf8_init ();
-extern int utf8_has_8bits (char *);
-extern int utf8_is_valid (char *, char **);
-extern void utf8_normalize (char *, char);
-extern char *utf8_prev_char (char *, char *);
-extern char *utf8_next_char (char *);
-extern int utf8_char_size (char *);
-extern int utf8_strlen (char *);
-extern int utf8_strnlen (char *, int);
-extern int utf8_width_screen (char *);
-extern char *utf8_add_offset (char *, int);
-extern int utf8_real_pos (char *, int);
-extern int utf8_pos (char *, int);
-extern wint_t utf8_get_wc (char *);
-
-#endif /* utf8.h */
diff --git a/src/common/util.c b/src/common/util.c
deleted file mode 100644
index 4fe9395c5..000000000
--- a/src/common/util.c
+++ /dev/null
@@ -1,730 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* util.c: some useful functions for WeeChat */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifdef HAVE_ICONV
-#include <iconv.h>
-#endif
-
-#ifndef ICONV_CONST
- #ifdef ICONV_2ARG_IS_CONST
- #define ICONV_CONST const
- #else
- #define ICONV_CONST
- #endif
-#endif
-
-#include "weechat.h"
-#include "utf8.h"
-#include "weeconfig.h"
-
-
-/*
- * strndup: define strndup function if not existing (FreeBSD and maybe other)
- */
-
-#ifndef HAVE_STRNDUP
-char *
-strndup (char *string, int length)
-{
- char *result;
-
- if ((int)strlen (string) < length)
- return strdup (string);
-
- result = (char *)malloc (length + 1);
- if (!result)
- return NULL;
-
- memcpy (result, string, length);
- result[length] = '\0';
-
- return result;
-}
-#endif
-
-/*
- * ascii_tolower: locale independant string conversion to lower case
- */
-
-void
-ascii_tolower (char *string)
-{
- while (string && string[0])
- {
- if ((string[0] >= 'A') && (string[0] <= 'Z'))
- string[0] += ('a' - 'A');
- string++;
- }
-}
-
-/*
- * ascii_toupper: locale independant string conversion to upper case
- */
-
-void
-ascii_toupper (char *string)
-{
- while (string && string[0])
- {
- if ((string[0] >= 'a') && (string[0] <= 'z'))
- string[0] -= ('a' - 'A');
- string++;
- }
-}
-
-/*
- * ascii_strcasecmp: locale and case independent string comparison
- */
-
-int
-ascii_strcasecmp (char *string1, char *string2)
-{
- int c1, c2;
-
- if (!string1 || !string2)
- return (string1) ? 1 : ((string2) ? -1 : 0);
-
- while (string1[0] && string2[0])
- {
- c1 = (int)((unsigned char) string1[0]);
- c2 = (int)((unsigned char) string2[0]);
-
- if ((c1 >= 'A') && (c1 <= 'Z'))
- c1 += ('a' - 'A');
-
- if ((c2 >= 'A') && (c2 <= 'Z'))
- c2 += ('a' - 'A');
-
- if ((c1 - c2) != 0)
- return c1 - c2;
-
- string1++;
- string2++;
- }
-
- return (string1[0]) ? 1 : ((string2[0]) ? -1 : 0);
-}
-
-/*
- * ascii_strncasecmp: locale and case independent string comparison
- * with max length
- */
-
-int
-ascii_strncasecmp (char *string1, char *string2, int max)
-{
- int c1, c2, count;
-
- if (!string1 || !string2)
- return (string1) ? 1 : ((string2) ? -1 : 0);
-
- count = 0;
- while ((count < max) && string1[0] && string2[0])
- {
- c1 = (int)((unsigned char) string1[0]);
- c2 = (int)((unsigned char) string2[0]);
-
- if ((c1 >= 'A') && (c1 <= 'Z'))
- c1 += ('a' - 'A');
-
- if ((c2 >= 'A') && (c2 <= 'Z'))
- c2 += ('a' - 'A');
-
- if ((c1 - c2) != 0)
- return c1 - c2;
-
- string1++;
- string2++;
- count++;
- }
-
- if (count >= max)
- return 0;
- else
- return (string1[0]) ? 1 : ((string2[0]) ? -1 : 0);
-}
-
-/*
- * ascii_strcasestr: locale and case independent string search
- */
-
-char *
-ascii_strcasestr (char *string, char *search)
-{
- int length_search;
-
- length_search = strlen (search);
-
- if (!string || !search || (length_search == 0))
- return NULL;
-
- while (string[0])
- {
- if (ascii_strncasecmp (string, search, length_search) == 0)
- return string;
-
- string++;
- }
-
- return NULL;
-}
-
-/*
- * weechat_iconv: convert string to another charset
- */
-
-char *
-weechat_iconv (int from_utf8, char *from_code, char *to_code, char *string)
-{
- char *outbuf;
-
-#ifdef HAVE_ICONV
- iconv_t cd;
- char *inbuf, *ptr_inbuf, *ptr_outbuf, *next_char;
- char *ptr_inbuf_shift;
- int done;
- size_t err, inbytesleft, outbytesleft;
-
- if (from_code && from_code[0] && to_code && to_code[0]
- && (ascii_strcasecmp(from_code, to_code) != 0))
- {
- cd = iconv_open (to_code, from_code);
- if (cd == (iconv_t)(-1))
- outbuf = strdup (string);
- else
- {
- inbuf = strdup (string);
- ptr_inbuf = inbuf;
- inbytesleft = strlen (inbuf);
- outbytesleft = inbytesleft * 4;
- outbuf = (char *) malloc (outbytesleft + 2);
- ptr_outbuf = outbuf;
- ptr_inbuf_shift = NULL;
- done = 0;
- while (!done)
- {
- err = iconv (cd, (ICONV_CONST char **)(&ptr_inbuf), &inbytesleft,
- &ptr_outbuf, &outbytesleft);
- if (err == (size_t)(-1))
- {
- switch (errno)
- {
- case EINVAL:
- done = 1;
- break;
- case E2BIG:
- done = 1;
- break;
- case EILSEQ:
- if (from_utf8)
- {
- next_char = utf8_next_char (ptr_inbuf);
- if (next_char)
- {
- inbytesleft -= next_char - ptr_inbuf;
- ptr_inbuf = next_char;
- }
- else
- {
- inbytesleft--;
- ptr_inbuf++;
- }
- }
- else
- {
- ptr_inbuf++;
- inbytesleft--;
- }
- ptr_outbuf[0] = '?';
- ptr_outbuf++;
- outbytesleft--;
- break;
- }
- }
- else
- {
- if (!ptr_inbuf_shift)
- {
- ptr_inbuf_shift = ptr_inbuf;
- ptr_inbuf = NULL;
- inbytesleft = 0;
- }
- else
- done = 1;
- }
- }
- if (ptr_inbuf_shift)
- ptr_inbuf = ptr_inbuf_shift;
- ptr_outbuf[0] = '\0';
- free (inbuf);
- iconv_close (cd);
- }
- }
- else
- outbuf = strdup (string);
-#else
- /* make C compiler happy */
- (void) from_utf8;
- (void) from_code;
- (void) to_code;
- outbuf = strdup (string);
-#endif /* HAVE_ICONV */
-
- return outbuf;
-}
-
-/*
- * weechat_iconv_to_internal: convert user string (input, script, ..) to
- * WeeChat internal storage charset
- */
-
-char *
-weechat_iconv_to_internal (char *charset, char *string)
-{
- char *input, *output;
-
- input = strdup (string);
-
- /* optimize for UTF-8: if charset is NULL => we use term charset =>
- if ths charset is already UTF-8, then no iconv needed */
- if (local_utf8 && (!charset || !charset[0]))
- return input;
-
- if (input)
- {
- if (utf8_has_8bits (input) && utf8_is_valid (input, NULL))
- return input;
-
- output = weechat_iconv (0,
- (charset && charset[0]) ?
- charset : local_charset,
- WEECHAT_INTERNAL_CHARSET,
- input);
- utf8_normalize (output, '?');
- free (input);
- return output;
- }
- return NULL;
-}
-
-/*
- * weechat_iconv_from_internal: convert internal string to terminal charset,
- * for display
- */
-
-char *
-weechat_iconv_from_internal (char *charset, char *string)
-{
- char *input, *output;
-
- input = strdup (string);
-
- /* optimize for UTF-8: if charset is NULL => we use term charset =>
- if ths charset is already UTF-8, then no iconv needed */
- if (local_utf8 && (!charset || !charset[0]))
- return input;
-
- if (input)
- {
- utf8_normalize (input, '?');
- output = weechat_iconv (1,
- WEECHAT_INTERNAL_CHARSET,
- (charset && charset[0]) ?
- charset : local_charset,
- input);
- free (input);
- return output;
- }
- return NULL;
-}
-
-/*
- * weechat_iconv_fprintf: encode to terminal charset, then call fprintf on a file
- */
-
-void
-weechat_iconv_fprintf (FILE *file, char *data, ...)
-{
- va_list argptr;
- static char buf[4096];
- char *buf2;
-
- va_start (argptr, data);
- vsnprintf (buf, sizeof (buf) - 1, data, argptr);
- va_end (argptr);
-
- buf2 = weechat_iconv_from_internal (NULL, buf);
- fprintf (file, "%s", (buf2) ? buf2 : buf);
- if (buf2)
- free (buf2);
-}
-
-/*
- * weechat_strreplace: replace a string by new one in a string
- * note: returned value has to be free() after use
- */
-
-char *
-weechat_strreplace (char *string, char *search, char *replace)
-{
- char *pos, *new_string;
- int length1, length2, length_new, count;
-
- if (!string || !search || !replace)
- return NULL;
-
- length1 = strlen (search);
- length2 = strlen (replace);
-
- /* count number of strings to replace */
- count = 0;
- pos = string;
- while (pos && pos[0] && (pos = strstr (pos, search)))
- {
- count++;
- pos += length1;
- }
-
- /* easy: no string to replace! */
- if (count == 0)
- return strdup (string);
-
- /* compute needed memory for new string */
- length_new = strlen (string) - (count * length1) + (count * length2) + 1;
-
- /* allocate new string */
- new_string = (char *)malloc (length_new * sizeof (char));
- if (!new_string)
- return strdup (string);
-
- /* replace all occurences */
- new_string[0] = '\0';
- while (string && string[0])
- {
- pos = strstr (string, search);
- if (pos)
- {
- strncat (new_string, string, pos - string);
- strcat (new_string, replace);
- pos += length1;
- }
- else
- strcat (new_string, string);
- string = pos;
- }
- return new_string;
-}
-
-/*
- * weechat_convert_hex_chars: convert hex chars (\x??) to value
- */
-
-char *
-weechat_convert_hex_chars (char *string)
-{
- char *output, hex_str[8], *error;
- int pos_output;
- long number;
-
- output = (char *)malloc (strlen (string) + 1);
- if (output)
- {
- pos_output = 0;
- while (string && string[0])
- {
- if (string[0] == '\\')
- {
- string++;
- switch (string[0])
- {
- case '\\':
- output[pos_output++] = '\\';
- string++;
- break;
- case 'x':
- case 'X':
- if (isxdigit (string[1])
- && isxdigit (string[2]))
- {
- snprintf (hex_str, sizeof (hex_str),
- "0x%c%c", string[1], string[2]);
- number = strtol (hex_str, &error, 16);
- if ((error) && (error[0] == '\0'))
- {
- output[pos_output++] = number;
- string += 3;
- }
- else
- {
- output[pos_output++] = '\\';
- output[pos_output++] = string[0];
- string++;
- }
- }
- else
- {
- output[pos_output++] = string[0];
- string++;
- }
- break;
- default:
- output[pos_output++] = '\\';
- output[pos_output++] = string[0];
- string++;
- break;
- }
- }
- else
- {
- output[pos_output++] = string[0];
- string++;
- }
- }
- output[pos_output] = '\0';
- }
-
- return output;
-}
-
-/*
- * get_timeval_diff: calculates difference between two times (return in milliseconds)
- */
-
-long
-get_timeval_diff (struct timeval *tv1, struct timeval *tv2)
-{
- long diff_sec, diff_usec;
-
- diff_sec = tv2->tv_sec - tv1->tv_sec;
- diff_usec = tv2->tv_usec - tv1->tv_usec;
-
- if (diff_usec < 0)
- {
- diff_usec += 1000000;
- diff_sec--;
- }
- return ((diff_usec / 1000) + (diff_sec * 1000));
-}
-
-/*
- * explode_string: explode a string according to separators
- */
-
-char **
-explode_string (char *string, char *separators, int num_items_max,
- int *num_items)
-{
- int i, n_items;
- char **array;
- char *ptr, *ptr1, *ptr2;
-
- if (num_items != NULL)
- *num_items = 0;
-
- if (!string || !string[0])
- return NULL;
-
- /* calculate number of items */
- ptr = string;
- i = 1;
- while ((ptr = strpbrk (ptr, separators)))
- {
- while (strchr (separators, ptr[0]) != NULL)
- ptr++;
- i++;
- }
- n_items = i;
-
- if ((num_items_max != 0) && (n_items > num_items_max))
- n_items = num_items_max;
-
- array =
- (char **) malloc ((n_items + 1) * sizeof (char *));
-
- ptr1 = string;
- ptr2 = string;
-
- for (i = 0; i < n_items; i++)
- {
- while (strchr (separators, ptr1[0]) != NULL)
- ptr1++;
- if (i == (n_items - 1) || (ptr2 = strpbrk (ptr1, separators)) == NULL)
- if ((ptr2 = strchr (ptr1, '\r')) == NULL)
- if ((ptr2 = strchr (ptr1, '\n')) == NULL)
- ptr2 = strchr (ptr1, '\0');
-
- if ((ptr1 == NULL) || (ptr2 == NULL))
- {
- array[i] = NULL;
- }
- else
- {
- if (ptr2 - ptr1 > 0)
- {
- array[i] =
- (char *) malloc ((ptr2 - ptr1 + 1) * sizeof (char));
- array[i] = strncpy (array[i], ptr1, ptr2 - ptr1);
- array[i][ptr2 - ptr1] = '\0';
- ptr1 = ++ptr2;
- }
- else
- {
- array[i] = NULL;
- }
- }
- }
-
- array[i] = NULL;
- if (num_items != NULL)
- *num_items = i;
-
- return array;
-}
-
-/*
- * free_exploded_string: free an exploded string
- */
-
-void
-free_exploded_string (char **exploded_string)
-{
- int i;
-
- if (exploded_string)
- {
- for (i = 0; exploded_string[i]; i++)
- free (exploded_string[i]);
- free (exploded_string);
- }
-}
-
-/*
- * split_multi_command: split a list of commands separated by 'sep'
- * and ecscaped with '\'
- * - empty commands are removed
- * - spaces on the left of each commands are stripped
- * Result must be freed with free_multi_command
- */
-
-char **
-split_multi_command (char *command, char sep)
-{
- int nb_substr, arr_idx, str_idx, type;
- char **array;
- char *buffer, *ptr, *p;
-
- if (command == NULL)
- return NULL;
-
- nb_substr = 1;
- ptr = command;
- while ( (p = strchr(ptr, sep)) != NULL)
- {
- nb_substr++;
- ptr = ++p;
- }
-
- array = (char **) malloc ((nb_substr + 1) * sizeof(char *));
- if (!array)
- return NULL;
-
- buffer = (char *) malloc ( (strlen(command) + 1) * sizeof (char));
- if (!buffer)
- {
- free (array);
- return NULL;
- }
-
- ptr = command;
- str_idx = 0;
- arr_idx = 0;
- while(*ptr != '\0')
- {
- type = 0;
- if (*ptr == ';')
- {
- if (ptr == command)
- type = 1;
- else if ( *(ptr-1) != '\\')
- type = 1;
- else if ( *(ptr-1) == '\\')
- type = 2;
- }
- if (type == 1)
- {
- buffer[str_idx] = '\0';
- str_idx = -1;
- p = buffer;
- /* strip white spaces a the begining of the line */
- while (*p == ' ') p++;
- if (p && p[0])
- array[arr_idx++] = strdup (p);
- }
- else if (type == 2)
- buffer[--str_idx] = *ptr;
- else
- buffer[str_idx] = *ptr;
- str_idx++;
- ptr++;
- }
-
- buffer[str_idx] = '\0';
- p = buffer;
- while (*p == ' ') p++;
- if (p && p[0])
- array[arr_idx++] = strdup (p);
-
- array[arr_idx] = NULL;
-
- free (buffer);
-
- array = (char **) realloc (array, (arr_idx + 1) * sizeof(char *));
-
- return array;
-}
-
-/*
- * free_multi_command : free a list of commands splitted
- * with split_multi_command
- */
-
-void
-free_multi_command (char **commands)
-{
- int i;
-
- if (commands)
- {
- for (i = 0; commands[i]; i++)
- free (commands[i]);
- free (commands);
- }
-}
diff --git a/src/common/util.h b/src/common/util.h
deleted file mode 100644
index e3ec09e38..000000000
--- a/src/common/util.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_UTIL_H
-#define __WEECHAT_UTIL_H 1
-
-#ifndef HAVE_STRNDUP
-extern char *strndup (char *, int);
-#endif
-extern void ascii_tolower (char *);
-extern void ascii_toupper (char *);
-extern int ascii_strcasecmp (char *, char *);
-extern int ascii_strncasecmp (char *, char *, int);
-extern char *ascii_strcasestr (char *, char *);
-extern char *weechat_iconv (char *, char *, char *);
-extern char *weechat_iconv_to_internal (char *, char *);
-extern char *weechat_iconv_from_internal (char *, char *);
-extern void weechat_iconv_fprintf (FILE *, char *, ...);
-extern char *weechat_strreplace (char *, char *, char *);
-extern char *weechat_convert_hex_chars (char *);
-extern long get_timeval_diff (struct timeval *, struct timeval *);
-extern char **explode_string (char *, char *, int, int *);
-extern void free_exploded_string (char **);
-
-#endif /* util.h */
diff --git a/src/common/weechat.c b/src/common/weechat.c
deleted file mode 100644
index 60fc100e1..000000000
--- a/src/common/weechat.c
+++ /dev/null
@@ -1,884 +0,0 @@
-/* ############################################################################
- * ### ___ __ ______________ _____ ###
- * ### __ | / /___________ ____/__ /_______ __ /_ ###
- * ### __ | /| / /_ _ \ _ \ / __ __ \ __ `/ __/ ###
- * ### __ |/ |/ / / __/ __/ /___ _ / / / /_/ // /_ ###
- * ### ____/|__/ \___/\___/\____/ /_/ /_/\__,_/ \__/ ###
- * ### ###
- * ### WeeChat - Wee Enhanced Environment for Chat ###
- * ### Fast & light environment for Chat ###
- * ### ###
- * ### By FlashCode <flashcode@flashtux.org> ###
- * ### ###
- * ### http://weechat.flashtux.org ###
- * ### ###
- * ############################################################################
- *
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* weechat.c: core functions for WeeChat */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <signal.h>
-
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
-#ifdef HAVE_LANGINFO_CODESET
-#include <langinfo.h>
-#endif
-
-#include "weechat.h"
-#include "alias.h"
-#include "backtrace.h"
-#include "command.h"
-#include "fifo.h"
-#include "hotlist.h"
-#include "log.h"
-#include "session.h"
-#include "utf8.h"
-#include "util.h"
-#include "weeconfig.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-#ifdef PLUGINS
-#include "../plugins/plugins.h"
-#endif
-
-
-char *weechat_argv0 = NULL; /* WeeChat binary file name (argv[0]) */
-char *weechat_session = NULL; /* WeeChat session file (for /upgrade cmd) */
-time_t weechat_start_time; /* WeeChat start time (used by /uptime cmd) */
-int quit_weechat; /* = 1 if quit request from user... why ? :'( */
-int sigsegv = 0; /* SIGSEGV received? */
-char *weechat_home = NULL; /* WeeChat home dir. (default: ~/.weechat) */
-
-char *local_charset = NULL; /* local charset, for ex.: ISO-8859-1, UTF-8 */
-
-int server_cmd_line; /* at least 1 server on WeeChat command line */
-int auto_connect; /* enabled by default (cmd option to disable) */
-int auto_load_plugins; /* enabled by default (cmd option to disable) */
-
-#ifdef HAVE_GNUTLS
-gnutls_certificate_credentials gnutls_xcred; /* gnutls client credentials */
-#endif
-
-
-/*
- * weechat_display_usage: display WeeChat usage
- */
-
-void
-weechat_display_usage (char *exec_name)
-{
- weechat_iconv_fprintf (stdout, "\n");
- weechat_iconv_fprintf (stdout,
- _("%s (c) Copyright 2003-2007, compiled on %s %s\n"
- "Developed by FlashCode <flashcode@flashtux.org> - %s"),
- PACKAGE_STRING, __DATE__, __TIME__, WEECHAT_WEBSITE);
- weechat_iconv_fprintf (stdout, "\n\n");
- weechat_iconv_fprintf (stdout,
- _("Usage: %s [options ...]\n" \
- " or: %s [irc[6][s]://[nickname[:password]@]irc.example.org[:port][/channel][,channel[...]]"),
- exec_name, exec_name);
- weechat_iconv_fprintf (stdout, "\n\n");
- weechat_iconv_fprintf (stdout,
- _(" -a, --no-connect disable auto-connect to servers at startup\n"
- " -c, --config display config file options\n"
- " -d, --dir <path> set WeeChat home directory (default: ~/.weechat)\n"
- " -f, --key-functions display WeeChat internal functions for keys\n"
- " -h, --help this help\n"
- " -i, --irc-commands display IRC commands\n"
- " -k, --keys display WeeChat default keys\n"
- " -l, --license display WeeChat license\n"
- " -p, --no-plugin don't load any plugin at startup\n"
- " -v, --version display WeeChat version\n"
- " -w, --weechat-commands display WeeChat commands\n"));
- weechat_iconv_fprintf(stdout, "\n");
-}
-
-/*
- * weechat_display_config_options: display config options
- */
-
-void
-weechat_display_config_options ()
-{
- int i, j, k;
-
- weechat_iconv_fprintf (stdout,
- _("WeeChat configuration options (<weechat_home>/weechat.rc):\n\n"));
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if (weechat_options[i])
- {
- j = 0;
- while (weechat_options[i][j].option_name)
- {
- weechat_iconv_fprintf (stdout,
- "* %s:\n",
- weechat_options[i][j].option_name);
- switch (weechat_options[i][j].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- weechat_iconv_fprintf (stdout, _(" . type: boolean\n"));
- weechat_iconv_fprintf (stdout, _(" . values: 'on' or 'off'\n"));
- weechat_iconv_fprintf (stdout, _(" . default value: '%s'\n"),
- (weechat_options[i][j].default_int == BOOL_TRUE) ?
- "on" : "off");
- break;
- case OPTION_TYPE_INT:
- weechat_iconv_fprintf (stdout, _(" . type: integer\n"));
- weechat_iconv_fprintf (stdout, _(" . values: between %d and %d\n"),
- weechat_options[i][j].min,
- weechat_options[i][j].max);
- weechat_iconv_fprintf (stdout, _(" . default value: %d\n"),
- weechat_options[i][j].default_int);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- weechat_iconv_fprintf (stdout, _(" . type: string\n"));
- weechat_iconv_fprintf (stdout, _(" . values: "));
- k = 0;
- while (weechat_options[i][j].array_values[k])
- {
- weechat_iconv_fprintf (stdout, "'%s'",
- weechat_options[i][j].array_values[k]);
- if (weechat_options[i][j].array_values[k + 1])
- weechat_iconv_fprintf (stdout, ", ");
- k++;
- }
- weechat_iconv_fprintf (stdout, "\n");
- weechat_iconv_fprintf (stdout, _(" . default value: '%s'\n"),
- (weechat_options[i][j].default_string) ?
- weechat_options[i][j].default_string : _("empty"));
- break;
- case OPTION_TYPE_COLOR:
- weechat_iconv_fprintf (stdout, _(" . type: color\n"));
- weechat_iconv_fprintf (stdout, _(" . values: Curses or Gtk color\n"));
- weechat_iconv_fprintf (stdout, _(" . default value: '%s'\n"),
- (weechat_options[i][j].default_string) ?
- weechat_options[i][j].default_string : _("empty"));
- break;
- case OPTION_TYPE_STRING:
- switch (weechat_options[i][j].max)
- {
- case 0:
- weechat_iconv_fprintf (stdout, _(" . type: string\n"));
- weechat_iconv_fprintf (stdout, _(" . values: any string\n"));
- break;
- case 1:
- weechat_iconv_fprintf (stdout, _(" . type: char\n"));
- weechat_iconv_fprintf (stdout, _(" . values: any char\n"));
- break;
- default:
- weechat_iconv_fprintf (stdout, _(" . type: string\n"));
- weechat_iconv_fprintf (stdout, _(" . values: any string (limit: %d chars)\n"),
- weechat_options[i][j].max);
- break;
- }
- weechat_iconv_fprintf (stdout, _(" . default value: '%s'\n"),
- (weechat_options[i][j].default_string) ?
- weechat_options[i][j].default_string : _("empty"));
- break;
- }
- weechat_iconv_fprintf (stdout, _(" . description: %s\n"),
- _(weechat_options[i][j].long_description));
- weechat_iconv_fprintf (stdout, "\n");
- j++;
- }
- }
- }
-}
-
-/*
- * weechat_display_commands: display WeeChat and/or IRC commands
- */
-
-void
-weechat_display_commands (int weechat_cmd, int irc_cmd)
-{
- int i;
-
- if (weechat_cmd)
- {
- weechat_iconv_fprintf (stdout,
- _("%s internal commands:\n"), PACKAGE_NAME);
- weechat_iconv_fprintf (stdout, "\n");
- for (i = 0; weechat_commands[i].command_name; i++)
- {
- weechat_iconv_fprintf (stdout, "* %s", weechat_commands[i].command_name);
- if (weechat_commands[i].arguments &&
- weechat_commands[i].arguments[0])
- weechat_iconv_fprintf (stdout, " %s\n\n", _(weechat_commands[i].arguments));
- else
- weechat_iconv_fprintf (stdout, "\n\n");
- weechat_iconv_fprintf (stdout, "%s\n\n", _(weechat_commands[i].command_description));
- if (weechat_commands[i].arguments_description &&
- weechat_commands[i].arguments_description[0])
- weechat_iconv_fprintf (stdout, "%s\n\n",
- _(weechat_commands[i].arguments_description));
- }
- }
-
- if (irc_cmd)
- {
- weechat_iconv_fprintf (stdout, _("IRC commands:\n"));
- weechat_iconv_fprintf (stdout, "\n");
- for (i = 0; irc_commands[i].command_name; i++)
- {
- if (irc_commands[i].cmd_function_args ||
- irc_commands[i].cmd_function_1arg)
- {
- weechat_iconv_fprintf (stdout, "* %s", irc_commands[i].command_name);
- if (irc_commands[i].arguments &&
- irc_commands[i].arguments[0])
- weechat_iconv_fprintf (stdout, " %s\n\n", _(irc_commands[i].arguments));
- else
- weechat_iconv_fprintf (stdout, "\n\n");
- weechat_iconv_fprintf (stdout, "%s\n\n", _(irc_commands[i].command_description));
- if (irc_commands[i].arguments_description &&
- irc_commands[i].arguments_description[0])
- weechat_iconv_fprintf (stdout, "%s\n\n",
- _(irc_commands[i].arguments_description));
- }
- }
- }
-}
-
-/*
- * weechat_display_key_functions: display WeeChat key functions
- */
-
-void
-weechat_display_key_functions ()
-{
- int i;
-
- weechat_iconv_fprintf (stdout, _("Internal key functions:\n"));
- weechat_iconv_fprintf (stdout, "\n");
- i = 0;
- while (gui_key_functions[i].function_name)
- {
- weechat_iconv_fprintf (stdout,
- "* %s: %s\n",
- gui_key_functions[i].function_name,
- _(gui_key_functions[i].description));
- i++;
- }
-}
-
-/*
- * weechat_display_keys: display WeeChat default keys
- */
-
-void
-weechat_display_keys ()
-{
- t_gui_key *ptr_key;
- char *expanded_name;
-
- weechat_iconv_fprintf (stdout,
- _("%s default keys:\n"), PACKAGE_NAME);
- weechat_iconv_fprintf (stdout, "\n");
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
- {
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
- weechat_iconv_fprintf (stdout,
- "* %s => %s\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- (ptr_key->function) ? gui_keyboard_function_search_by_ptr (ptr_key->function) : ptr_key->command);
- if (expanded_name)
- free (expanded_name);
- }
-}
-
-/*
- * weechat_parse_args: parse command line args
- */
-
-void
-weechat_parse_args (int argc, char *argv[])
-{
- int i;
- t_irc_server server_tmp;
-
- weechat_argv0 = strdup (argv[0]);
- weechat_session = NULL;
- weechat_home = NULL;
- server_cmd_line = 0;
- auto_connect = 1;
- auto_load_plugins = 1;
-
- for (i = 1; i < argc; i++)
- {
- if ((strcmp (argv[i], "-a") == 0)
- || (strcmp (argv[i], "--no-connect") == 0))
- auto_connect = 0;
- else if ((strcmp (argv[i], "-c") == 0)
- || (strcmp (argv[i], "--config") == 0))
- {
- weechat_display_config_options ();
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-d") == 0)
- || (strcmp (argv[i], "--dir") == 0))
- {
- if (i + 1 < argc)
- weechat_home = strdup (argv[++i]);
- else
- {
- weechat_iconv_fprintf (stderr,
- _("%s missing argument for --dir option\n"),
- WEECHAT_ERROR);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
- }
- else if ((strcmp (argv[i], "-f") == 0)
- || (strcmp (argv[i], "--key-functions") == 0))
- {
- weechat_display_key_functions ();
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-h") == 0)
- || (strcmp (argv[i], "--help") == 0))
- {
- weechat_display_usage (argv[0]);
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-i") == 0)
- || (strcmp (argv[i], "--irc-commands") == 0))
- {
- weechat_display_commands (0, 1);
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-k") == 0)
- || (strcmp (argv[i], "--keys") == 0))
- {
- weechat_display_keys ();
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-l") == 0)
- || (strcmp (argv[i], "--license") == 0))
- {
- weechat_iconv_fprintf (stdout, "\n%s%s", WEE_LICENSE);
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-p") == 0)
- || (strcmp (argv[i], "--no-plugin") == 0))
- auto_load_plugins = 0;
- else if (strcmp (argv[i], "--session") == 0)
- {
- if (i + 1 < argc)
- weechat_session = strdup (argv[++i]);
- else
- {
- weechat_iconv_fprintf (stderr,
- _("%s missing argument for --session option\n"),
- WEECHAT_ERROR);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
- }
- else if ((strcmp (argv[i], "-v") == 0)
- || (strcmp (argv[i], "--version") == 0))
- {
- weechat_iconv_fprintf (stdout, PACKAGE_VERSION "\n");
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((strcmp (argv[i], "-w") == 0)
- || (strcmp (argv[i], "--weechat-commands") == 0))
- {
- weechat_display_commands (1, 0);
- weechat_shutdown (EXIT_SUCCESS, 0);
- }
- else if ((ascii_strncasecmp (argv[i], "irc", 3) == 0))
- {
- if (irc_server_init_with_url (argv[i], &server_tmp) < 0)
- {
- weechat_iconv_fprintf (stderr,
- _("%s invalid syntax for IRC server ('%s'), ignored\n"),
- WEECHAT_WARNING, argv[i]);
- }
- else
- {
- if (!irc_server_new (server_tmp.name, server_tmp.autoconnect,
- server_tmp.autoreconnect,
- server_tmp.autoreconnect_delay,
- 1, server_tmp.address, server_tmp.port,
- server_tmp.ipv6, server_tmp.ssl,
- server_tmp.password, server_tmp.nick1,
- server_tmp.nick2, server_tmp.nick3,
- NULL, NULL, NULL, NULL, 0,
- server_tmp.autojoin, 1, NULL))
- weechat_iconv_fprintf (stderr,
- _("%s unable to create server ('%s'), ignored\n"),
- WEECHAT_WARNING, argv[i]);
- irc_server_destroy (&server_tmp);
- server_cmd_line = 1;
- }
- }
- else
- {
- weechat_iconv_fprintf (stderr,
- _("%s unknown parameter '%s', ignored\n"),
- WEECHAT_WARNING, argv[i]);
- }
- }
-}
-
-/*
- * weechat_create_dir: create a directory
- * return: 1 if ok (or directory already exists)
- * 0 if error
- */
-
-int
-weechat_create_dir (char *directory, int permissions)
-{
- if (mkdir (directory, 0755) < 0)
- {
- /* exit if error (except if directory already exists) */
- if (errno != EEXIST)
- {
- weechat_iconv_fprintf (stderr, _("%s cannot create directory \"%s\"\n"),
- WEECHAT_ERROR, directory);
- return 0;
- }
- return 1;
- }
- if ((permissions != 0) && (strcmp (directory, getenv ("HOME")) != 0))
- chmod (directory, permissions);
- return 1;
-}
-
-/*
- * weechat_create_home_dirs: create WeeChat directories
- */
-
-void
-weechat_create_home_dirs ()
-{
- char *ptr_home;
- int dir_length;
- struct stat statinfo;
-
- if (!weechat_home)
- {
- ptr_home = getenv ("HOME");
- if (!ptr_home)
- {
- weechat_iconv_fprintf (stderr, _("%s unable to get HOME directory\n"),
- WEECHAT_ERROR);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
- dir_length = strlen (ptr_home) + 10;
- weechat_home =
- (char *) malloc (dir_length * sizeof (char));
- if (!weechat_home)
- {
- weechat_iconv_fprintf (stderr, _("%s not enough memory for home directory\n"),
- WEECHAT_ERROR);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
- snprintf (weechat_home, dir_length, "%s%s.weechat", ptr_home,
- DIR_SEPARATOR);
- }
-
- /* if home already exists, it has to be a directory */
- if (stat (weechat_home, &statinfo) == 0)
- {
- if (!S_ISDIR (statinfo.st_mode))
- {
- weechat_iconv_fprintf (stderr, _("%s home (%s) is not a directory\n"),
- WEECHAT_ERROR, weechat_home);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
- }
-
- /* create home directory; error is fatal */
- if (!weechat_create_dir (weechat_home, 0))
- {
- weechat_iconv_fprintf (stderr, _("%s unable to create \"%s\" directory\n"),
- WEECHAT_ERROR, weechat_home);
- weechat_shutdown (EXIT_FAILURE, 0);
- }
-}
-
-/*
- * weechat_create_config_dirs: create config directories (read from config file)
- */
-
-void
-weechat_create_config_dirs ()
-{
- char *dir1, *dir2;
-
- /* create logs directory" */
- dir1 = weechat_strreplace (cfg_log_path, "~", getenv ("HOME"));
- dir2 = weechat_strreplace (dir1, "%h", weechat_home);
- (void) weechat_create_dir (dir2, 0700);
- if (dir1)
- free (dir1);
- if (dir2)
- free (dir2);
-
- /* create DCC download directory */
- dir1 = weechat_strreplace (cfg_dcc_download_path, "~", getenv ("HOME"));
- dir2 = weechat_strreplace (dir1, "%h", weechat_home);
- (void) weechat_create_dir (dir2, 0700);
- if (dir1)
- free (dir1);
- if (dir2)
- free (dir2);
-}
-
-/*
- * weechat_init_vars: initialize some variables
- */
-
-void
-weechat_init_vars ()
-{
- /* start time, used by /uptime command */
- weechat_start_time = time (NULL);
-
- /* init gnutls */
-#ifdef HAVE_GNUTLS
- gnutls_global_init ();
- gnutls_certificate_allocate_credentials (&gnutls_xcred);
- gnutls_certificate_set_x509_trust_file (gnutls_xcred, "ca.pem", GNUTLS_X509_FMT_PEM);
-#endif
-}
-
-/*
- * weechat_config_read: read WeeChat config file
- */
-
-void
-weechat_config_read ()
-{
- switch (config_read ())
- {
- case 0: /* read ok */
- break;
- case -1: /* config file not found */
- if (config_create_default () < 0)
- exit (EXIT_FAILURE);
- if (config_read () != 0)
- exit (EXIT_FAILURE);
- break;
- default: /* other error (fatal) */
- irc_server_free_all ();
- exit (EXIT_FAILURE);
- }
-}
-
-/*
- * weechat_welcome_message: display WeeChat welcome message - yeah!
- */
-
-void
-weechat_welcome_message ()
-{
- if (cfg_look_startup_logo)
- {
- gui_printf (NULL,
- "%s ___ __ ______________ _____ \n"
- "%s __ | / /___________ ____/__ /_______ __ /_\n"
- "%s __ | /| / /_ _ \\ _ \\ / __ __ \\ __ `/ __/\n"
- "%s __ |/ |/ / / __/ __/ /___ _ / / / /_/ // /_ \n"
- "%s ____/|__/ \\___/\\___/\\____/ /_/ /_/\\__,_/ \\__/ \n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK),
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK));
- }
- if (cfg_look_weechat_slogan && cfg_look_weechat_slogan[0])
- {
- gui_printf (NULL, _("%sWelcome to %s%s%s, %s\n"),
- (cfg_look_startup_logo) ? " " : "",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- PACKAGE_NAME,
- GUI_NO_COLOR,
- cfg_look_weechat_slogan);
- }
- if (cfg_look_startup_version)
- {
- gui_printf (NULL, "%s%s%s%s, %s %s %s\n",
- (cfg_look_startup_logo) ? " " : "",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_CHANNEL),
- PACKAGE_STRING,
- GUI_NO_COLOR,
- _("compiled on"), __DATE__, __TIME__);
- }
- if (cfg_look_startup_logo ||
- (cfg_look_weechat_slogan && cfg_look_weechat_slogan[0]) ||
- cfg_look_startup_version)
- gui_printf (NULL,
- "%s-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n",
- GUI_COLOR(GUI_COLOR_WIN_CHAT_NICK));
-
- weechat_log_printf ("%s (%s %s %s)\n",
- PACKAGE_STRING, _("compiled on"), __DATE__, __TIME__);
-}
-
-/*
- * weechat_shutdown: shutdown WeeChat
- */
-
-void
-weechat_shutdown (int return_code, int crash)
-{
- if (weechat_argv0)
- free (weechat_argv0);
- fifo_remove ();
- if (weechat_home)
- free (weechat_home);
- weechat_log_close ();
- if (local_charset)
- free (local_charset);
- alias_free_all ();
-
-#ifdef HAVE_GNUTLS
- gnutls_certificate_free_credentials (gnutls_xcred);
- gnutls_global_deinit();
-#endif
-
- if (crash)
- abort();
- else
- exit (return_code);
-}
-
-/*
- * weechat_dump: write dump to WeeChat log file
- */
-
-void
-weechat_dump (int crash)
-{
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
- t_gui_window *ptr_window;
- t_gui_buffer *ptr_buffer;
-#ifdef PLUGINS
- t_weechat_plugin *ptr_plugin;
-#endif
-
- /* prevent reentrance */
- if (sigsegv)
- exit (EXIT_FAILURE);
-
- if (crash)
- {
- sigsegv = 1;
- weechat_log_printf ("Very bad, WeeChat is crashing (SIGSEGV received)...\n");
- }
-
- weechat_log_printf ("\n");
- if (crash)
- {
- weechat_log_printf ("****** WeeChat CRASH DUMP ******\n");
- weechat_log_printf ("****** Please send this file to WeeChat developers ******\n");
- weechat_log_printf ("****** and explain when this crash happened ******\n");
- }
- else
- {
- weechat_log_printf ("****** WeeChat dump request ******\n");
- }
-
- for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server)
- {
- weechat_log_printf ("\n");
- irc_server_print_log (ptr_server);
-
- for (ptr_channel = ptr_server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- weechat_log_printf ("\n");
- irc_channel_print_log (ptr_channel);
-
- for (ptr_nick = ptr_channel->nicks; ptr_nick;
- ptr_nick = ptr_nick->next_nick)
- {
- weechat_log_printf ("\n");
- irc_nick_print_log (ptr_nick);
- }
-
- }
- }
-
- irc_dcc_print_log ();
-
- gui_panel_print_log ();
-
- weechat_log_printf ("\n");
- weechat_log_printf ("[windows/buffers]\n");
- weechat_log_printf (" => windows:\n");
- for (ptr_window = gui_windows; ptr_window; ptr_window = ptr_window->next_window)
- {
- weechat_log_printf (" 0x%X\n", ptr_window);
- }
- weechat_log_printf (" => buffers:\n");
- for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
- {
- weechat_log_printf (" 0x%X\n", ptr_buffer);
- }
- weechat_log_printf (" => current window = 0x%X\n", gui_current_window);
-
- for (ptr_window = gui_windows; ptr_window; ptr_window = ptr_window->next_window)
- {
- weechat_log_printf ("\n");
- gui_window_print_log (ptr_window);
- }
-
- for (ptr_buffer = gui_buffers; ptr_buffer;
- ptr_buffer = ptr_buffer->next_buffer)
- {
- weechat_log_printf ("\n");
- gui_buffer_print_log (ptr_buffer);
- }
-
- weechat_log_printf ("\n");
- irc_ignore_print_log ();
-
- weechat_log_printf ("\n");
- hotlist_print_log ();
-
-#ifdef PLUGINS
- for (ptr_plugin = weechat_plugins; ptr_plugin;
- ptr_plugin = ptr_plugin->next_plugin)
- {
- weechat_log_printf ("\n");
- plugin_print_log (ptr_plugin);
- }
-#endif
-
- weechat_log_printf ("\n");
- weechat_log_printf ("****** End of dump ******\n");
- weechat_log_printf ("\n");
-}
-
-/*
- * weechat_sigsegv: SIGSEGV handler: save crash log to <weechat_home>/weechat.log and exit
- */
-
-void
-weechat_sigsegv ()
-{
- weechat_dump (1);
- irc_dcc_end ();
- irc_server_free_all ();
- gui_main_end ();
-
- weechat_iconv_fprintf (stderr, "\n");
- weechat_iconv_fprintf (stderr, "*** Very bad! WeeChat is crashing (SIGSEGV received)\n");
- if (!weechat_log_crash_rename ())
- weechat_iconv_fprintf (stderr,
- "*** Full crash dump was saved to %s/weechat.log file.\n",
- weechat_home);
- weechat_iconv_fprintf (stderr, "***\n");
- weechat_iconv_fprintf (stderr, "*** Please help WeeChat developers to fix this bug:\n");
- weechat_iconv_fprintf (stderr, "*** 1. If you have a core file, please run: gdb weechat-curses core\n");
- weechat_iconv_fprintf (stderr, "*** then issue \"bt\" command and send result to developers\n");
- weechat_iconv_fprintf (stderr, "*** To enable core files with bash shell: ulimit -c 10000\n");
- weechat_iconv_fprintf (stderr, "*** 2. Otherwise send backtrace (below) and weechat.log\n");
- weechat_iconv_fprintf (stderr, "*** (be careful, private info may be in this file since\n");
- weechat_iconv_fprintf (stderr, "*** part of chats are displayed, so remove lines if needed)\n\n");
-
- weechat_backtrace ();
-
- /* shutdown with error code */
- weechat_shutdown (EXIT_FAILURE, 1);
-}
-
-/*
- * main: WeeChat startup
- */
-
-int
-main (int argc, char *argv[])
-{
- setlocale (LC_ALL, ""); /* initialize gettext */
-#ifdef ENABLE_NLS
- bindtextdomain (PACKAGE, LOCALEDIR);
- bind_textdomain_codeset (PACKAGE, "UTF-8");
- textdomain (PACKAGE);
-#endif
-
-#ifdef HAVE_LANGINFO_CODESET
- local_charset = strdup (nl_langinfo (CODESET));
-#else
- local_charset = strdup ("");
-#endif
- utf8_init ();
-
- signal (SIGINT, SIG_IGN); /* ignore SIGINT signal */
- signal (SIGQUIT, SIG_IGN); /* ignore SIGQUIT signal */
- signal (SIGPIPE, SIG_IGN); /* ignore SIGPIPE signal */
- signal (SIGSEGV, weechat_sigsegv); /* crash dump when SIGSEGV received */
- gui_main_pre_init (&argc, &argv); /* pre-initiliaze interface */
- weechat_init_vars (); /* initialize some variables */
- gui_keyboard_init (); /* init keyb. (default key bindings)*/
- weechat_parse_args (argc, argv); /* parse command line args */
- weechat_create_home_dirs (); /* create WeeChat directories */
- weechat_log_init (); /* init log file */
- command_index_build (); /* build cmd index for completion */
- weechat_config_read (); /* read configuration */
- weechat_create_config_dirs (); /* create config directories */
- gui_main_init (); /* init WeeChat interface */
- fifo_create (); /* FIFO pipe for remote control */
- if (weechat_session)
- session_load (weechat_session); /* load previous session if asked */
- weechat_welcome_message (); /* display WeeChat welcome message */
-#ifdef PLUGINS
- plugin_init (auto_load_plugins); /* init plugin interface(s) */
-#endif
-
- irc_server_auto_connect (auto_connect, /* auto-connect to servers */
- server_cmd_line);
-
- gui_main_loop (); /* WeeChat main loop */
-
-#ifdef PLUGINS
- plugin_end (); /* end plugin interface(s) */
-#endif
- irc_server_disconnect_all (); /* disconnect from all servers */
- if (cfg_look_save_on_exit)
- (void) config_write (NULL); /* save config file */
- command_index_free (); /* free commands index */
- irc_dcc_end (); /* remove all DCC */
- irc_server_free_all (); /* free all servers */
- gui_main_end (); /* shut down WeeChat GUI */
- weechat_shutdown (EXIT_SUCCESS, 0); /* quit WeeChat (oh no, why?) */
-
- return EXIT_SUCCESS; /* make C compiler happy */
-}
diff --git a/src/common/weechat.h b/src/common/weechat.h
deleted file mode 100644
index 34e95a50e..000000000
--- a/src/common/weechat.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_H
-#define __WEECHAT_H 1
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-#include <sys/time.h>
-
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
-#include <locale.h>
-
-#if defined(ENABLE_NLS) && !defined(_)
- #ifdef HAVE_LIBINTL_H
- #include <libintl.h>
- #else
- #include "../../intl/libintl.h"
- #endif
- #define _(string) gettext(string)
- #define NG_(single,plural,number) ngettext(single,plural,number)
- #ifdef gettext_noop
- #define N_(string) gettext_noop(string)
- #else
- #define N_(string) (string)
- #endif
-#endif
-#if !defined(_)
- #define _(string) (string)
- #define NG_(single,plural,number) (plural)
- #define N_(string) (string)
-#endif
-
-
-#define WEECHAT_COPYRIGHT_DATE "(c) 2003-2007"
-#define WEECHAT_WEBSITE "http://weechat.flashtux.org"
-
-#define WEECHAT_ERROR _("WeeChat Error:")
-#define WEECHAT_WARNING _("WeeChat Warning:")
-
-/* log file */
-
-#define WEECHAT_LOG_NAME "weechat.log"
-
-/* license */
-
-#define WEE_LICENSE \
- PACKAGE_STRING " (c) Copyright 2003-2007, compiled on " __DATE__ " " __TIME__ \
- "\nDeveloped by FlashCode <flashcode@flashtux.org> - " WEECHAT_WEBSITE "\n\n" \
- "This program is free software; you can redistribute it and/or modify\n" \
- "it under the terms of the GNU General Public License as published by\n" \
- "the Free Software Foundation; either version 3 of the License, or\n" \
- "(at your option) any later version.\n" \
- "\n", \
- \
- "This program is distributed in the hope that it will be useful,\n" \
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
- "GNU General Public License for more details.\n" \
- "\n" \
- "You should have received a copy of the GNU General Public License\n" \
- "along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
-
-/* directory separator, depending on OS */
-
-#ifdef _WIN32
- #define DIR_SEPARATOR "\\"
- #define DIR_SEPARATOR_CHAR '\\'
-#else
- #define DIR_SEPARATOR "/"
- #define DIR_SEPARATOR_CHAR '/'
-#endif
-
-/* some systems (like GNU/Hurd) doesn't define PATH_MAX */
-
-#ifndef PATH_MAX
- #define PATH_MAX 4096
-#endif
-
-/* internal charset */
-
-#define WEECHAT_INTERNAL_CHARSET "UTF-8"
-
-/* global variables and functions */
-
-extern char *weechat_argv0;
-extern time_t weechat_start_time;
-extern int quit_weechat;
-extern char *weechat_home;
-extern char *local_charset;
-
-#ifdef HAVE_GNUTLS
-extern gnutls_certificate_credentials gnutls_xcred;
-#endif
-
-extern void weechat_dump (int);
-extern void weechat_shutdown (int, int);
-
-#endif /* weechat.h */
diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c
deleted file mode 100644
index b4f1c8f46..000000000
--- a/src/common/weeconfig.c
+++ /dev/null
@@ -1,2597 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* weeconfig.c: WeeChat configuration */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include <time.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "weechat.h"
-#include "weeconfig.h"
-#include "alias.h"
-#include "command.h"
-#include "fifo.h"
-#include "hotlist.h"
-#include "log.h"
-#include "utf8.h"
-#include "util.h"
-#include "../protocols/irc/irc.h"
-#include "../gui/gui.h"
-
-
-/* config sections */
-
-t_config_section config_sections[CONFIG_NUMBER_SECTIONS] =
-{ { CONFIG_SECTION_LOOK, "look" },
- { CONFIG_SECTION_COLORS, "colors" },
- { CONFIG_SECTION_HISTORY, "history" },
- { CONFIG_SECTION_LOG, "log" },
- { CONFIG_SECTION_IRC, "irc" },
- { CONFIG_SECTION_DCC, "dcc" },
- { CONFIG_SECTION_PROXY, "proxy" },
- { CONFIG_SECTION_PLUGINS, "plugins" },
- { CONFIG_SECTION_KEYS, "keys" },
- { CONFIG_SECTION_ALIAS, "alias" },
- { CONFIG_SECTION_IGNORE, "ignore" },
- { CONFIG_SECTION_SERVER, "server" }
-};
-
-/* config, look & feel section */
-
-int cfg_look_save_on_exit;
-int cfg_look_set_title;
-int cfg_look_startup_logo;
-int cfg_look_startup_version;
-char *cfg_look_weechat_slogan;
-int cfg_look_one_server_buffer;
-int cfg_look_scroll_amount;
-int cfg_look_open_near_server;
-char *cfg_look_buffer_timestamp;
-int cfg_look_color_nicks_number;
-int cfg_look_color_actions;
-int cfg_look_nicklist;
-int cfg_look_nicklist_position;
-char *cfg_look_nicklist_position_values[] =
-{ "left", "right", "top", "bottom", NULL };
-int cfg_look_nicklist_min_size;
-int cfg_look_nicklist_max_size;
-int cfg_look_nicklist_separator;
-int cfg_look_nickmode;
-int cfg_look_nickmode_empty;
-char *cfg_look_no_nickname;
-char *cfg_look_nick_prefix;
-char *cfg_look_nick_suffix;
-int cfg_look_align_nick;
-char *cfg_look_align_nick_values[] =
-{ "none", "left", "right", NULL };
-int cfg_look_align_other;
-int cfg_look_align_size;
-int cfg_look_align_size_max;
-int cfg_look_align_text_offset;
-char *cfg_look_nick_completor;
-char *cfg_look_nick_completion_ignore;
-int cfg_look_nick_completion_smart;
-int cfg_look_nick_complete_first;
-int cfg_look_infobar;
-char *cfg_look_infobar_timestamp;
-int cfg_look_infobar_seconds;
-int cfg_look_infobar_delay_highlight;
-int cfg_look_hotlist_names_count;
-int cfg_look_hotlist_names_level;
-int cfg_look_hotlist_names_length;
-int cfg_look_hotlist_sort;
-char *cfg_look_hotlist_sort_values[] =
-{ "group_time_asc", "group_time_desc",
- "group_number_asc", "group_number_desc",
- "number_asc", "number_desc" };
-int cfg_look_day_change;
-char *cfg_look_day_change_timestamp;
-char *cfg_look_read_marker;
-char *cfg_look_input_format;
-int cfg_look_paste_max_lines;
-
-t_config_option weechat_options_look[] =
-{ { "look_save_on_exit", N_("save config file on exit"),
- N_("save config file on exit"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_save_on_exit, NULL, config_change_save_on_exit },
- { "look_set_title", N_("set title for window (terminal for Curses GUI) with name and version"),
- N_("set title for window (terminal for Curses GUI) with name and version"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_set_title, NULL, config_change_title },
- { "look_startup_logo", N_("display WeeChat logo at startup"),
- N_("display WeeChat logo at startup"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_startup_logo, NULL, config_change_noop },
- { "look_startup_version", N_("display WeeChat version at startup"),
- N_("display WeeChat version at startup"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_startup_version, NULL, config_change_noop },
- { "look_weechat_slogan", N_("WeeChat slogan"),
- N_("WeeChat slogan (if empty, slogan is not used)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "the geekest IRC client!", NULL, NULL, &cfg_look_weechat_slogan, config_change_noop },
- { "look_one_server_buffer", N_("use same buffer for all servers"),
- N_("use same buffer for all servers"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_look_one_server_buffer, NULL, config_change_one_server_buffer },
- { "look_open_near_server", N_("open new channels/privates near server"),
- N_("open new channels/privates near server"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_look_open_near_server, NULL, config_change_noop },
- { "look_scroll_amount", N_("how many lines to scroll by with scroll_up and scroll_down"),
- N_("how many lines to scroll by with scroll_up and scroll_down"),
- OPTION_TYPE_INT, 1, INT_MAX, 3,
- NULL, NULL, &cfg_look_scroll_amount, NULL, config_change_buffer_content },
- { "look_buffer_timestamp", N_("timestamp for buffers"),
- N_("timestamp for buffers"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "[%H:%M:%S]", NULL, NULL, &cfg_look_buffer_timestamp, config_change_buffer_content },
- { "look_color_nicks_number", N_("number of colors to use for nicks colors"),
- N_("number of colors to use for nicks colors"),
- OPTION_TYPE_INT, 1, 10, 10,
- NULL, NULL, &cfg_look_color_nicks_number, NULL, config_change_nicks_colors },
- { "look_color_actions", N_("display actions with different colors"),
- N_("display actions with different colors"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_color_actions, NULL, config_change_noop },
- { "look_nicklist", N_("display nicklist window"),
- N_("display nicklist window (for channel windows)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_nicklist, NULL, config_change_buffers },
- { "look_nicklist_position", N_("nicklist position"),
- N_("nicklist position (top, left, right (default), bottom)"),
- OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
- "right", cfg_look_nicklist_position_values, &cfg_look_nicklist_position, NULL, config_change_buffers },
- { "look_nicklist_min_size", N_("min size for nicklist"),
- N_("min size for nicklist (width or height, depending on look_nicklist_position "
- "(0 = no min size))"),
- OPTION_TYPE_INT, 0, 100, 0,
- NULL, NULL, &cfg_look_nicklist_min_size, NULL, config_change_buffers },
- { "look_nicklist_max_size", N_("max size for nicklist"),
- N_("max size for nicklist (width or height, depending on look_nicklist_position "
- "(0 = no max size; if min = max and > 0, then size is fixed))"),
- OPTION_TYPE_INT, 0, 100, 0,
- NULL, NULL, &cfg_look_nicklist_max_size, NULL, config_change_buffers },
- { "look_nicklist_separator", N_("separator between chat and nicklist"),
- N_("separator between chat and nicklist"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_nicklist_separator, NULL, config_change_buffers },
- { "look_no_nickname", N_("text to display instead of nick when not connected"),
- N_("text to display instead of nick when not connected"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "-cmd-", NULL, NULL, &cfg_look_no_nickname, config_change_buffer_content },
- { "look_nickmode", N_("display nick mode ((half)op/voice) before each nick"),
- N_("display nick mode ((half)op/voice) before each nick"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_nickmode, NULL, config_change_buffers },
- { "look_nickmode_empty", N_("display space if nick mode is not (half)op/voice"),
- N_("display space if nick mode is not (half)op/voice"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_look_nickmode_empty, NULL, config_change_buffers },
- { "look_nick_prefix", N_("text to display before nick in chat window"),
- N_("text to display before nick in chat window"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &cfg_look_nick_prefix, config_change_noop },
- { "look_nick_suffix", N_("text to display after nick in chat window"),
- N_("text to display after nick in chat window"),
- OPTION_TYPE_STRING, 0, 0, 0,
- " |", NULL, NULL, &cfg_look_nick_suffix, config_change_noop },
- { "look_align_nick", N_("nick alignment (fixed size for nicks in chat window)"),
- N_("nick alignment (fixed size for nicks in chat window (none, left, right))"),
- OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
- "right", cfg_look_align_nick_values, &cfg_look_align_nick, NULL, config_change_noop },
- { "look_align_other", N_("alignment for other messages (not beginning with a nick)"),
- N_("alignment for other messages (not beginning with a nick)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_align_other, NULL, config_change_noop },
- { "look_align_size", N_("size for aligning nick and other messages"),
- N_("size for aligning nick and other messages"),
- OPTION_TYPE_INT, 8, 64, 14,
- NULL, NULL, &cfg_look_align_size, NULL, config_change_noop },
- { "look_align_size_max", N_("max size for aligning nick and other messages"),
- N_("max size for aligning nick and other messages (should be >= to "
- "look_align_size)"),
- OPTION_TYPE_INT, 8, 64, 20,
- NULL, NULL, &cfg_look_align_size_max, NULL, config_change_noop },
- { "look_align_text_offset", N_("offset for aligning lines of messages "
- "(except first lines)"),
- N_("offset for aligning lines of messages (except first lines), default is "
- "-1 (align after nick), a null or positive value is offset after "
- "beginning of line"),
- OPTION_TYPE_INT, -1, 64, -1,
- NULL, NULL, &cfg_look_align_text_offset, NULL, config_change_buffers },
- { "look_nick_completor", N_("the string inserted after nick completion"),
- N_("the string inserted after nick completion"),
- OPTION_TYPE_STRING, 0, 0, 0,
- ":", NULL, NULL, &cfg_look_nick_completor, config_change_noop },
- { "look_nick_completion_ignore", N_("chars ignored for nick completion"),
- N_("chars ignored for nick completion"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "[]-^", NULL, NULL, &cfg_look_nick_completion_ignore, config_change_noop },
- { "look_nick_completion_smart", N_("smart completion for nicks"),
- N_("smart completion for nicks (completes with last speakers first)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_nick_completion_smart, NULL, config_change_noop },
- { "look_nick_complete_first", N_("complete only with first nick found"),
- N_("complete only with first nick found"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_look_nick_complete_first, NULL, config_change_noop },
- { "look_infobar", N_("enable info bar"),
- N_("enable info bar"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_infobar, NULL, config_change_buffers },
- { "look_infobar_timestamp", N_("timestamp for time in infobar"),
- N_("timestamp for time in infobar"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%B, %A %d %Y", NULL, NULL, &cfg_look_infobar_timestamp, config_change_buffer_content },
- { "look_infobar_seconds", N_("display seconds in infobar time"),
- N_("display seconds in infobar time"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_infobar_seconds, NULL, config_change_buffer_content },
- { "look_infobar_delay_highlight", N_("delay (in seconds) for highlight messages in infobar"),
- N_("delay (in seconds) for highlight messages in infobar "
- "(0 = disable highlight notifications in infobar)"),
- OPTION_TYPE_INT, 0, INT_MAX, 7,
- NULL, NULL, &cfg_look_infobar_delay_highlight, NULL, config_change_noop },
- { "look_hotlist_names_count", N_("max number of names in hotlist"),
- N_("max number of names in hotlist (0 = no name displayed, only buffer numbers)"),
- OPTION_TYPE_INT, 0, 32, 3,
- NULL, NULL, &cfg_look_hotlist_names_count, NULL, config_change_buffer_content },
- { "look_hotlist_names_level", N_("level for displaying names in hotlist"),
- N_("level for displaying names in hotlist (combination of: 1=join/part, 2=message, "
- "4=private, 8=highlight, for example: 12=private+highlight)"),
- OPTION_TYPE_INT, 1, 15, 12,
- NULL, NULL, &cfg_look_hotlist_names_level, NULL, config_change_buffer_content },
- { "look_hotlist_names_length", N_("max length of names in hotlist"),
- N_("max length of names in hotlist (0 = no limit)"),
- OPTION_TYPE_INT, 0, 32, 0,
- NULL, NULL, &cfg_look_hotlist_names_length, NULL, config_change_buffer_content },
- { "look_hotlist_sort", N_("hotlist sort type"),
- N_("hotlist sort type (group_time_asc (default), group_time_desc, "
- "group_number_asc, group_number_desc, number_asc, number_desc)"),
- OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
- "group_time_asc", cfg_look_hotlist_sort_values, &cfg_look_hotlist_sort, NULL, config_change_hotlist },
- { "look_day_change", N_("display special message when day changes"),
- N_("display special message when day changes"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_look_day_change, NULL, config_change_noop },
- { "look_day_change_timestamp", N_("timestamp for date displayed when day changed"),
- N_("timestamp for date displayed when day changed"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%a, %d %b %Y", NULL, NULL, &cfg_look_day_change_timestamp, config_change_noop },
- { "look_read_marker", N_("use a marker on servers/channels to show first unread line"),
- N_("use a marker on servers/channels to show first unread line"),
- OPTION_TYPE_STRING, 0, 1, 0,
- " ", NULL, NULL, &cfg_look_read_marker, config_change_read_marker },
- { "look_input_format", N_("format for input prompt"),
- N_("format for input prompt ('%c' is replaced by channel or server, "
- "'%n' by nick and '%m' by nick modes)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "[%n(%m)] ", NULL, NULL, &cfg_look_input_format, config_change_buffer_content },
- { "look_paste_max_lines", N_("max number of lines for paste without asking user"),
- N_("max number of lines for paste without asking user (0 = disable this feature)"),
- OPTION_TYPE_INT, 0, INT_MAX, 3,
- NULL, NULL, &cfg_look_paste_max_lines, NULL, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, colors section */
-
-int cfg_col_real_white;
-int cfg_col_separator;
-int cfg_col_title;
-int cfg_col_title_more;
-int cfg_col_title_bg;
-int cfg_col_chat;
-int cfg_col_chat_time;
-int cfg_col_chat_time_sep;
-int cfg_col_chat_prefix1;
-int cfg_col_chat_prefix2;
-int cfg_col_chat_server;
-int cfg_col_chat_join;
-int cfg_col_chat_part;
-int cfg_col_chat_nick;
-int cfg_col_chat_host;
-int cfg_col_chat_channel;
-int cfg_col_chat_dark;
-int cfg_col_chat_highlight;
-int cfg_col_chat_bg;
-int cfg_col_chat_read_marker;
-int cfg_col_chat_read_marker_bg;
-int cfg_col_status;
-int cfg_col_status_delimiters;
-int cfg_col_status_channel;
-int cfg_col_status_data_msg;
-int cfg_col_status_data_private;
-int cfg_col_status_data_highlight;
-int cfg_col_status_data_other;
-int cfg_col_status_more;
-int cfg_col_status_bg;
-int cfg_col_infobar;
-int cfg_col_infobar_delimiters;
-int cfg_col_infobar_highlight;
-int cfg_col_infobar_bg;
-int cfg_col_input;
-int cfg_col_input_server;
-int cfg_col_input_channel;
-int cfg_col_input_nick;
-int cfg_col_input_delimiters;
-int cfg_col_input_text_not_found;
-int cfg_col_input_actions;
-int cfg_col_input_bg;
-int cfg_col_nick;
-int cfg_col_nick_away;
-int cfg_col_nick_chanowner;
-int cfg_col_nick_chanadmin;
-int cfg_col_nick_op;
-int cfg_col_nick_halfop;
-int cfg_col_nick_voice;
-int cfg_col_nick_user;
-int cfg_col_nick_more;
-int cfg_col_nick_sep;
-int cfg_col_nick_self;
-int cfg_col_nick_colors[GUI_COLOR_WIN_NICK_NUMBER];
-int cfg_col_nick_private;
-int cfg_col_nick_bg;
-int cfg_col_nicklist_bg;
-int cfg_col_dcc_selected;
-int cfg_col_dcc_waiting;
-int cfg_col_dcc_connecting;
-int cfg_col_dcc_active;
-int cfg_col_dcc_done;
-int cfg_col_dcc_failed;
-int cfg_col_dcc_aborted;
-
-t_config_option weechat_options_colors[] =
-{ /* general color settings */
- { "col_real_white", N_("if set, uses real white color"),
- N_("if set, uses real white color, disabled by default for terms with white "
- "background (if you never use white background, you should turn on "
- "this option to see real white instead of default term foreground color)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_col_real_white, NULL, config_change_color },
- { "col_separator", N_("color for window separators (when splited)"),
- N_("color for window separators (when splited)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_separator, NULL, &config_change_color },
- /* title window */
- { "col_title", N_("color for title bar"),
- N_("color for title bar"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_title, NULL, &config_change_color },
- { "col_title_more", N_("color for '+' when scrolling topic"),
- N_("color for '+' when scrolling topic"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightmagenta", NULL, &cfg_col_title_more, NULL, &config_change_color },
- { "col_title_bg", N_("background for title bar"),
- N_("background for title bar"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_title_bg, NULL, &config_change_color },
-
- /* chat window */
- { "col_chat", N_("color for chat text"),
- N_("color for chat text"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_chat, NULL, &config_change_color },
- { "col_chat_time", N_("color for time"),
- N_("color for time in chat window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_chat_time, NULL, &config_change_color },
- { "col_chat_time_sep", N_("color for time separator"),
- N_("color for time separator (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "brown", NULL, &cfg_col_chat_time_sep, NULL, &config_change_color },
- { "col_chat_prefix1", N_("color for 1st and 3rd char of prefix"),
- N_("color for 1st and 3rd char of prefix"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightcyan", NULL, &cfg_col_chat_prefix1, NULL, &config_change_color },
- { "col_chat_prefix2", N_("color for middle char of prefix"),
- N_("color for middle char of prefix"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_chat_prefix2, NULL, &config_change_color },
- { "col_chat_server", N_("color for server name"),
- N_("color for server name"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "brown", NULL, &cfg_col_chat_server, NULL, &config_change_color },
- { "col_chat_join", N_("color for join arrow (prefix)"),
- N_("color for join arrow (prefix)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_chat_join, NULL, &config_change_color },
- { "col_chat_part", N_("color for part/quit arrow (prefix)"),
- N_("color for part/quit arrow (prefix)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightred", NULL, &cfg_col_chat_part, NULL, &config_change_color },
- { "col_chat_nick", N_("color for nicks in actions"),
- N_("color for nicks in actions (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightcyan", NULL, &cfg_col_chat_nick, NULL, &config_change_color },
- { "col_chat_host", N_("color for hostnames"),
- N_("color for hostnames (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_chat_host, NULL, &config_change_color },
- { "col_chat_channel", N_("color for channel names in actions"),
- N_("color for channel names in actions (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_chat_channel, NULL, &config_change_color },
- { "col_chat_dark", N_("color for dark separators"),
- N_("color for dark separators (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "green", NULL, &cfg_col_chat_dark, NULL, &config_change_color },
- { "col_chat_highlight", N_("color for highlighted nick"),
- N_("color for highlighted nick (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "yellow", NULL, &cfg_col_chat_highlight, NULL, &config_change_color },
- { "col_chat_bg", N_("background for chat"),
- N_("background for chat window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_chat_bg, NULL, &config_change_color },
- { "col_chat_read_marker", N_("color for unread data marker"),
- N_("color for unread data marker"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "yellow", NULL, &cfg_col_chat_read_marker, NULL, &config_change_color },
- { "col_chat_read_marker_bg", N_("background for unread data marker"),
- N_("background for unread data marker"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "magenta", NULL, &cfg_col_chat_read_marker_bg, NULL, &config_change_color },
-
- /* status window */
- { "col_status", N_("color for status bar"),
- N_("color for status bar"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_status, NULL, &config_change_color },
- { "col_status_delimiters", N_("color for status bar delimiters"),
- N_("color for status bar delimiters"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_status_delimiters, NULL, &config_change_color },
- { "col_status_channel", N_("color for current channel in status bar"),
- N_("color for current channel in status bar"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_status_channel, NULL, &config_change_color },
- { "col_status_data_msg", N_("color for window with new messages"),
- N_("color for window with new messages (status bar)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "yellow", NULL, &cfg_col_status_data_msg, NULL, &config_change_color },
- { "col_status_private", N_("color for window with private message"),
- N_("color for window with private message (status bar)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightmagenta", NULL, &cfg_col_status_data_private, NULL, &config_change_color },
- { "col_status_highlight", N_("color for window with highlight"),
- N_("color for window with highlight (status bar)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightred", NULL, &cfg_col_status_data_highlight, NULL, &config_change_color },
- { "col_status_data_other", N_("color for window with new data (not messages)"),
- N_("color for window with new data (not messages) (status bar)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_status_data_other, NULL, &config_change_color },
- { "col_status_more", N_("color for \"-MORE-\" text"),
- N_("color for window with new data (status bar)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_status_more, NULL, &config_change_color },
- { "col_status_bg", N_("background for status window"),
- N_("background for status window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_status_bg, NULL, &config_change_color },
-
- /* infobar window */
- { "col_infobar", N_("color for info bar text"),
- N_("color for info bar text"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "black", NULL, &cfg_col_infobar, NULL, &config_change_color },
- { "col_infobar_delimiters", N_("color for infobar delimiters"),
- N_("color for infobar delimiters"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_infobar_delimiters, NULL, &config_change_color },
- { "col_infobar_highlight", N_("color for info bar highlight notification"),
- N_("color for info bar highlight notification"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_infobar_highlight, NULL, &config_change_color },
- { "col_infobar_bg", N_("background for info bar window"),
- N_("background for info bar window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_infobar_bg, NULL, &config_change_color },
-
- /* input window */
- { "col_input", N_("color for input text"),
- N_("color for input text"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_input, NULL, &config_change_color },
- { "col_input_server", N_("color for input text (server name)"),
- N_("color for input text (server name)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "brown", NULL, &cfg_col_input_server, NULL, &config_change_color },
- { "col_input_channel", N_("color for input text (channel name)"),
- N_("color for input text (channel name)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_input_channel, NULL, &config_change_color },
- { "col_input_nick", N_("color for input text (nick name)"),
- N_("color for input text (nick name)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightcyan", NULL, &cfg_col_input_nick, NULL, &config_change_color },
- { "col_input_delimiters", N_("color for input text (delimiters)"),
- N_("color for input text (delimiters)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_input_delimiters, NULL, &config_change_color },
- { "col_input_text_not_found", N_("color for text not found"),
- N_("color for text not found"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "red", NULL, &cfg_col_input_text_not_found, NULL, &config_change_color },
- { "col_input_actions", N_("color for actions in input window"),
- N_("color for actions in input window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_input_actions, NULL, &config_change_color },
- { "col_input_bg", N_("background for input window"),
- N_("background for input window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_input_bg, NULL, &config_change_color },
-
- /* nick window */
- { "col_nick", N_("color for nicknames"),
- N_("color for nicknames"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_nick, NULL, &config_change_color },
- { "col_nick_away", N_("color for away nicknames"),
- N_("color for away nicknames"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_nick_away, NULL, &config_change_color },
- { "col_nick_chanowner", N_("color for chan owner symbol"),
- N_("color for chan owner symbol (specific to unrealircd)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_nick_chanowner, NULL, &config_change_color },
- { "col_nick_chanadmin", N_("color for chan admin symbol"),
- N_("color for chan admin symbol (specific to unrealircd)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_nick_chanadmin, NULL, &config_change_color },
- { "col_nick_op", N_("color for operator symbol"),
- N_("color for operator symbol"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_nick_op, NULL, &config_change_color },
- { "col_nick_halfop", N_("color for half-operator symbol"),
- N_("color for half-operator symbol"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightmagenta", NULL, &cfg_col_nick_halfop, NULL, &config_change_color },
- { "col_nick_voice", N_("color for voice symbol"),
- N_("color for voice symbol"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "yellow", NULL, &cfg_col_nick_voice, NULL, &config_change_color },
- { "col_nick_user", N_("color for user symbol"),
- N_("color for user symbol"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_nick_user, NULL, &config_change_color },
- { "col_nick_more", N_("color for '+' when scrolling nicks"),
- N_("color for '+' when scrolling nicks"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightmagenta", NULL, &cfg_col_nick_more, NULL, &config_change_color },
- { "col_nick_sep", N_("color for nick separator"),
- N_("color for nick separator"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_nick_sep, NULL, &config_change_color },
- { "col_nick_self", N_("color for local nick"),
- N_("color for local nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_nick_self, NULL, &config_change_color },
- { "col_nick_color1", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "cyan", NULL, &cfg_col_nick_colors[0], NULL, &config_change_color },
- { "col_nick_color2", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "magenta", NULL, &cfg_col_nick_colors[1], NULL, &config_change_color },
- { "col_nick_color3", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "green", NULL, &cfg_col_nick_colors[2], NULL, &config_change_color },
- { "col_nick_color4", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "brown", NULL, &cfg_col_nick_colors[3], NULL, &config_change_color },
- { "col_nick_color5", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightblue", NULL, &cfg_col_nick_colors[4], NULL, &config_change_color },
- { "col_nick_color6", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_nick_colors[5], NULL, &config_change_color },
- { "col_nick_color7", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightcyan", NULL, &cfg_col_nick_colors[6], NULL, &config_change_color },
- { "col_nick_color8", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightmagenta", NULL, &cfg_col_nick_colors[7], NULL, &config_change_color },
- { "col_nick_color9", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_nick_colors[8], NULL, &config_change_color },
- { "col_nick_color10", N_("color for nick"),
- N_("color for nick"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "blue", NULL, &cfg_col_nick_colors[9], NULL, &config_change_color },
- { "col_nick_private", N_("color for other nick in private window"),
- N_("color for other nick in private window"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_nick_private, NULL, &config_change_color },
- { "col_nick_bg", N_("background for nicknames"),
- N_("background for nicknames"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "default", NULL, &cfg_col_nick_bg, NULL, &config_change_color },
-
- /* DCC */
- { "col_chat_dcc_selected", N_("color for selected DCC"),
- N_("color for selected DCC (chat window)"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "white", NULL, &cfg_col_dcc_selected, NULL, &config_change_color },
- { "col_dcc_waiting", N_("color for \"waiting\" dcc status"),
- N_("color for \"waiting\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightcyan", NULL, &cfg_col_dcc_waiting, NULL, &config_change_color },
- { "col_dcc_connecting", N_("color for \"connecting\" dcc status"),
- N_("color for \"connecting\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "yellow", NULL, &cfg_col_dcc_connecting, NULL, &config_change_color },
- { "col_dcc_active", N_("color for \"active\" dcc status"),
- N_("color for \"active\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightblue", NULL, &cfg_col_dcc_active, NULL, &config_change_color },
- { "col_dcc_done", N_("color for \"done\" dcc status"),
- N_("color for \"done\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightgreen", NULL, &cfg_col_dcc_done, NULL, &config_change_color },
- { "col_dcc_failed", N_("color for \"failed\" dcc status"),
- N_("color for \"failed\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightred", NULL, &cfg_col_dcc_failed, NULL, &config_change_color },
- { "col_dcc_aborted", N_("color for \"aborted\" dcc status"),
- N_("color for \"aborted\" dcc status"),
- OPTION_TYPE_COLOR, 0, 0, 0,
- "lightred", NULL, &cfg_col_dcc_aborted, NULL, &config_change_color },
-
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, history section */
-
-int cfg_history_max_lines;
-int cfg_history_max_commands;
-int cfg_history_display_default;
-
-t_config_option weechat_options_history[] =
-{ { "history_max_lines", N_("max lines in history (per window)"),
- N_("maximum number of lines in history "
- "for one server/channel/private window (0 = unlimited)"),
- OPTION_TYPE_INT, 0, INT_MAX, 4096,
- NULL, NULL, &cfg_history_max_lines, NULL, &config_change_noop },
- { "history_max_commands", N_("max user commands in history"),
- N_("maximum number of user commands in history (0 = unlimited)"),
- OPTION_TYPE_INT, 0, INT_MAX, 100,
- NULL, NULL, &cfg_history_max_commands, NULL, &config_change_noop },
- { "history_display_default", N_("max commands to display"),
- N_("maximum number of commands to display by default in history listing (0 = unlimited)"),
- OPTION_TYPE_INT, 0, INT_MAX, 5,
- NULL, NULL, &cfg_history_display_default, NULL, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, log section */
-
-int cfg_log_auto_server;
-int cfg_log_auto_channel;
-int cfg_log_auto_private;
-int cfg_log_plugin_msg;
-char *cfg_log_path;
-char *cfg_log_timestamp;
-int cfg_log_hide_nickserv_pwd;
-
-t_config_option weechat_options_log[] =
-{ { "log_auto_server", N_("automatically log server messages"),
- N_("automatically log server messages"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_log_auto_server, NULL, &config_change_log },
- { "log_auto_channel", N_("automatically log channel chats"),
- N_("automatically log channel chats"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_log_auto_channel, NULL, &config_change_log },
- { "log_auto_private", N_("automatically log private chats"),
- N_("automatically log private chats"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_log_auto_private, NULL, &config_change_log },
- { "log_plugin_msg", N_("log messages from plugins (scripts)"),
- N_("log messages from plugins (scripts)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_log_plugin_msg, NULL, &config_change_noop },
- { "log_path", N_("path for log files"),
- N_("path for WeeChat log files ('%h' will be replaced by WeeChat home, "
- "~/.weechat by default)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%h/logs/", NULL, NULL, &cfg_log_path, &config_change_noop },
- { "log_timestamp", N_("timestamp for log"),
- N_("timestamp for log (see man strftime for date/time specifiers)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%Y %b %d %H:%M:%S", NULL, NULL, &cfg_log_timestamp, &config_change_noop },
- { "log_hide_nickserv_pwd", N_("hide password displayed by nickserv"),
- N_("hide password displayed by nickserv"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_log_hide_nickserv_pwd, NULL, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, irc section */
-
-int cfg_irc_display_away;
-int cfg_irc_show_away_once;
-char *cfg_irc_display_away_values[] =
-{ "off", "local", "channel", NULL };
-char *cfg_irc_default_msg_part;
-char *cfg_irc_default_msg_quit;
-int cfg_irc_notice_as_pv;
-int cfg_irc_away_check;
-int cfg_irc_away_check_max_nicks;
-int cfg_irc_lag_check;
-int cfg_irc_lag_min_show;
-int cfg_irc_lag_disconnect;
-int cfg_irc_anti_flood;
-int cfg_irc_fifo_pipe;
-char *cfg_irc_highlight;
-int cfg_irc_colors_receive;
-int cfg_irc_colors_send;
-int cfg_irc_send_unknown_commands;
-
-t_config_option weechat_options_irc[] =
-{ { "irc_display_away", N_("display message for away"),
- N_("display message when (un)marking as away"),
- OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
- "off", cfg_irc_display_away_values, &cfg_irc_display_away, NULL, &config_change_noop },
- { "irc_show_away_once", N_("show remote away message only once in private"),
- N_("show remote away message only once in private"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_irc_show_away_once, NULL, &config_change_noop },
- { "irc_default_msg_part", N_("default part message (leaving channel)"),
- N_("default part message (leaving channel) ('%v' will be replaced by "
- "WeeChat version in string)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "WeeChat %v", NULL, NULL, &cfg_irc_default_msg_part, &config_change_noop },
- { "irc_default_msg_quit", N_("default quit message"),
- N_("default quit message ('%v' will be replaced by WeeChat version in string)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "WeeChat %v", NULL, NULL, &cfg_irc_default_msg_quit, &config_change_noop },
- { "irc_notice_as_pv", N_("display notices as private messages"),
- N_("display notices as private messages"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_irc_notice_as_pv, NULL, &config_change_noop },
- { "irc_away_check", N_("interval between two checks for away"),
- N_("interval between two checks for away (in minutes, 0 = never check)"),
- OPTION_TYPE_INT, 0, INT_MAX, 0,
- NULL, NULL, &cfg_irc_away_check, NULL, &config_change_away_check },
- { "irc_away_check_max_nicks", N_("max number of nicks for away check"),
- N_("do not check away nicks on channels with high number of nicks (0 = unlimited)"),
- OPTION_TYPE_INT, 0, INT_MAX, 0,
- NULL, NULL, &cfg_irc_away_check_max_nicks, NULL, &config_change_away_check },
- { "irc_lag_check", N_("interval between two checks for lag"),
- N_("interval between two checks for lag (in seconds)"),
- OPTION_TYPE_INT, 30, INT_MAX, 60,
- NULL, NULL, &cfg_irc_lag_check, NULL, &config_change_noop },
- { "irc_lag_min_show", N_("minimum lag to show"),
- N_("minimum lag to show (in seconds)"),
- OPTION_TYPE_INT, 0, INT_MAX, 1,
- NULL, NULL, &cfg_irc_lag_min_show, NULL, &config_change_noop },
- { "irc_lag_disconnect", N_("disconnect after important lag"),
- N_("disconnect after important lag (in minutes, 0 = never disconnect)"),
- OPTION_TYPE_INT, 0, INT_MAX, 5,
- NULL, NULL, &cfg_irc_lag_disconnect, NULL, &config_change_noop },
- { "irc_anti_flood", N_("anti-flood"),
- N_("anti-flood: # seconds between two user messages (0 = no anti-flood)"),
- OPTION_TYPE_INT, 0, 5, 2,
- NULL, NULL, &cfg_irc_anti_flood, NULL, &config_change_noop },
- { "irc_fifo_pipe", N_("create a FIFO pipe for remote control"),
- N_("create a FIFO pipe for remote control"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_irc_fifo_pipe, NULL, &config_change_fifo_pipe },
- { "irc_highlight", N_("list of words to highlight"),
- N_("comma separated list of words to highlight (case insensitive comparison, "
- "words may begin or end with \"*\" for partial match)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &cfg_irc_highlight, &config_change_noop },
- { "irc_colors_receive", N_("when off, colors codes are ignored in "
- "incoming messages"),
- N_("when off, colors codes are ignored in incoming messages"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_irc_colors_receive, NULL, config_change_noop },
- { "irc_colors_send", N_("allow user to send colors"),
- N_("allow user to send colors with special codes (^Cb=bold, ^Ccxx=color, "
- "^Ccxx,yy=color+background, ^Cu=underline, ^Cr=reverse)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_irc_colors_send, NULL, config_change_noop },
- { "irc_send_unknown_commands", N_("send unknown commands to IRC server"),
- N_("send unknown commands to IRC server"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_irc_send_unknown_commands, NULL, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, dcc section */
-
-int cfg_dcc_auto_accept_files;
-int cfg_dcc_auto_accept_chats;
-int cfg_dcc_timeout;
-int cfg_dcc_blocksize;
-int cfg_dcc_fast_send;
-char *cfg_dcc_port_range;
-char *cfg_dcc_own_ip;
-char *cfg_dcc_download_path;
-char *cfg_dcc_upload_path;
-int cfg_dcc_convert_spaces;
-int cfg_dcc_auto_rename;
-int cfg_dcc_auto_resume;
-
-t_config_option weechat_options_dcc[] =
-{ { "dcc_auto_accept_files", N_("automatically accept dcc files"),
- N_("automatically accept incoming dcc files"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_dcc_auto_accept_files, NULL, &config_change_noop },
- { "dcc_auto_accept_chats", N_("automatically accept dcc chats"),
- N_("automatically accept dcc chats (use carefully!)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_dcc_auto_accept_chats, NULL, &config_change_noop },
- { "dcc_timeout", N_("timeout for dcc request"),
- N_("timeout for dcc request (in seconds)"),
- OPTION_TYPE_INT, 5, INT_MAX, 300,
- NULL, NULL, &cfg_dcc_timeout, NULL, &config_change_noop },
- { "dcc_blocksize", N_("block size for dcc packets"),
- N_("block size for dcc packets in bytes (default: 65536)"),
- OPTION_TYPE_INT, IRC_DCC_MIN_BLOCKSIZE, IRC_DCC_MAX_BLOCKSIZE, 65536,
- NULL, NULL, &cfg_dcc_blocksize, NULL, &config_change_noop },
- { "dcc_fast_send", N_("does not wait for ACK when sending file"),
- N_("does not wait for ACK when sending file"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_dcc_fast_send, NULL, &config_change_noop },
- { "dcc_port_range", N_("allowed ports for outgoing dcc"),
- N_("restricts outgoing dcc to use only ports in the given range "
- "(useful for NAT) (syntax: a single port, ie. 5000 or a port "
- "range, ie. 5000-5015, empty value means any port)"),
- OPTION_TYPE_STRING, 0, 0, 0, "",
- NULL, NULL, &cfg_dcc_port_range, &config_change_noop },
- { "dcc_own_ip", N_("IP address for outgoing dcc"),
- N_("IP or DNS address used for outgoing dcc "
- "(if empty, local interface IP is used)"),
- OPTION_TYPE_STRING, 0, 0, 0, "",
- NULL, NULL, &cfg_dcc_own_ip, &config_change_noop },
- { "dcc_download_path", N_("path for incoming files with dcc"),
- N_("path for writing incoming files with dcc (default: user home)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%h/dcc", NULL, NULL, &cfg_dcc_download_path, &config_change_noop },
- { "dcc_upload_path", N_("default path for sending files with dcc"),
- N_("path for reading files when sending thru dcc (when no path is specified)"),
- OPTION_TYPE_STRING, 0, 0, 0, "~",
- NULL, NULL, &cfg_dcc_upload_path, &config_change_noop },
- { "dcc_convert_spaces", N_("convert spaces to underscores when sending files"),
- N_("convert spaces to underscores when sending files"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_dcc_convert_spaces, NULL, &config_change_noop },
- { "dcc_auto_rename", N_("automatically rename dcc files if already exists"),
- N_("rename incoming files if already exists (add '.1', '.2', ...)"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_dcc_auto_rename, NULL, &config_change_noop },
- { "dcc_auto_resume", N_("automatically resume aborted transfers"),
- N_("automatically resume dcc transfer if connection with remote host is loosed"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &cfg_dcc_auto_resume, NULL, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, proxy section */
-
-int cfg_proxy_use;
-int cfg_proxy_type;
-int cfg_proxy_ipv6;
-char *cfg_proxy_type_values[] =
-{ "http", "socks4", "socks5", NULL };
-char *cfg_proxy_address;
-int cfg_proxy_port;
-char *cfg_proxy_username;
-char *cfg_proxy_password;
-
-t_config_option weechat_options_proxy[] =
-{ { "proxy_use", N_("use proxy"),
- N_("use a proxy server to connect to irc server"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_proxy_use, NULL, &config_change_noop },
- { "proxy_type", N_("proxy type"),
- N_("proxy type (http (default), socks4, socks5)"),
- OPTION_TYPE_INT_WITH_STRING, 0, 0, 0,
- "http", cfg_proxy_type_values, &cfg_proxy_type, NULL, &config_change_noop },
- { "proxy_ipv6", N_("use ipv6 proxy"),
- N_("connect to proxy in ipv6"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &cfg_proxy_ipv6, NULL, &config_change_noop },
- { "proxy_address", N_("proxy address"),
- N_("proxy server address (IP or hostname)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &cfg_proxy_address, &config_change_noop },
- { "proxy_port", N_("port for proxy"),
- N_("port for connecting to proxy server"),
- OPTION_TYPE_INT, 0, 65535, 3128,
- NULL, NULL, &cfg_proxy_port, NULL, &config_change_noop },
- { "proxy_username", N_("proxy username"),
- N_("username for proxy server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &cfg_proxy_username, &config_change_noop },
- { "proxy_password", N_("proxy password"),
- N_("password for proxy server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &cfg_proxy_password, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, plugins section */
-
-char *cfg_plugins_path;
-char *cfg_plugins_autoload;
-char *cfg_plugins_extension;
-
-t_config_option weechat_options_plugins[] =
-{ { "plugins_path", N_("path for searching plugins"),
- N_("path for searching plugins ('%h' will be replaced by WeeChat home, "
- "~/.weechat by default)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "%h/plugins", NULL, NULL, &cfg_plugins_path, &config_change_noop },
- { "plugins_autoload", N_("list of plugins to load automatically"),
- N_("comma separated list of plugins to load automatically at startup, "
- "\"*\" means all plugins found "
- "(names may be partial, for example \"perl\" is ok for \"libperl.so\")"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "*", NULL, NULL, &cfg_plugins_autoload, &config_change_noop },
- { "plugins_extension", N_("standard plugins extension in filename"),
- N_("standard plugins extension in filename, used for autoload "
- "(if empty, then all files are loaded when autoload is \"*\")"),
- OPTION_TYPE_STRING, 0, 0, 0,
-#ifdef WIN32
- ".dll",
-#else
- ".so",
-#endif
- NULL, NULL, &cfg_plugins_extension, &config_change_noop },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* config, server section */
-
-static t_irc_server cfg_server;
-
-t_config_option weechat_options_server[] =
-{ { "server_name", N_("server name"),
- N_("name associated to IRC server (for display only)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.name), NULL },
- { "server_autoconnect", N_("automatically connect to server"),
- N_("automatically connect to server when WeeChat is starting"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &(cfg_server.autoconnect), NULL, NULL },
- { "server_autoreconnect", N_("automatically reconnect to server"),
- N_("automatically reconnect to server when disconnected"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &(cfg_server.autoreconnect), NULL, NULL },
- { "server_autoreconnect_delay", N_("delay before trying again to reconnect"),
- N_("delay (in seconds) before trying again to reconnect to server"),
- OPTION_TYPE_INT, 0, 65535, 30,
- NULL, NULL, &(cfg_server.autoreconnect_delay), NULL, NULL },
- { "server_address", N_("server address or hostname"),
- N_("IP address or hostname of IRC server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.address), NULL },
- { "server_port", N_("port for IRC server"),
- N_("port for connecting to server"),
- OPTION_TYPE_INT, 0, 65535, 6667,
- NULL, NULL, &(cfg_server.port), NULL, NULL },
- { "server_ipv6", N_("use IPv6 protocol for server communication"),
- N_("use IPv6 protocol for server communication"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &(cfg_server.ipv6), NULL, NULL },
- { "server_ssl", N_("use SSL for server communication"),
- N_("use SSL for server communication"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE,
- NULL, NULL, &(cfg_server.ssl), NULL, NULL },
- { "server_password", N_("server password"),
- N_("password for IRC server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.password), NULL },
- { "server_nick1", N_("nickname for server"),
- N_("nickname to use on IRC server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.nick1), NULL },
- { "server_nick2", N_("alternate nickname for server"),
- N_("alternate nickname to use on IRC server (if nickname is already used)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.nick2), NULL },
- { "server_nick3", N_("2nd alternate nickname for server"),
- N_("2nd alternate nickname to use on IRC server (if alternate nickname is already used)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.nick3), NULL },
- { "server_username", N_("user name for server"),
- N_("user name to use on IRC server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.username), NULL },
- { "server_realname", N_("real name for server"),
- N_("real name to use on IRC server"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.realname), NULL },
- { "server_hostname", N_("custom hostname/IP for server"),
- N_("custom hostname/IP for server (optional, if empty local hostname is used)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.hostname), NULL },
- { "server_command", N_("command(s) to run when connected to server"),
- N_("command(s) to run when connected to server (many commands should be "
- "separated by ';', use '\\;' for a semicolon, special variables $nick, "
- "$channel and $server are replaced by their value)"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.command), NULL },
- { "server_command_delay", N_("delay (in seconds) after command was executed"),
- N_("delay (in seconds) after command was executed (example: give some time for authentication)"),
- OPTION_TYPE_INT, 0, 3600, 0,
- NULL, NULL, &(cfg_server.command_delay), NULL, NULL },
- { "server_autojoin", N_("list of channels to join when connected to server"),
- N_("comma separated list of channels to join when connected to server (example: \"#chan1,#chan2,#chan3 key1,key2\")"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.autojoin), NULL },
- { "server_autorejoin", N_("automatically rejoin channels when kicked"),
- N_("automatically rejoin channels when kicked"),
- OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
- NULL, NULL, &(cfg_server.autorejoin), NULL, NULL },
- { "server_notify_levels", N_("notify levels for channels of this server"),
- N_("comma separated list of notify levels for channels of this server "
- "(format: #channel:1,..), a channel name '*' is reserved for server "
- "default notify level"),
- OPTION_TYPE_STRING, 0, 0, 0,
- "", NULL, NULL, &(cfg_server.notify_levels), config_change_notify_levels },
- { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
-};
-
-/* all weechat options */
-
-t_config_option *weechat_options[CONFIG_NUMBER_SECTIONS] =
-{ weechat_options_look, weechat_options_colors, weechat_options_history,
- weechat_options_log, weechat_options_irc, weechat_options_dcc,
- weechat_options_proxy, weechat_options_plugins, NULL, NULL, NULL,
- weechat_options_server
-};
-
-
-/*
- * config_get_pos_array_values: return position of a string in an array of values
- * return -1 if not found, otherwise position
- */
-
-int
-config_get_pos_array_values (char **array, char *string)
-{
- int i;
-
- i = 0;
- while (array[i])
- {
- if (ascii_strcasecmp (array[i], string) == 0)
- return i;
- i++;
- }
- /* string not found in array */
- return -1;
-}
-
-/*
- * config_get_section: get section name from option pointer
- */
-
-char *
-config_get_section (t_config_option *ptr_option)
-{
- int i, j;
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- /* if option found, return pointer to section name */
- if (ptr_option == &weechat_options[i][j])
- return config_sections[i].section_name;
- }
- }
- }
- /* option not found */
- return NULL;
-}
-
-/*
- * config_change_noop: called when an option is changed by /set command
- * and that no special action is needed after that
- */
-
-void
-config_change_noop ()
-{
- /* do nothing */
-}
-
-/*
- * config_change_save_on_exit: called when "save_on_exit" flag is changed
- */
-
-void
-config_change_save_on_exit ()
-{
- if (!cfg_look_save_on_exit)
- {
- gui_printf (NULL, "\n");
- gui_printf (NULL, _("%s you should now issue /save to write "
- "\"save_on_exit\" option in config file.\n"),
- WEECHAT_WARNING);
- }
-}
-
-/*
- * config_change_title: called when title is changed
- */
-
-void
-config_change_title ()
-{
- if (cfg_look_set_title)
- gui_window_set_title ();
- else
- gui_window_reset_title ();
-}
-
-/*
- * config_change_buffers: called when buffers change (for example nicklist)
- */
-
-void
-config_change_buffers ()
-{
- gui_window_refresh_windows ();
-}
-
-/*
- * config_change_buffer_content: called when content of a buffer changes
- */
-
-void
-config_change_buffer_content ()
-{
- gui_window_redraw_buffer (gui_current_window->buffer);
-}
-
-/*
- * config_change_hotlist: called when hotlist changes
- */
-
-void
-config_change_hotlist ()
-{
- hotlist_resort ();
- gui_status_draw (gui_current_window->buffer, 1);
-}
-
-/*
- * config_change_read_marker: called when read marker is changed
- */
-
-void
-config_change_read_marker ()
-{
- gui_window_redraw_all_buffers ();
-}
-
-/*
- * config_change_one_server_buffer: called when the "one server buffer"
- * setting is changed
- */
-
-void
-config_change_one_server_buffer ()
-{
- if (cfg_look_one_server_buffer)
- gui_buffer_merge_servers (gui_current_window);
- else
- gui_buffer_split_server (gui_current_window);
-}
-
-/*
- * config_change_color: called when a color is changed by /set command
- */
-
-void
-config_change_color ()
-{
- gui_color_init_pairs ();
- gui_color_rebuild_weechat ();
- gui_window_refresh_windows ();
-}
-
-/*
- * config_change_nicks_colors: called when number of nicks color changed
- */
-
-void
-config_change_nicks_colors ()
-{
- t_irc_server *ptr_server;
- t_irc_channel *ptr_channel;
- t_irc_nick *ptr_nick;
-
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (ptr_server->is_connected)
- {
- for (ptr_channel = ptr_server->channels; ptr_channel;
- ptr_channel = ptr_channel->next_channel)
- {
- for (ptr_nick = ptr_channel->nicks; ptr_nick;
- ptr_nick = ptr_nick->next_nick)
- {
- if (ptr_nick->color != GUI_COLOR_WIN_NICK_SELF)
- ptr_nick->color = irc_nick_find_color (ptr_nick);
- }
- }
- }
- }
-}
-
-/*
- * config_change_away_check: called when away check is changed
- */
-
-void
-config_change_away_check ()
-{
- if (cfg_irc_away_check == 0)
- {
- /* reset away flag for all nicks/chans/servers */
- irc_server_remove_away ();
- }
- irc_check_away = cfg_irc_away_check * 60;
-}
-
-/*
- * config_change_fifo_pipe: called when FIFO pipe is changed
- */
-
-void
-config_change_fifo_pipe ()
-{
- if (cfg_irc_fifo_pipe)
- {
- if (weechat_fifo == -1)
- fifo_create ();
- }
- else
- {
- if (weechat_fifo != -1)
- fifo_remove ();
- }
-}
-
-/*
- * config_change_notify_levels: called when notify levels is changed for a server
- */
-
-void
-config_change_notify_levels ()
-{
- t_gui_buffer *ptr_buffer;
-
- for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer)
- {
- if (GUI_BUFFER_IS_CHANNEL(ptr_buffer) || GUI_BUFFER_IS_PRIVATE(ptr_buffer))
- ptr_buffer->notify_level =
- irc_channel_get_notify_level (GUI_SERVER(ptr_buffer), GUI_CHANNEL(ptr_buffer));
- }
-}
-
-/*
- * config_change_log: called when log settings are changed (for server/channel/private logging)
- */
-
-void
-config_change_log ()
-{
- t_gui_buffer *ptr_buffer;
-
- for (ptr_buffer = gui_buffers; ptr_buffer;
- ptr_buffer = ptr_buffer->next_buffer)
- {
- if (GUI_BUFFER_IS_SERVER(ptr_buffer))
- {
- if (cfg_log_auto_server && !ptr_buffer->log_file)
- gui_log_start (ptr_buffer);
- else if (!cfg_log_auto_server && ptr_buffer->log_file)
- gui_log_end (ptr_buffer);
- }
- if (GUI_BUFFER_IS_CHANNEL(ptr_buffer))
- {
- if (cfg_log_auto_channel && !ptr_buffer->log_file)
- gui_log_start (ptr_buffer);
- else if (!cfg_log_auto_channel && ptr_buffer->log_file)
- gui_log_end (ptr_buffer);
- }
- if (GUI_BUFFER_IS_PRIVATE(ptr_buffer))
- {
- if (cfg_log_auto_private && !ptr_buffer->log_file)
- gui_log_start (ptr_buffer);
- else if (!cfg_log_auto_private && ptr_buffer->log_file)
- gui_log_end (ptr_buffer);
- }
- }
-}
-
-/*
- * config_option_get_boolean_value: get boolean value with user text
- * return: BOOL_FALSE or BOOL_TRUE
- */
-
-int
-config_option_get_boolean_value (char *text)
-{
- if ((ascii_strcasecmp (text, "on") == 0)
- || (ascii_strcasecmp (text, "yes") == 0)
- || (ascii_strcasecmp (text, "y") == 0)
- || (ascii_strcasecmp (text, "true") == 0)
- || (ascii_strcasecmp (text, "t") == 0)
- || (ascii_strcasecmp (text, "1") == 0))
- return BOOL_TRUE;
-
- if ((ascii_strcasecmp (text, "off") == 0)
- || (ascii_strcasecmp (text, "no") == 0)
- || (ascii_strcasecmp (text, "n") == 0)
- || (ascii_strcasecmp (text, "false") == 0)
- || (ascii_strcasecmp (text, "f") == 0)
- || (ascii_strcasecmp (text, "0") == 0))
- return BOOL_FALSE;
-
- /* invalid text */
- return -1;
-}
-
-/*
- * config_option_set_value: set new value for an option
- * return: 0 if success
- * -1 if error (bad value)
- */
-
-int
-config_option_set_value (t_config_option *option, char *value)
-{
- int int_value;
-
- switch (option->option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- int_value = config_option_get_boolean_value (value);
- switch (int_value)
- {
- case BOOL_TRUE:
- *(option->ptr_int) = BOOL_TRUE;
- break;
- case BOOL_FALSE:
- *(option->ptr_int) = BOOL_FALSE;
- break;
- default:
- return -1;
- }
- break;
- case OPTION_TYPE_INT:
- int_value = atoi (value);
- if ((int_value < option->min) || (int_value > option->max))
- return -1;
- *(option->ptr_int) = int_value;
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- int_value = config_get_pos_array_values (option->array_values,
- value);
- if (int_value < 0)
- return -1;
- *(option->ptr_int) = int_value;
- break;
- case OPTION_TYPE_COLOR:
- if (!gui_color_assign (option->ptr_int, value))
- return -1;
- break;
- case OPTION_TYPE_STRING:
- if ((option->max > 0) && (utf8_strlen (value) > option->max))
- return -1;
- if (*(option->ptr_string))
- free (*(option->ptr_string));
- *(option->ptr_string) = strdup (value);
- break;
- }
- return 0;
-}
-
-/*
- * config_option_list_remove: remove an item from a list for an option
- * (for options with value like: "abc:1,def:blabla")
- */
-
-void
-config_option_list_remove (char **string, char *item)
-{
- char *name, *pos, *pos2;
-
- if (!string || !(*string))
- return;
-
- name = (char *) malloc (strlen (item) + 2);
- strcpy (name, item);
- strcat (name, ":");
- pos = ascii_strcasestr (*string, name);
- free (name);
- if (pos)
- {
- pos2 = pos + strlen (item);
- if (pos2[0] == ':')
- {
- pos2++;
- if (pos2[0])
- {
- while (pos2[0] && (pos2[0] != ','))
- pos2++;
- if (pos2[0] == ',')
- pos2++;
- if (!pos2[0] && (pos != (*string)))
- pos--;
- strcpy (pos, pos2);
- if (!(*string)[0])
- {
- free (*string);
- *string = NULL;
- }
- else
- (*string) = (char *) realloc (*string, strlen (*string) + 1);
- }
- }
- }
-}
-
-/*
- * config_option_list_set: set an item from a list for an option
- * (for options with value like: "abc:1,def:blabla")
- */
-
-void
-config_option_list_set (char **string, char *item, char *value)
-{
- config_option_list_remove (string, item);
-
- if (!(*string))
- {
- (*string) = (char *) malloc (strlen (item) + 1 + strlen (value) + 1);
- (*string)[0] = '\0';
- }
- else
- (*string) = (char *) realloc (*string,
- strlen (*string) + 1 +
- strlen (item) + 1 + strlen (value) + 1);
-
- if ((*string)[0])
- strcat (*string, ",");
- strcat (*string, item);
- strcat (*string, ":");
- strcat (*string, value);
-}
-
-/*
- * config_option_list_get_value: return position of item value in the list
- * (for options with value like: "abc:1,def:blabla")
- */
-
-void
-config_option_list_get_value (char **string, char *item,
- char **pos_found, int *length)
-{
- char *name, *pos, *pos2, *pos_comma;
-
- *pos_found = NULL;
- *length = 0;
-
- if (!string || !(*string))
- return;
-
- name = (char *) malloc (strlen (item) + 2);
- strcpy (name, item);
- strcat (name, ":");
- pos = ascii_strcasestr (*string, name);
- free (name);
- if (pos)
- {
- pos2 = pos + strlen (item);
- if (pos2[0] == ':')
- {
- pos2++;
- *pos_found = pos2;
- pos_comma = strchr (pos2, ',');
- if (pos_comma)
- *length = pos_comma - pos2;
- else
- *length = strlen (pos2);
- }
- }
-}
-
-/*
- * config_get_server_option_ptr: get a pointer to a server config option
- */
-
-void *
-config_get_server_option_ptr (t_irc_server *server, char *option_name)
-{
- if (ascii_strcasecmp (option_name, "server_name") == 0)
- return (void *)(&server->name);
- if (ascii_strcasecmp (option_name, "server_autoconnect") == 0)
- return (void *)(&server->autoconnect);
- if (ascii_strcasecmp (option_name, "server_autoreconnect") == 0)
- return (void *)(&server->autoreconnect);
- if (ascii_strcasecmp (option_name, "server_autoreconnect_delay") == 0)
- return (void *)(&server->autoreconnect_delay);
- if (ascii_strcasecmp (option_name, "server_address") == 0)
- return (void *)(&server->address);
- if (ascii_strcasecmp (option_name, "server_port") == 0)
- return (void *)(&server->port);
- if (ascii_strcasecmp (option_name, "server_ipv6") == 0)
- return (void *)(&server->ipv6);
- if (ascii_strcasecmp (option_name, "server_ssl") == 0)
- return (void *)(&server->ssl);
- if (ascii_strcasecmp (option_name, "server_password") == 0)
- return (void *)(&server->password);
- if (ascii_strcasecmp (option_name, "server_nick1") == 0)
- return (void *)(&server->nick1);
- if (ascii_strcasecmp (option_name, "server_nick2") == 0)
- return (void *)(&server->nick2);
- if (ascii_strcasecmp (option_name, "server_nick3") == 0)
- return (void *)(&server->nick3);
- if (ascii_strcasecmp (option_name, "server_username") == 0)
- return (void *)(&server->username);
- if (ascii_strcasecmp (option_name, "server_realname") == 0)
- return (void *)(&server->realname);
- if (ascii_strcasecmp (option_name, "server_hostname") == 0)
- return (void *)(&server->hostname);
- if (ascii_strcasecmp (option_name, "server_command") == 0)
- return (void *)(&server->command);
- if (ascii_strcasecmp (option_name, "server_command_delay") == 0)
- return (void *)(&server->command_delay);
- if (ascii_strcasecmp (option_name, "server_autojoin") == 0)
- return (void *)(&server->autojoin);
- if (ascii_strcasecmp (option_name, "server_autorejoin") == 0)
- return (void *)(&server->autorejoin);
- if (ascii_strcasecmp (option_name, "server_notify_levels") == 0)
- return (void *)(&server->notify_levels);
- /* option not found */
- return NULL;
-}
-
-/*
- * config_set_server_value: set new value for an option
- * return: 0 if success
- * -1 if option not found
- * -2 if bad value
- */
-
-int
-config_set_server_value (t_irc_server *server, char *option_name,
- char *value)
-{
- t_config_option *ptr_option;
- int i;
- void *ptr_data;
- int int_value;
-
- ptr_data = config_get_server_option_ptr (server, option_name);
- if (!ptr_data)
- return -1;
-
- ptr_option = NULL;
- for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
- {
- /* if option found, return pointer */
- if (ascii_strcasecmp (weechat_options[CONFIG_SECTION_SERVER][i].option_name, option_name) == 0)
- {
- ptr_option = &weechat_options[CONFIG_SECTION_SERVER][i];
- break;
- }
- }
- if (!ptr_option)
- return -1;
-
- switch (ptr_option->option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- int_value = config_option_get_boolean_value (value);
- switch (int_value)
- {
- case BOOL_TRUE:
- *((int *)(ptr_data)) = BOOL_TRUE;
- break;
- case BOOL_FALSE:
- *((int *)(ptr_data)) = BOOL_FALSE;
- break;
- default:
- return -2;
- }
- break;
- case OPTION_TYPE_INT:
- int_value = atoi (value);
- if ((int_value < ptr_option->min) || (int_value > ptr_option->max))
- return -2;
- *((int *)(ptr_data)) = int_value;
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- int_value = config_get_pos_array_values (ptr_option->array_values,
- value);
- if (int_value < 0)
- return -2;
- *((int *)(ptr_data)) = int_value;
- break;
- case OPTION_TYPE_COLOR:
- if (!gui_color_assign ((int *)ptr_data, value))
- return -2;
- break;
- case OPTION_TYPE_STRING:
- if (*((char **)ptr_data))
- free (*((char **)ptr_data));
- *((char **)ptr_data) = strdup (value);
- break;
- }
- if (ptr_option->handler_change != NULL)
- (void) (ptr_option->handler_change());
- return 0;
-}
-
-/*
- * config_option_search: look for an option and return pointer to this option
- * if option is not found, NULL is returned
- */
-
-t_config_option *
-config_option_search (char *option_name)
-{
- int i, j;
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- /* if option found, return pointer */
- if (ascii_strcasecmp (weechat_options[i][j].option_name, option_name) == 0)
- return &weechat_options[i][j];
- }
- }
- }
- /* option not found */
- return NULL;
-}
-
-/*
- * config_option_search_option_value: look for type and value of an option
- * (including server options)
- * if option is not found, NULL is returned
- */
-
-void
-config_option_search_option_value (char *option_name, t_config_option **option,
- void **option_value)
-{
- t_config_option *ptr_option;
- t_irc_server *ptr_server;
- int i;
- void *ptr_value;
- char *pos;
-
- ptr_option = NULL;
- ptr_value = NULL;
-
- ptr_option = config_option_search (option_name);
- if (!ptr_option)
- {
- pos = strchr (option_name, '.');
- if (pos)
- {
- pos[0] = '\0';
- ptr_server = irc_server_search (option_name);
- if (ptr_server)
- {
- for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
- {
- if (strcmp (weechat_options[CONFIG_SECTION_SERVER][i].option_name,
- pos + 1) == 0)
- {
- ptr_option = &weechat_options[CONFIG_SECTION_SERVER][i];
- ptr_value = config_get_server_option_ptr (ptr_server, pos + 1);
- break;
- }
- }
- }
- pos[0] = '.';
- }
- }
- else
- {
- switch (ptr_option->option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- case OPTION_TYPE_INT:
- case OPTION_TYPE_INT_WITH_STRING:
- case OPTION_TYPE_COLOR:
- ptr_value = (void *)(ptr_option->ptr_int);
- break;
- case OPTION_TYPE_STRING:
- ptr_value = (void *)(ptr_option->ptr_string);
- break;
- }
- }
-
- if (ptr_option)
- {
- *option = ptr_option;
- *option_value = ptr_value;
- }
-}
-
-/*
- * config_set_value: set new value for an option (found by name)
- * return: 0 if success
- * -1 if bad value for option
- * -2 if option is not found
- */
-
-int
-config_set_value (char *option_name, char *value)
-{
- t_config_option *ptr_option;
-
- ptr_option = config_option_search (option_name);
- if (ptr_option)
- return config_option_set_value (ptr_option, value);
- else
- return -2;
-}
-
-/*
- * config_allocate_server: allocate a new server
- */
-
-int
-config_allocate_server (char *filename, int line_number)
-{
- if (!cfg_server.name
- || !cfg_server.address
- || cfg_server.port < 0
- || !cfg_server.nick1
- || !cfg_server.nick2
- || !cfg_server.nick3
- || !cfg_server.username
- || !cfg_server.realname)
- {
- irc_server_free_all ();
- gui_printf (NULL,
- _("%s %s, line %d: new server, but previous was incomplete\n"),
- WEECHAT_WARNING, filename, line_number);
- return 0;
-
- }
- if (irc_server_name_already_exists (cfg_server.name))
- {
- irc_server_free_all ();
- gui_printf (NULL,
- _("%s %s, line %d: server '%s' already exists\n"),
- WEECHAT_WARNING, filename, line_number, cfg_server.name);
- return 0;
- }
- if (!irc_server_new (cfg_server.name,
- cfg_server.autoconnect, cfg_server.autoreconnect,
- cfg_server.autoreconnect_delay, 0, cfg_server.address,
- cfg_server.port, cfg_server.ipv6, cfg_server.ssl,
- cfg_server.password, cfg_server.nick1, cfg_server.nick2,
- cfg_server.nick3, cfg_server.username, cfg_server.realname,
- cfg_server.hostname, cfg_server.command,
- cfg_server.command_delay, cfg_server.autojoin,
- cfg_server.autorejoin, cfg_server.notify_levels))
- {
- irc_server_free_all ();
- gui_printf (NULL,
- _("%s %s, line %d: unable to create server\n"),
- WEECHAT_WARNING, filename, line_number);
- return 0;
- }
-
- irc_server_destroy (&cfg_server);
- irc_server_init (&cfg_server);
-
- return 1;
-}
-
-/*
- * config_default_values: initialize config variables with default values
- */
-
-void
-config_default_values ()
-{
- int i, j, int_value;
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- switch (weechat_options[i][j].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- case OPTION_TYPE_INT:
- *weechat_options[i][j].ptr_int =
- weechat_options[i][j].default_int;
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- int_value = config_get_pos_array_values (
- weechat_options[i][j].array_values,
- weechat_options[i][j].default_string);
- if (int_value < 0)
- gui_printf (NULL,
- _("%s unable to assign default int with string (\"%s\")\n"),
- WEECHAT_WARNING, weechat_options[i][j].default_string);
- else
- *weechat_options[i][j].ptr_int =
- int_value;
- break;
- case OPTION_TYPE_COLOR:
- if (!gui_color_assign (
- weechat_options[i][j].ptr_int,
- weechat_options[i][j].default_string))
- gui_printf (NULL,
- _("%s unable to assign default color (\"%s\")\n"),
- WEECHAT_WARNING, weechat_options[i][j].default_string);
- break;
- case OPTION_TYPE_STRING:
- *weechat_options[i][j].ptr_string =
- strdup (weechat_options[i][j].default_string);
- break;
- }
- }
- }
- }
-}
-
-/*
- * config_read: read WeeChat configuration
- * returns: 0 = successful
- * -1 = config file file not found
- * < -1 = other error (fatal)
- */
-
-int
-config_read ()
-{
- int filename_length;
- char *filename;
- FILE *file;
- int section, line_number, i, option_number;
- int server_found;
- char line[1024], *ptr_line, *ptr_line2, *pos, *pos2;
-
- filename_length = strlen (weechat_home) + strlen (WEECHAT_CONFIG_NAME) + 2;
- filename = (char *) malloc (filename_length * sizeof (char));
- if (!filename)
- return -2;
- snprintf (filename, filename_length, "%s%s" WEECHAT_CONFIG_NAME,
- weechat_home, DIR_SEPARATOR);
- if ((file = fopen (filename, "r")) == NULL)
- {
- gui_printf (NULL, _("%s config file \"%s\" not found.\n"),
- WEECHAT_WARNING, filename);
- free (filename);
- return -1;
- }
-
- config_default_values ();
- irc_server_init (&cfg_server);
-
- /* read config file */
- section = CONFIG_SECTION_NONE;
- server_found = 0;
- line_number = 0;
- while (!feof (file))
- {
- ptr_line = fgets (line, sizeof (line) - 1, file);
- line_number++;
- if (ptr_line)
- {
- /* encode line to internal charset */
- ptr_line2 = weechat_iconv_to_internal (NULL, ptr_line);
- if (ptr_line2)
- {
- snprintf (line, sizeof (line) - 1, "%s", ptr_line2);
- free (ptr_line2);
- }
-
- /* skip spaces */
- while (ptr_line[0] == ' ')
- ptr_line++;
- /* not a comment and not an empty line */
- if ((ptr_line[0] != '#') && (ptr_line[0] != '\r')
- && (ptr_line[0] != '\n'))
- {
- /* beginning of section */
- if (ptr_line[0] == '[')
- {
- pos = strchr (line, ']');
- if (pos == NULL)
- gui_printf (NULL,
- _("%s %s, line %d: invalid syntax, missing \"]\"\n"),
- WEECHAT_WARNING, filename, line_number);
- else
- {
- pos[0] = '\0';
- pos = ptr_line + 1;
- section = CONFIG_SECTION_NONE;
- for (i = 0; config_sections[i].section_name; i++)
- {
- if (strcmp (config_sections[i].section_name, pos) == 0)
- {
- section = i;
- break;
- }
- }
- if (section == CONFIG_SECTION_NONE)
- gui_printf (NULL,
- _("%s %s, line %d: unknown section identifier (\"%s\")\n"),
- WEECHAT_WARNING, filename, line_number, pos);
- else
- {
- if (server_found)
- {
- /* if server already started => create it */
- config_allocate_server (filename, line_number);
- }
- server_found = (section == CONFIG_SECTION_SERVER) ? 1 : 0;
- }
- }
- }
- else
- {
- if (section == CONFIG_SECTION_NONE)
- {
- gui_printf (NULL,
- _("%s %s, line %d: invalid section for option, line is ignored\n"),
- WEECHAT_WARNING, filename, line_number);
- }
- else
- {
- pos = strchr (line, '=');
- if (pos == NULL)
- gui_printf (NULL,
- _("%s %s, line %d: invalid syntax, missing \"=\"\n"),
- WEECHAT_WARNING, filename, line_number);
- else
- {
- pos[0] = '\0';
- pos++;
-
- /* remove spaces before '=' */
- pos2 = pos - 2;
- while ((pos2 > line) && (pos2[0] == ' '))
- {
- pos2[0] = '\0';
- pos2--;
- }
-
- /* skip spaces after '=' */
- while (pos[0] && (pos[0] == ' '))
- {
- pos++;
- }
-
- /* remove CR/LF */
- pos2 = strchr (pos, '\r');
- if (pos2 != NULL)
- pos2[0] = '\0';
- pos2 = strchr (pos, '\n');
- if (pos2 != NULL)
- pos2[0] = '\0';
-
- /* remove simple or double quotes
- and spaces at the end */
- if (strlen(pos) > 1)
- {
- pos2 = pos + strlen (pos) - 1;
- while ((pos2 > pos) && (pos2[0] == ' '))
- {
- pos2[0] = '\0';
- pos2--;
- }
- pos2 = pos + strlen (pos) - 1;
- if (((pos[0] == '\'') &&
- (pos2[0] == '\'')) ||
- ((pos[0] == '"') &&
- (pos2[0] == '"')))
- {
- pos2[0] = '\0';
- pos++;
- }
- }
-
- if (section == CONFIG_SECTION_KEYS)
- {
- if (pos[0])
- {
- /* bind key (overwrite any binding with same key) */
- gui_keyboard_bind (line, pos);
- }
- else
- {
- /* unbin key if no value given */
- gui_keyboard_unbind (line);
- }
- }
- else if (section == CONFIG_SECTION_ALIAS)
- {
- /* create new alias */
- if (alias_new (line, pos))
- weelist_add (&index_commands, &last_index_command,
- line, WEELIST_POS_SORT);
- }
- else if (section == CONFIG_SECTION_IGNORE)
- {
- /* create new ignore */
- if (ascii_strcasecmp (line, "ignore") != 0)
- gui_printf (NULL,
- _("%s %s, line %d: invalid option \"%s\"\n"),
- WEECHAT_WARNING, filename, line_number, line);
- else
- {
- if (!irc_ignore_add_from_config (pos))
- gui_printf (NULL,
- _("%s %s, line %d: invalid ignore options \"%s\"\n"),
- WEECHAT_WARNING, filename, line_number, pos);
- }
- }
- else
- {
- option_number = -1;
- for (i = 0;
- weechat_options[section][i].option_name; i++)
- {
- if (strcmp
- (weechat_options[section][i].option_name,
- ptr_line) == 0)
- {
- option_number = i;
- break;
- }
- }
- if (option_number < 0)
- gui_printf (NULL,
- _("%s %s, line %d: invalid option \"%s\"\n"),
- WEECHAT_WARNING, filename, line_number, ptr_line);
- else
- {
- if (config_option_set_value (&weechat_options[section][option_number], pos) < 0)
- {
- switch (weechat_options[section]
- [option_number].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- gui_printf (NULL,
- _("%s %s, line %d: invalid value for "
- "option '%s'\n"
- "Expected: boolean value: "
- "'off' or 'on'\n"),
- WEECHAT_WARNING, filename,
- line_number, ptr_line);
- break;
- case OPTION_TYPE_INT:
- gui_printf (NULL,
- _("%s %s, line %d: invalid value for "
- "option '%s'\n"
- "Expected: integer between %d "
- "and %d\n"),
- WEECHAT_WARNING, filename,
- line_number, ptr_line,
- weechat_options[section][option_number].min,
- weechat_options[section][option_number].max);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- gui_printf (NULL,
- _("%s %s, line %d: invalid value for "
- "option '%s'\n"
- "Expected: one of these strings: "),
- WEECHAT_WARNING, filename,
- line_number, ptr_line);
- i = 0;
- while (weechat_options[section][option_number].array_values[i])
- {
- gui_printf (NULL, "\"%s\" ",
- weechat_options[section][option_number].array_values[i]);
- i++;
- }
- gui_printf (NULL, "\n");
- break;
- case OPTION_TYPE_COLOR:
- gui_printf (NULL,
- _("%s %s, line %d: invalid color "
- "name for option '%s'\n"),
- WEECHAT_WARNING, filename,
- line_number,
- ptr_line);
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- if (server_found)
- {
- if (!config_allocate_server (filename, line_number))
- {
- fclose (file);
- free (filename);
- return -2;
- }
- }
-
- fclose (file);
- free (filename);
-
- return 0;
-}
-
-
-/*
- * config_create_default: create default WeeChat config
- * return: 0 if ok
- * < 0 if error
- */
-
-int
-config_create_default ()
-{
- int filename_length;
- char *filename;
- FILE *file;
- int i, j;
- time_t current_time;
- struct passwd *my_passwd;
- char *realname, *pos;
- t_gui_key *ptr_key;
- char *expanded_name, *function_name;
-
- filename_length = strlen (weechat_home) +
- strlen (WEECHAT_CONFIG_NAME) + 2;
- filename =
- (char *) malloc (filename_length * sizeof (char));
- if (!filename)
- return -2;
- snprintf (filename, filename_length, "%s%s" WEECHAT_CONFIG_NAME,
- weechat_home, DIR_SEPARATOR);
- if ((file = fopen (filename, "w")) == NULL)
- {
- gui_printf (NULL, _("%s cannot create file \"%s\"\n"),
- WEECHAT_ERROR, filename);
- free (filename);
- return -1;
- }
-
- weechat_iconv_fprintf (stdout, _("%s: creating default config file...\n"), PACKAGE_NAME);
- weechat_log_printf (_("Creating default config file\n"));
-
- current_time = time (NULL);
- weechat_iconv_fprintf (file, _("#\n# %s configuration file, created by "
- "%s v%s on %s"),
- PACKAGE_NAME, PACKAGE_NAME, PACKAGE_VERSION,
- ctime (&current_time));
- weechat_iconv_fprintf (file, _("# WARNING! Be careful when editing this file, "
- "WeeChat writes this file when exiting.\n#\n"));
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- weechat_iconv_fprintf (file, "\n[%s]\n", config_sections[i].section_name);
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- switch (weechat_options[i][j].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- weechat_iconv_fprintf (file, "%s = %s\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].default_int) ?
- "on" : "off");
- break;
- case OPTION_TYPE_INT:
- weechat_iconv_fprintf (file, "%s = %d\n",
- weechat_options[i][j].option_name,
- weechat_options[i][j].default_int);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- case OPTION_TYPE_COLOR:
- weechat_iconv_fprintf (file, "%s = %s\n",
- weechat_options[i][j].option_name,
- weechat_options[i][j].default_string);
- break;
- case OPTION_TYPE_STRING:
- weechat_iconv_fprintf (file, "%s = \"%s\"\n",
- weechat_options[i][j].option_name,
- weechat_options[i][j].default_string);
- break;
- }
- }
- }
- }
-
- /* default key bindings */
- weechat_iconv_fprintf (file, "\n[keys]\n");
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
- {
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
- if (ptr_key->function)
- {
- function_name = gui_keyboard_function_search_by_ptr (ptr_key->function);
- if (function_name)
- weechat_iconv_fprintf (file, "%s = \"%s%s%s\"\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- function_name,
- (ptr_key->args) ? " " : "",
- (ptr_key->args) ? ptr_key->args : "");
- }
- else
- weechat_iconv_fprintf (file, "%s = \"%s\"\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- ptr_key->command);
- if (expanded_name)
- free (expanded_name);
- }
-
- /* default aliases */
- weechat_iconv_fprintf (file, "\n[alias]\n");
- weechat_iconv_fprintf (file, "SAY = \"msg *\"\n");
- weechat_iconv_fprintf (file, "BYE = \"quit\"\n");
- weechat_iconv_fprintf (file, "EXIT = \"quit\"\n");
- weechat_iconv_fprintf (file, "SIGNOFF = \"quit\"\n");
- weechat_iconv_fprintf (file, "C = \"clear\"\n");
- weechat_iconv_fprintf (file, "CL = \"clear\"\n");
- weechat_iconv_fprintf (file, "CLOSE = \"buffer close\"\n");
- weechat_iconv_fprintf (file, "CHAT = \"dcc chat\"\n");
- weechat_iconv_fprintf (file, "IG = \"ignore\"\n");
- weechat_iconv_fprintf (file, "J = \"join\"\n");
- weechat_iconv_fprintf (file, "K = \"kick\"\n");
- weechat_iconv_fprintf (file, "KB = \"kickban\"\n");
- weechat_iconv_fprintf (file, "LEAVE = \"part\"\n");
- weechat_iconv_fprintf (file, "M = \"msg\"\n");
- weechat_iconv_fprintf (file, "MUB = \"unban *\"\n");
- weechat_iconv_fprintf (file, "N = \"names\"\n");
- weechat_iconv_fprintf (file, "Q = \"query\"\n");
- weechat_iconv_fprintf (file, "T = \"topic\"\n");
- weechat_iconv_fprintf (file, "UB = \"unban\"\n");
- weechat_iconv_fprintf (file, "UNIG = \"unignore\"\n");
- weechat_iconv_fprintf (file, "W = \"who\"\n");
- weechat_iconv_fprintf (file, "WC = \"window merge\"\n");
- weechat_iconv_fprintf (file, "WI = \"whois\"\n");
- weechat_iconv_fprintf (file, "WW = \"whowas\"\n");
-
- /* no ignore by default */
-
- /* default server is freenode */
- weechat_iconv_fprintf (file, "\n[server]\n");
- weechat_iconv_fprintf (file, "server_name = \"freenode\"\n");
- weechat_iconv_fprintf (file, "server_autoconnect = on\n");
- weechat_iconv_fprintf (file, "server_autoreconnect = on\n");
- weechat_iconv_fprintf (file, "server_autoreconnect_delay = 30\n");
- weechat_iconv_fprintf (file, "server_address = \"irc.freenode.net\"\n");
- weechat_iconv_fprintf (file, "server_port = 6667\n");
- weechat_iconv_fprintf (file, "server_ipv6 = off\n");
- weechat_iconv_fprintf (file, "server_ssl = off\n");
- weechat_iconv_fprintf (file, "server_password = \"\"\n");
-
- /* Get the user's name from /etc/passwd */
- if ((my_passwd = getpwuid (geteuid ())) != NULL)
- {
- weechat_iconv_fprintf (file, "server_nick1 = \"%s\"\n", my_passwd->pw_name);
- weechat_iconv_fprintf (file, "server_nick2 = \"%s1\"\n", my_passwd->pw_name);
- weechat_iconv_fprintf (file, "server_nick3 = \"%s2\"\n", my_passwd->pw_name);
- weechat_iconv_fprintf (file, "server_username = \"%s\"\n", my_passwd->pw_name);
- if ((!my_passwd->pw_gecos)
- || (my_passwd->pw_gecos[0] == '\0')
- || (my_passwd->pw_gecos[0] == ',')
- || (my_passwd->pw_gecos[0] == ' '))
- weechat_iconv_fprintf (file, "server_realname = \"%s\"\n", my_passwd->pw_name);
- else
- {
- realname = strdup (my_passwd->pw_gecos);
- pos = strchr (realname, ',');
- if (pos)
- pos[0] = '\0';
- weechat_iconv_fprintf (file, "server_realname = \"%s\"\n",
- realname);
- if (pos)
- pos[0] = ',';
- free (realname);
- }
- }
- else
- {
- /* default values if /etc/passwd can't be read */
- weechat_iconv_fprintf (stderr, "%s: %s (%s).",
- WEECHAT_WARNING,
- _("Unable to get user's name"),
- strerror (errno));
- weechat_iconv_fprintf (file, "server_nick1 = \"weechat1\"\n");
- weechat_iconv_fprintf (file, "server_nick2 = \"weechat2\"\n");
- weechat_iconv_fprintf (file, "server_nick3 = \"weechat3\"\n");
- weechat_iconv_fprintf (file, "server_username = \"weechat\"\n");
- weechat_iconv_fprintf (file, "server_realname = \"WeeChat default realname\"\n");
- }
-
- weechat_iconv_fprintf (file, "server_hostname = \"\"\n");
- weechat_iconv_fprintf (file, "server_command = \"\"\n");
- weechat_iconv_fprintf (file, "server_command_delay = 0\n");
- weechat_iconv_fprintf (file, "server_autojoin = \"\"\n");
- weechat_iconv_fprintf (file, "server_autorejoin = on\n");
- weechat_iconv_fprintf (file, "server_notify_levels = \"\"\n");
-
- fclose (file);
- chmod (filename, 0600);
- free (filename);
- return 0;
-}
-
-/*
- * config_write: write WeeChat configurtion
- * return: 0 if ok
- * < 0 if error
- */
-
-int
-config_write (char *config_name)
-{
- int filename_length;
- char *filename, *filename2;
- FILE *file;
- int i, j, rc;
- time_t current_time;
- t_irc_server *ptr_server;
- t_weechat_alias *ptr_alias;
- t_irc_ignore *ptr_ignore;
- t_gui_key *ptr_key;
- char *expanded_name, *function_name;
-
- if (config_name)
- {
- filename_length = strlen (config_name);
- filename = strdup (config_name);
- }
- else
- {
- filename_length = strlen (weechat_home) +
- strlen (WEECHAT_CONFIG_NAME) + 2;
- filename =
- (char *) malloc (filename_length * sizeof (char));
- if (!filename)
- return -2;
- snprintf (filename, filename_length, "%s%s" WEECHAT_CONFIG_NAME,
- weechat_home, DIR_SEPARATOR);
- }
-
- filename2 = (char *) malloc ((filename_length + 32) * sizeof (char));
- if (!filename2)
- {
- free (filename);
- return -2;
- }
- snprintf (filename2, filename_length + 32, "%s.weechattmp", filename);
-
- if ((file = fopen (filename2, "w")) == NULL)
- {
- gui_printf (NULL, _("%s cannot create file \"%s\"\n"),
- WEECHAT_ERROR, filename2);
- free (filename);
- free (filename2);
- return -1;
- }
-
- weechat_log_printf (_("Saving config to disk\n"));
-
- current_time = time (NULL);
- weechat_iconv_fprintf (file, _("#\n# %s configuration file, created by "
- "%s v%s on %s"),
- PACKAGE_NAME, PACKAGE_NAME, PACKAGE_VERSION,
- ctime (&current_time));
- weechat_iconv_fprintf (file, _("# WARNING! Be careful when editing this file, "
- "WeeChat writes this file when exiting.\n#\n"));
-
- for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
- {
- if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
- && (i != CONFIG_SECTION_IGNORE) && (i != CONFIG_SECTION_SERVER))
- {
- weechat_iconv_fprintf (file, "\n[%s]\n", config_sections[i].section_name);
- for (j = 0; weechat_options[i][j].option_name; j++)
- {
- switch (weechat_options[i][j].option_type)
- {
- case OPTION_TYPE_BOOLEAN:
- weechat_iconv_fprintf (file, "%s = %s\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].ptr_int &&
- *weechat_options[i][j].ptr_int) ?
- "on" : "off");
- break;
- case OPTION_TYPE_INT:
- weechat_iconv_fprintf (file, "%s = %d\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].ptr_int) ?
- *weechat_options[i][j].ptr_int :
- weechat_options[i][j].default_int);
- break;
- case OPTION_TYPE_INT_WITH_STRING:
- weechat_iconv_fprintf (file, "%s = %s\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].ptr_int) ?
- weechat_options[i][j].array_values[*weechat_options[i][j].ptr_int] :
- weechat_options[i][j].array_values[weechat_options[i][j].default_int]);
- break;
- case OPTION_TYPE_COLOR:
- weechat_iconv_fprintf (file, "%s = %s\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].ptr_int) ?
- gui_color_get_name (*weechat_options[i][j].ptr_int) :
- weechat_options[i][j].default_string);
- break;
- case OPTION_TYPE_STRING:
- weechat_iconv_fprintf (file, "%s = \"%s\"\n",
- weechat_options[i][j].option_name,
- (weechat_options[i][j].ptr_string) ?
- *weechat_options[i][j].ptr_string :
- weechat_options[i][j].default_string);
- break;
- }
- }
- }
- }
-
- /* keys section */
- weechat_iconv_fprintf (file, "\n[keys]\n");
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
- {
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
- if (ptr_key->function)
- {
- function_name = gui_keyboard_function_search_by_ptr (ptr_key->function);
- if (function_name)
- weechat_iconv_fprintf (file, "%s = \"%s%s%s\"\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- function_name,
- (ptr_key->args) ? " " : "",
- (ptr_key->args) ? ptr_key->args : "");
- }
- else
- weechat_iconv_fprintf (file, "%s = \"%s\"\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- ptr_key->command);
- if (expanded_name)
- free (expanded_name);
- }
-
- /* alias section */
- weechat_iconv_fprintf (file, "\n[alias]\n");
- for (ptr_alias = weechat_alias; ptr_alias;
- ptr_alias = ptr_alias->next_alias)
- {
- weechat_iconv_fprintf (file, "%s = \"%s\"\n",
- ptr_alias->alias_name, ptr_alias->alias_command);
- }
-
- /* ignore section */
- weechat_iconv_fprintf (file, "\n[ignore]\n");
- for (ptr_ignore = irc_ignore; ptr_ignore;
- ptr_ignore = ptr_ignore->next_ignore)
- {
- weechat_iconv_fprintf (file, "ignore = \"%s,%s,%s,%s\"\n",
- ptr_ignore->mask,
- ptr_ignore->type,
- ptr_ignore->channel_name,
- ptr_ignore->server_name);
- }
-
- /* server section */
- for (ptr_server = irc_servers; ptr_server;
- ptr_server = ptr_server->next_server)
- {
- if (!ptr_server->temp_server)
- {
- weechat_iconv_fprintf (file, "\n[server]\n");
- weechat_iconv_fprintf (file, "server_name = \"%s\"\n", ptr_server->name);
- weechat_iconv_fprintf (file, "server_autoconnect = %s\n",
- (ptr_server->autoconnect) ? "on" : "off");
- weechat_iconv_fprintf (file, "server_autoreconnect = %s\n",
- (ptr_server->autoreconnect) ? "on" : "off");
- weechat_iconv_fprintf (file, "server_autoreconnect_delay = %d\n",
- ptr_server->autoreconnect_delay);
- weechat_iconv_fprintf (file, "server_address = \"%s\"\n", ptr_server->address);
- weechat_iconv_fprintf (file, "server_port = %d\n", ptr_server->port);
- weechat_iconv_fprintf (file, "server_ipv6 = %s\n",
- (ptr_server->ipv6) ? "on" : "off");
- weechat_iconv_fprintf (file, "server_ssl = %s\n",
- (ptr_server->ssl) ? "on" : "off");
- weechat_iconv_fprintf (file, "server_password = \"%s\"\n",
- (ptr_server->password) ? ptr_server->password : "");
- weechat_iconv_fprintf (file, "server_nick1 = \"%s\"\n", ptr_server->nick1);
- weechat_iconv_fprintf (file, "server_nick2 = \"%s\"\n", ptr_server->nick2);
- weechat_iconv_fprintf (file, "server_nick3 = \"%s\"\n", ptr_server->nick3);
- weechat_iconv_fprintf (file, "server_username = \"%s\"\n", ptr_server->username);
- weechat_iconv_fprintf (file, "server_realname = \"%s\"\n", ptr_server->realname);
- weechat_iconv_fprintf (file, "server_hostname = \"%s\"\n",
- (ptr_server->hostname) ? ptr_server->hostname : "");
- weechat_iconv_fprintf (file, "server_command = \"%s\"\n",
- (ptr_server->command) ? ptr_server->command : "");
- weechat_iconv_fprintf (file, "server_command_delay = %d\n", ptr_server->command_delay);
- weechat_iconv_fprintf (file, "server_autojoin = \"%s\"\n",
- (ptr_server->autojoin) ? ptr_server->autojoin : "");
- weechat_iconv_fprintf (file, "server_autorejoin = %s\n",
- (ptr_server->autorejoin) ? "on" : "off");
- weechat_iconv_fprintf (file, "server_notify_levels = \"%s\"\n",
- (ptr_server->notify_levels) ? ptr_server->notify_levels : "");
- }
- }
-
- fclose (file);
- chmod (filename2, 0600);
- unlink (filename);
- rc = rename (filename2, filename);
- free (filename);
- free (filename2);
- if (rc != 0)
- return -1;
- return 0;
-}
diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h
deleted file mode 100644
index cac086840..000000000
--- a/src/common/weeconfig.h
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_CONFIG_H
-#define __WEECHAT_CONFIG_H 1
-
-#include "../protocols/irc/irc.h"
-
-#define WEECHAT_CONFIG_NAME "weechat.rc"
-
-#define CONFIG_SECTION_NONE -1
-#define CONFIG_SECTION_LOOK 0
-#define CONFIG_SECTION_COLORS 1
-#define CONFIG_SECTION_HISTORY 2
-#define CONFIG_SECTION_LOG 3
-#define CONFIG_SECTION_IRC 4
-#define CONFIG_SECTION_DCC 5
-#define CONFIG_SECTION_PROXY 6
-#define CONFIG_SECTION_PLUGINS 7
-#define CONFIG_SECTION_KEYS 8
-#define CONFIG_SECTION_ALIAS 9
-#define CONFIG_SECTION_IGNORE 10
-#define CONFIG_SECTION_SERVER 11
-#define CONFIG_NUMBER_SECTIONS 12
-
-#define OPTION_TYPE_BOOLEAN 1 /* values: on/off */
-#define OPTION_TYPE_INT 2 /* values: from min to max */
-#define OPTION_TYPE_INT_WITH_STRING 3 /* values: one from **array_values */
-#define OPTION_TYPE_COLOR 4 /* values: a color name */
-#define OPTION_TYPE_STRING 5 /* values: any string, may be empty */
-
-#define BOOL_FALSE 0
-#define BOOL_TRUE 1
-
-#define CFG_LOOK_NICKLIST_LEFT 0
-#define CFG_LOOK_NICKLIST_RIGHT 1
-#define CFG_LOOK_NICKLIST_TOP 2
-#define CFG_LOOK_NICKLIST_BOTTOM 3
-
-#define CFG_LOOK_ALIGN_NICK_NONE 0
-#define CFG_LOOK_ALIGN_NICK_LEFT 1
-#define CFG_LOOK_ALIGN_NICK_RIGHT 2
-
-#define CFG_LOOK_HOTLIST_SORT_GROUP_TIME_ASC 0
-#define CFG_LOOK_HOTLIST_SORT_GROUP_TIME_DESC 1
-#define CFG_LOOK_HOTLIST_SORT_GROUP_NUMBER_ASC 2
-#define CFG_LOOK_HOTLIST_SORT_GROUP_NUMBER_DESC 3
-#define CFG_LOOK_HOTLIST_SORT_NUMBER_ASC 4
-#define CFG_LOOK_HOTLIST_SORT_NUMBER_DESC 5
-
-#define CFG_IRC_DISPLAY_AWAY_OFF 0
-#define CFG_IRC_DISPLAY_AWAY_LOCAL 1
-#define CFG_IRC_DISPLAY_AWAY_CHANNEL 2
-
-typedef struct t_config_section t_config_section;
-
-struct t_config_section
-{
- int section_number;
- char *section_name;
-};
-
-typedef struct t_config_option t_config_option;
-
-struct t_config_option
-{
- char *option_name;
- char *short_description;
- char *long_description;
- int option_type;
- int min, max;
- int default_int;
- char *default_string;
- char **array_values;
- int *ptr_int;
- char **ptr_string;
- void (*handler_change)();
-};
-
-extern int cfg_look_save_on_exit;
-extern int cfg_look_set_title;
-extern int cfg_look_startup_logo;
-extern int cfg_look_startup_version;
-extern char *cfg_look_weechat_slogan;
-extern int cfg_look_one_server_buffer;
-extern int cfg_look_open_near_server;
-extern int cfg_look_scroll_amount;
-extern char *cfg_look_buffer_timestamp;
-extern int cfg_look_color_nicks_number;
-extern int cfg_look_color_actions;
-extern int cfg_look_nicklist;
-extern int cfg_look_nicklist_position;
-extern int cfg_look_nicklist_min_size;
-extern int cfg_look_nicklist_max_size;
-extern int cfg_look_nicklist_separator;
-extern int cfg_look_nickmode;
-extern int cfg_look_nickmode_empty;
-extern char *cfg_look_no_nickname;
-extern char *cfg_look_nick_prefix;
-extern char *cfg_look_nick_suffix;
-extern int cfg_look_align_nick;
-extern int cfg_look_align_other;
-extern int cfg_look_align_size;
-extern int cfg_look_align_size_max;
-extern int cfg_look_align_text_offset;
-extern char *cfg_look_nick_completor;
-extern char *cfg_look_nick_completion_ignore;
-extern int cfg_look_nick_completion_smart;
-extern int cfg_look_nick_complete_first;
-extern int cfg_look_infobar;
-extern char *cfg_look_infobar_timestamp;
-extern int cfg_look_infobar_seconds;
-extern int cfg_look_infobar_delay_highlight;
-extern int cfg_look_hotlist_names_count;
-extern int cfg_look_hotlist_names_level;
-extern int cfg_look_hotlist_names_length;
-extern int cfg_look_hotlist_sort;
-extern int cfg_look_day_change;
-extern char *cfg_look_day_change_timestamp;
-extern char *cfg_look_read_marker;
-extern char *cfg_look_input_format;
-extern int cfg_look_paste_max_lines;
-
-extern int cfg_col_real_white;
-extern int cfg_col_separator;
-extern int cfg_col_title;
-extern int cfg_col_title_more;
-extern int cfg_col_title_bg;
-extern int cfg_col_chat;
-extern int cfg_col_chat_time;
-extern int cfg_col_chat_time_sep;
-extern int cfg_col_chat_prefix1;
-extern int cfg_col_chat_prefix2;
-extern int cfg_col_chat_server;
-extern int cfg_col_chat_join;
-extern int cfg_col_chat_part;
-extern int cfg_col_chat_nick;
-extern int cfg_col_chat_host;
-extern int cfg_col_chat_channel;
-extern int cfg_col_chat_dark;
-extern int cfg_col_chat_highlight;
-extern int cfg_col_chat_bg;
-extern int cfg_col_chat_read_marker;
-extern int cfg_col_chat_read_marker_bg;
-extern int cfg_col_status;
-extern int cfg_col_status_delimiters;
-extern int cfg_col_status_channel;
-extern int cfg_col_status_data_msg;
-extern int cfg_col_status_data_private;
-extern int cfg_col_status_data_highlight;
-extern int cfg_col_status_data_other;
-extern int cfg_col_status_more;
-extern int cfg_col_status_bg;
-extern int cfg_col_infobar;
-extern int cfg_col_infobar_delimiters;
-extern int cfg_col_infobar_highlight;
-extern int cfg_col_infobar_bg;
-extern int cfg_col_input;
-extern int cfg_col_input_server;
-extern int cfg_col_input_channel;
-extern int cfg_col_input_nick;
-extern int cfg_col_input_delimiters;
-extern int cfg_col_input_text_not_found;
-extern int cfg_col_input_actions;
-extern int cfg_col_input_bg;
-extern int cfg_col_nick;
-extern int cfg_col_nick_away;
-extern int cfg_col_nick_chanowner;
-extern int cfg_col_nick_chanadmin;
-extern int cfg_col_nick_op;
-extern int cfg_col_nick_halfop;
-extern int cfg_col_nick_voice;
-extern int cfg_col_nick_user;
-extern int cfg_col_nick_more;
-extern int cfg_col_nick_sep;
-extern int cfg_col_nick_self;
-extern int cfg_col_nick_colors[GUI_COLOR_WIN_NICK_NUMBER];
-extern int cfg_col_nick_private;
-extern int cfg_col_nick_bg;
-extern int cfg_col_dcc_selected;
-extern int cfg_col_dcc_waiting;
-extern int cfg_col_dcc_connecting;
-extern int cfg_col_dcc_active;
-extern int cfg_col_dcc_done;
-extern int cfg_col_dcc_failed;
-extern int cfg_col_dcc_aborted;
-
-extern int cfg_history_max_lines;
-extern int cfg_history_max_commands;
-extern int cfg_history_display_default;
-
-extern int cfg_log_auto_server;
-extern int cfg_log_auto_channel;
-extern int cfg_log_auto_private;
-extern int cfg_log_plugin_msg;
-extern char *cfg_log_path;
-extern char *cfg_log_timestamp;
-extern int cfg_log_hide_nickserv_pwd;
-
-extern int cfg_irc_display_away;
-extern int cfg_irc_show_away_once;
-extern char *cfg_irc_default_msg_part;
-extern char *cfg_irc_default_msg_quit;
-extern int cfg_irc_notice_as_pv;
-extern int cfg_irc_away_check;
-extern int cfg_irc_away_check_max_nicks;
-extern int cfg_irc_lag_check;
-extern int cfg_irc_lag_min_show;
-extern int cfg_irc_lag_disconnect;
-extern int cfg_irc_anti_flood;
-extern int cfg_irc_fifo_pipe;
-extern char *cfg_irc_highlight;
-extern int cfg_irc_colors_receive;
-extern int cfg_irc_colors_send;
-extern int cfg_irc_send_unknown_commands;
-
-extern int cfg_dcc_auto_accept_files;
-extern int cfg_dcc_auto_accept_chats;
-extern int cfg_dcc_timeout;
-extern int cfg_dcc_blocksize;
-extern int cfg_dcc_fast_send;
-extern char *cfg_dcc_port_range;
-extern char *cfg_dcc_own_ip;
-extern char *cfg_dcc_download_path;
-extern char *cfg_dcc_upload_path;
-extern int cfg_dcc_convert_spaces;
-extern int cfg_dcc_auto_rename;
-extern int cfg_dcc_auto_resume;
-
-extern int cfg_proxy_use;
-extern int cfg_proxy_type;
-extern char *cfg_proxy_type_values[];
-extern int cfg_proxy_ipv6;
-extern char *cfg_proxy_address;
-extern int cfg_proxy_port;
-extern char *cfg_proxy_username;
-extern char *cfg_proxy_password;
-
-extern char *cfg_plugins_path;
-extern char *cfg_plugins_autoload;
-extern char *cfg_plugins_extension;
-
-extern t_config_section config_sections [CONFIG_NUMBER_SECTIONS];
-extern t_config_option * weechat_options [CONFIG_NUMBER_SECTIONS];
-
-extern char *config_get_section ();
-extern void config_change_noop ();
-extern void config_change_save_on_exit ();
-extern void config_change_title ();
-extern void config_change_buffers ();
-extern void config_change_buffer_content ();
-extern void config_change_hotlist ();
-extern void config_change_read_marker ();
-extern void config_change_charset ();
-extern void config_change_one_server_buffer ();
-extern void config_change_color ();
-extern void config_change_nicks_colors ();
-extern void config_change_away_check ();
-extern void config_change_fifo_pipe ();
-extern void config_change_notify_levels ();
-extern void config_change_log ();
-extern int config_option_set_value (t_config_option *, char *);
-extern void config_option_list_remove (char **, char *);
-extern void config_option_list_set (char **, char *, char *);
-extern void config_option_list_get_value (char **, char *, char **, int *);
-extern t_config_option *config_option_search (char *);
-extern void config_option_search_option_value (char *, t_config_option **, void **);
-extern int config_set_value (char *, char *);
-extern void *config_get_server_option_ptr (t_irc_server *, char *);
-extern int config_set_server_value (t_irc_server *, char *, char *);
-extern int config_read ();
-extern int config_create_default ();
-extern int config_write ();
-
-#endif /* weeconfig.h */
diff --git a/src/common/weelist.c b/src/common/weelist.c
deleted file mode 100644
index 3e0872eb6..000000000
--- a/src/common/weelist.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* weelist.c: sorted lists management */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "weechat.h"
-#include "weelist.h"
-#include "log.h"
-#include "util.h"
-
-
-/*
- * weelist_get_size: get list size (number of elements)
- */
-
-int
-weelist_get_size (t_weelist *weelist)
-{
- t_weelist *ptr_weelist;
- int count;
-
- count = 0;
-
- for (ptr_weelist = weelist; ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
- {
- count++;
- }
-
- return count;
-}
-
-/*
- * weelist_search: search date in a list
- */
-
-t_weelist *
-weelist_search (t_weelist *weelist, char *data)
-{
- t_weelist *ptr_weelist;
-
- for (ptr_weelist = weelist; ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
- {
- if (ascii_strcasecmp (data, ptr_weelist->data) == 0)
- return ptr_weelist;
- }
- /* word not found in list */
- return NULL;
-}
-
-/*
- * weelist_find_pos: find position for data (keeping list sorted)
- */
-
-t_weelist *
-weelist_find_pos (t_weelist *weelist, char *data)
-{
- t_weelist *ptr_weelist;
-
- for (ptr_weelist = weelist; ptr_weelist; ptr_weelist = ptr_weelist->next_weelist)
- {
- if (ascii_strcasecmp (data, ptr_weelist->data) < 0)
- return ptr_weelist;
- }
- /* position not found, best position is at the end */
- return NULL;
-}
-
-/*
- * weelist_insert: insert an element to the list (at good position)
- */
-
-void
-weelist_insert (t_weelist **weelist, t_weelist **last_weelist, t_weelist *element,
- int position)
-{
- t_weelist *pos_weelist;
-
- if (*weelist)
- {
- /* remove element if already in list */
- pos_weelist = weelist_search (*weelist, element->data);
- if (pos_weelist)
- weelist_remove (weelist, last_weelist, pos_weelist);
- }
-
- if (*weelist)
- {
- /* search position for new element, according to pos asked */
- pos_weelist = NULL;
- switch (position)
- {
- case WEELIST_POS_SORT:
- pos_weelist = weelist_find_pos (*weelist, element->data);
- break;
- case WEELIST_POS_BEGINNING:
- pos_weelist = *weelist;
- break;
- case WEELIST_POS_END:
- pos_weelist = NULL;
- break;
- }
-
- if (pos_weelist)
- {
- /* insert data into the list (before position found) */
- element->prev_weelist = pos_weelist->prev_weelist;
- element->next_weelist = pos_weelist;
- if (pos_weelist->prev_weelist)
- pos_weelist->prev_weelist->next_weelist = element;
- else
- *weelist = element;
- pos_weelist->prev_weelist = element;
- }
- else
- {
- /* add data to the end */
- element->prev_weelist = *last_weelist;
- element->next_weelist = NULL;
- (*last_weelist)->next_weelist = element;
- *last_weelist = element;
- }
- }
- else
- {
- element->prev_weelist = NULL;
- element->next_weelist = NULL;
- *weelist = element;
- *last_weelist = element;
- }
-}
-
-/*
- * weelist_add: create new data and add it to list
- */
-
-t_weelist *
-weelist_add (t_weelist **weelist, t_weelist **last_weelist, char *data,
- int position)
-{
- t_weelist *new_weelist;
-
- if (!data || (!data[0]))
- return NULL;
-
- if ((new_weelist = ((t_weelist *) malloc (sizeof (t_weelist)))))
- {
- new_weelist->data = strdup (data);
- weelist_insert (weelist, last_weelist, new_weelist, position);
- return new_weelist;
- }
- /* failed to allocate new element */
- return NULL;
-}
-
-/*
- * weelist_remove: remove an element from a list
- */
-
-void
-weelist_remove (t_weelist **weelist, t_weelist **last_weelist, t_weelist *element)
-{
- t_weelist *new_weelist;
-
- if (!element || !(*weelist))
- return;
-
- /* remove element from list */
- if (*last_weelist == element)
- *last_weelist = element->prev_weelist;
- if (element->prev_weelist)
- {
- (element->prev_weelist)->next_weelist = element->next_weelist;
- new_weelist = *weelist;
- }
- else
- new_weelist = element->next_weelist;
-
- if (element->next_weelist)
- (element->next_weelist)->prev_weelist = element->prev_weelist;
-
- /* free data */
- if (element->data)
- free (element->data);
- free (element);
- *weelist = new_weelist;
-}
-
-/*
- * weelist_remove_all: remove all elements from a list
- */
-
-void
-weelist_remove_all (t_weelist **weelist, t_weelist **last_weelist)
-{
- while (*weelist)
- {
- weelist_remove (weelist, last_weelist, *weelist);
- }
-}
-
-/*
- * weelist_print_log: print weelist in log (usually for crash dump)
- */
-
-void
-weelist_print_log (t_weelist *weelist, char *name)
-{
- t_weelist *ptr_weelist;
-
- for (ptr_weelist = weelist; ptr_weelist;
- ptr_weelist = ptr_weelist->next_weelist)
- {
- weechat_log_printf ("[%s (addr:0x%X)]\n", name, ptr_weelist);
- weechat_log_printf (" data . . . . . . . . . : '%s'\n", ptr_weelist->data);
- weechat_log_printf (" prev_weelist . . . . . : 0x%X\n", ptr_weelist->prev_weelist);
- weechat_log_printf (" next_weelist . . . . . : 0x%X\n", ptr_weelist->next_weelist);
- }
-}
diff --git a/src/common/weelist.h b/src/common/weelist.h
deleted file mode 100644
index 4cc9ffb83..000000000
--- a/src/common/weelist.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
- * See README for License detail, AUTHORS for developers list.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef __WEECHAT_LIST_H
-#define __WEECHAT_LIST_H 1
-
-#define WEELIST_POS_SORT 0
-#define WEELIST_POS_BEGINNING 1
-#define WEELIST_POS_END 2
-
-typedef struct t_weelist t_weelist;
-
-struct t_weelist
-{
- char *data;
- t_weelist *prev_weelist;
- t_weelist *next_weelist;
-};
-
-extern int weelist_get_size (t_weelist *);
-extern t_weelist *weelist_search (t_weelist *, char *);
-extern t_weelist *weelist_add (t_weelist **, t_weelist **, char *, int);
-extern void weelist_remove (t_weelist **, t_weelist **, t_weelist *);
-extern void weelist_remove_all (t_weelist **, t_weelist **);
-extern void weelist_print_log (t_weelist *, char *);
-
-#endif /* weelist.h */