summaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2003-09-27 10:01:11 +0000
committerSebastien Helleu <flashcode@flashtux.org>2003-09-27 10:01:11 +0000
commit109101faebaa56cc93916803898608328016bf46 (patch)
tree476e7ab1951995c0a980954d7a271cf272e4a835 /src/config.c
downloadweechat-109101faebaa56cc93916803898608328016bf46.zip
First CVS upload.
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c1021
1 files changed, 1021 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 000000000..ad93695b9
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,1021 @@
+/*
+ * Copyright (c) 2003 by FlashCode <flashcode@flashtux.org>
+ * Bounga <bounga@altern.org>
+ * Xahlexx <xahlexx@tuxisland.org>
+ * See README for License detail.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+/* config.c: WeeChat configuration */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <time.h>
+
+#include "weechat.h"
+#include "config.h"
+#include "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_DCC, "dcc" },
+ { CONFIG_SECTION_PROXY, "proxy" },
+ { CONFIG_SECTION_SERVER, "server" }
+};
+
+/* config, look & feel section */
+
+int cfg_look_startup_logo;
+int cfg_look_startup_version;
+char *cfg_look_weechat_slogan;
+int cfg_look_color_nicks;
+int cfg_look_color_actions;
+int cfg_look_remove_colors_from_msgs;
+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_nickmode;
+int cfg_look_nickmode_empty;
+char *cfg_look_no_nickname;
+char *cfg_look_completor;
+
+t_config_option weechat_options_look[] =
+{ { "look_startup_logo", N_("display " WEECHAT_NAME " logo at startup"),
+ N_("display " WEECHAT_NAME " logo at startup"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_look_startup_logo, NULL, NULL },
+ { "look_startup_version", N_("display " WEECHAT_NAME " version at startup"),
+ N_("display " WEECHAT_NAME " version at startup"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_look_startup_version, NULL, NULL },
+ { "look_weechat_slogan", N_(WEECHAT_NAME "slogan"),
+ N_(WEECHAT_NAME "slogan (if empty, slogan is not used)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "the geekest IRC client!", NULL, NULL, &cfg_look_weechat_slogan, NULL },
+ { "look_color_nicks", N_("display nick names with different colors"),
+ N_("display nick names with different colors"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_look_color_nicks, NULL, NULL },
+ { "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, NULL },
+ { "look_remove_colors_from_msgs", N_("remove colors from incoming messages"),
+ N_("remove colors from incoming messages"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_look_remove_colors_from_msgs, NULL, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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_completor, NULL },
+ { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
+};
+
+/* config, colors section */
+
+int cfg_col_title;
+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_nick;
+int cfg_col_chat_host;
+int cfg_col_chat_channel;
+int cfg_col_chat_dark;
+int cfg_col_chat_bg;
+int cfg_col_status;
+int cfg_col_status_active;
+int cfg_col_status_data_msg;
+int cfg_col_status_data_other;
+int cfg_col_status_more;
+int cfg_col_status_bg;
+int cfg_col_input;
+int cfg_col_input_channel;
+int cfg_col_input_nick;
+int cfg_col_input_bg;
+int cfg_col_nick;
+int cfg_col_nick_op;
+int cfg_col_nick_halfop;
+int cfg_col_nick_voice;
+int cfg_col_nick_sep;
+int cfg_col_nick_self;
+int cfg_col_nick_private;
+int cfg_col_nick_bg;
+
+t_config_option weechat_options_colors[] =
+{ /* title window */
+ { "col_title", N_("color for title bar"),
+ N_("color for title bar"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_title, NULL, NULL },
+ { "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, NULL },
+
+ /* chat window */
+ { "col_chat", N_("color for chat text"),
+ N_("color for chat text"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_chat, NULL, NULL },
+ { "col_chat_time", N_("color for time"),
+ N_("color for time in chat window"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_chat_time, NULL, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+
+ /* status window */
+ { "col_status", N_("color for status bar"),
+ N_("color for status bar"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_status, NULL, NULL },
+ { "col_status_active", N_("color for active window"),
+ N_("color for active window (status bar)"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "yellow", NULL, &cfg_col_status_active, NULL, NULL },
+ { "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,
+ "lightred", NULL, &cfg_col_status_data_msg, NULL, NULL },
+ { "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,
+ "lightmagenta", NULL, &cfg_col_status_data_other, NULL, NULL },
+ { "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, NULL },
+ { "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, NULL },
+
+ /* input window */
+ { "col_input", N_("color for input text"),
+ N_("color for input text"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_input, NULL, NULL },
+ { "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, NULL },
+ { "col_input_nick", N_("color for input text (nick name)"),
+ N_("color for input text (nick name)"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "lightgreen", NULL, &cfg_col_input_nick, NULL, NULL },
+ { "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, NULL },
+
+ /* nick window */
+ { "col_nick", N_("color for nicknames"),
+ N_("color for nicknames"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "gray", NULL, &cfg_col_nick, NULL, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "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,
+ "brown", NULL, &cfg_col_nick_private, NULL, NULL },
+ { "col_nick_bg", N_("background for nicknames"),
+ N_("background for nicknames"),
+ OPTION_TYPE_COLOR, 0, 0, 0,
+ "default", NULL, &cfg_col_nick_bg, NULL, NULL },
+
+ { 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;
+
+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, NULL },
+ { "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, NULL },
+ { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
+};
+
+/* config, log section */
+
+int cfg_log_auto_channels;
+int cfg_log_auto_private;
+char *cfg_log_path;
+char *cfg_log_name;
+char *cfg_log_timestamp;
+char *cfg_log_start_string;
+char *cfg_log_end_string;
+
+t_config_option weechat_options_log[] =
+{ { "log_auto_channels", N_("automatically log channel chats"),
+ N_("automatically log channel chats"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_log_auto_channels, NULL, NULL },
+ { "log_auto_private", N_("automatically log private chats"),
+ N_("automatically log private chats"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_log_auto_private, NULL, NULL },
+ { "log_path", N_("path for log files"),
+ N_("path for " WEECHAT_NAME " log files"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "~/.weechat/logs/", NULL, NULL, &cfg_log_path, NULL },
+ { "log_name", N_("name for log files"),
+ N_("name for log files (%S == irc server name, "
+ "%N == channel name (or nickname if private chat)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "%S,%N.weechatlog", NULL, NULL, &cfg_log_name, NULL },
+ { "log_timestamp", N_("timestamp for log"),
+ N_("timestamp for log (see man strftime for date/time specifiers)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "~", NULL, NULL, &cfg_log_timestamp, NULL },
+ { "log_start_string", N_("start string for log files"),
+ N_("text writed when starting new log file "
+ "(see man strftime for date/time specifiers)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "--- Log started %a %b %d %Y %H:%M:%s", NULL, NULL, &cfg_log_start_string, NULL },
+ { "log_end_string", N_("end string for log files"),
+ N_("text writed when ending log file "
+ "(see man strftime for date/time specifiers)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "--- Log ended %a %b %d %Y %H:%M:%s", NULL, NULL, &cfg_log_end_string, NULL },
+ { 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_max_size;
+int cfg_dcc_auto_accept_chats;
+int cfg_dcc_timeout;
+char *cfg_dcc_download_path;
+char *cfg_dcc_upload_path;
+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_TRUE,
+ NULL, NULL, &cfg_dcc_auto_accept_files, NULL, NULL },
+ { "dcc_auto_accept_max_size", N_("max size when auto accepting file"),
+ N_("maximum size for incoming file when automatically accepted"),
+ OPTION_TYPE_INT, 0, INT_MAX, 0,
+ NULL, NULL, &cfg_dcc_auto_accept_max_size, NULL, NULL },
+ { "dcc_auto_accept_chats", N_("automatically accept dcc chats"),
+ N_("automatically accept dcc chats (use carefully!)"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_dcc_auto_accept_chats, NULL, NULL },
+ { "dcc_timeout", N_("timeout for dcc request"),
+ N_("timeout for dcc request (in seconds)"),
+ OPTION_TYPE_INT, 1, INT_MAX, 300,
+ NULL, NULL, &cfg_dcc_timeout, NULL, NULL },
+ { "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, "~",
+ NULL, NULL, &cfg_dcc_download_path, NULL },
+ { "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, NULL },
+ { "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, NULL },
+ { "dcc_auto_resume", N_("automatically resume aborted transfers"),
+ N_("automatically resume dcc trsnafer if connection with remote host is loosed"),
+ OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
+ NULL, NULL, &cfg_dcc_auto_resume, NULL, NULL },
+ { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
+};
+
+/* config, proxy section */
+
+int cfg_proxy_use;
+char *cfg_proxy_address;
+int cfg_proxy_port;
+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, NULL },
+ { "proxy_address", N_("proxy address"),
+ N_("proxy server address (IP or hostname)"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "", NULL, NULL, &cfg_proxy_address, NULL },
+ { "proxy_port", N_("port for proxy"),
+ N_("port for connecting to proxy server"),
+ OPTION_TYPE_INT, 0, 65535, 1080,
+ NULL, NULL, &cfg_proxy_port, NULL, NULL },
+ { "proxy_password", N_("proxy password"),
+ N_("password for proxy server"),
+ OPTION_TYPE_STRING, 0, 0, 0,
+ "", NULL, NULL, &cfg_proxy_password, NULL },
+ { 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_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_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 },
+ { 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_dcc, weechat_options_proxy,
+ weechat_options_server
+};
+
+
+/*
+ * get_pos_array_values: returns position of a string in an array of values
+ * returns -1 if not found, otherwise position
+ */
+
+int
+get_pos_array_values (char **array, char *string)
+{
+ int i;
+
+ i = 0;
+ while (array[i])
+ {
+ if (strcasecmp (array[i], string) == 0)
+ return i;
+ i++;
+ }
+ /* string not found in array */
+ return -1;
+}
+
+/*
+ * config_init_server: init server struct
+ */
+
+void
+config_init_server ()
+{
+ cfg_server.name = NULL;
+ cfg_server.address = NULL;
+ cfg_server.port = -1;
+ cfg_server.password = NULL;
+ cfg_server.nick1 = NULL;
+ cfg_server.nick2 = NULL;
+ cfg_server.nick3 = NULL;
+ cfg_server.username = NULL;
+ cfg_server.realname = NULL;
+}
+
+/*
+ * 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)
+ {
+ 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 (server_name_already_exists (cfg_server.name))
+ {
+ 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 (!server_new (cfg_server.name,
+ cfg_server.address, cfg_server.port, cfg_server.password,
+ cfg_server.nick1, cfg_server.nick2, cfg_server.nick3,
+ cfg_server.username, cfg_server.realname))
+ {
+ server_free_all ();
+ gui_printf (NULL,
+ _("%s %s, line %d: unable to create server\n"),
+ WEECHAT_WARNING, filename, line_number);
+ return 0;
+ }
+ if (cfg_server.name)
+ free (cfg_server.name);
+ if (cfg_server.address)
+ free (cfg_server.address);
+ if (cfg_server.password)
+ free (cfg_server.password);
+ if (cfg_server.nick1)
+ free (cfg_server.nick1);
+ if (cfg_server.nick2)
+ free (cfg_server.nick2);
+ if (cfg_server.nick3)
+ free (cfg_server.nick3);
+ if (cfg_server.username)
+ free (cfg_server.username);
+ if (cfg_server.realname)
+ free (cfg_server.realname);
+ if (cfg_server.nick)
+ free (cfg_server.nick);
+
+ config_init_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_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 = 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_options[i][j].default_string);
+ else
+ *weechat_options[i][j].ptr_int =
+ int_value;
+ break;
+ case OPTION_TYPE_COLOR:
+ if (!gui_assign_color (
+ weechat_options[i][j].ptr_int,
+ weechat_options[i][j].default_string))
+ gui_printf (NULL,
+ _("%s unable to assign default color (\"%s\")\n"),
+ 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 ()
+{
+ char *filename;
+ FILE *file;
+ int section, line_number, i, option_number, int_value;
+ int server_found;
+ char line[1024], *ptr_line, *pos, *pos2;
+
+ filename =
+ (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char));
+ sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME"));
+ if ((file = fopen (filename, "rt")) == NULL)
+ {
+ gui_printf (NULL, _("%s config file \"%s\" not found.\n"),
+ WEECHAT_WARNING, filename);
+ free (filename);
+ return -1;
+ }
+
+ config_default_values ();
+ config_init_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)
+ {
+ /* 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);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ 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);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ if (server_found)
+ {
+ /* if server already started => create it */
+ if (!config_allocate_server (filename, line_number))
+ {
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ }
+ server_found = (section == CONFIG_SECTION_SERVER) ? 1 : 0;
+ }
+ else
+ {
+ pos = strchr (line, '=');
+ if (pos == NULL)
+ {
+ gui_printf (NULL,
+ _("%s %s, line %d: invalid syntax, missing \"=\"\n"),
+ WEECHAT_WARNING, filename, line_number);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ else
+ {
+ pos[0] = '\0';
+ pos++;
+ pos2 = strchr (pos, '\r');
+ if (pos2 != NULL)
+ pos2[0] = '\0';
+ pos2 = strchr (pos, '\n');
+ if (pos2 != NULL)
+ pos2[0] = '\0';
+ 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);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ else
+ {
+ switch (weechat_options[section]
+ [option_number].option_type)
+ {
+ case OPTION_TYPE_BOOLEAN:
+ if (strcasecmp (pos, "on") == 0)
+ *weechat_options[section]
+ [option_number].ptr_int = BOOL_TRUE;
+ else if (strcasecmp (pos, "off") == 0)
+ *weechat_options[section]
+ [option_number].ptr_int = BOOL_FALSE;
+ else
+ {
+ 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);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ break;
+ case OPTION_TYPE_INT:
+ int_value = atoi (pos);
+ if ((int_value <
+ weechat_options[section]
+ [option_number].min)
+ || (int_value >
+ weechat_options[section]
+ [option_number].max))
+ {
+ 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);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ *weechat_options[section][option_number].ptr_int =
+ int_value;
+ break;
+ case OPTION_TYPE_INT_WITH_STRING:
+ int_value = get_pos_array_values (
+ weechat_options[section][option_number].array_values,
+ pos);
+ if (int_value < 0)
+ {
+ 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");
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ *weechat_options[section][option_number].ptr_int =
+ int_value;
+ break;
+ case OPTION_TYPE_COLOR:
+ if (!gui_assign_color (
+ weechat_options[section][option_number].ptr_int,
+ pos))
+ {
+ gui_printf (NULL,
+ _("%s %s, line %d: invalid color "
+ "name for option '%s'\n"),
+ WEECHAT_WARNING, filename,
+ line_number,
+ ptr_line);
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ break;
+ case OPTION_TYPE_STRING:
+ if (*weechat_options[section]
+ [option_number].ptr_string)
+ free (*weechat_options[section][option_number].ptr_string);
+ *weechat_options[section][option_number].ptr_string =
+ strdup (pos);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (server_found)
+ {
+ if (!config_allocate_server (filename, line_number))
+ {
+ fclose (file);
+ free (filename);
+ return -2;
+ }
+ }
+
+ /* set default colors for colors not set */
+ /*for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
+ {
+ if (i != CONFIG_SECTION_SERVER)
+ {
+ for (j = 0; weechat_options[i][j].option_name; j++)
+ {
+ if ((weechat_options[i][j].option_type == OPTION_TYPE_COLOR) &&
+ (*weechat_options[i][j].ptr_int == COLOR_NOT_SET))
+ *weechat_options[i][j].ptr_int =
+ gui_get_color_by_name (weechat_options[i][j].default_string);
+ }
+ }
+ }*/
+
+ fclose (file);
+ free (filename);
+
+ return 0;
+}
+
+
+/*
+ * config_create_default: create default WeeChat config
+ */
+
+int
+config_create_default ()
+{
+ char *filename;
+ char line[1024];
+ FILE *file;
+ int i, j;
+ time_t current_time;
+
+ filename =
+ (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char));
+ sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME"));
+ if ((file = fopen (filename, "wt")) == NULL)
+ {
+ free (filename);
+ gui_printf (NULL, _("%s cannot create file \"%s\"\n"),
+ WEECHAT_ERROR, filename);
+ return -1;
+ }
+
+ printf (_(WEECHAT_NAME ": creating default config file...\n"));
+
+ current_time = time (NULL);
+ sprintf (line, _("#\n# " WEECHAT_NAME " configuration file, generated by "
+ WEECHAT_NAME " " WEECHAT_VERSION " on %s"), ctime (&current_time));
+ fputs (line, file);
+ fputs (_("# This file may be edited by user. Invalid syntax will prevent "
+ WEECHAT_NAME " from running!\n#\n"), file);
+
+ for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
+ {
+ if (i != CONFIG_SECTION_SERVER)
+ {
+ sprintf (line, "\n[%s]\n", config_sections[i].section_name);
+ fputs (line, file);
+ if ((i == CONFIG_SECTION_HISTORY) || (i == CONFIG_SECTION_LOG) ||
+ (i == CONFIG_SECTION_DCC) || (i == CONFIG_SECTION_PROXY))
+ {
+ sprintf (line,
+ "# WARNING!!! Options for section \"%s\" are not developed!\n",
+ config_sections[i].section_name);
+ fputs (line, file);
+ }
+ for (j = 0; weechat_options[i][j].option_name; j++)
+ {
+ switch (weechat_options[i][j].option_type)
+ {
+ case OPTION_TYPE_BOOLEAN:
+ sprintf (line, "%s=%s\n",
+ weechat_options[i][j].option_name,
+ (weechat_options[i][j].
+ default_int) ? "on" : "off");
+ break;
+ case OPTION_TYPE_INT:
+ sprintf (line, "%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:
+ case OPTION_TYPE_STRING:
+ sprintf (line, "%s=%s\n",
+ weechat_options[i][j].option_name,
+ weechat_options[i][j].default_string);
+ break;
+ }
+ fputs (line, file);
+ }
+ }
+ }
+
+ /* default server is freenode */
+ fputs ("\n[server]\n", file);
+ fputs ("server_name=freenode\n", file);
+ fputs ("server_address=irc.freenode.net\n", file);
+ fputs ("server_port=6667\n", file);
+ fputs ("server_password=\n", file);
+ fputs ("server_nick1=weechat_user\n", file);
+ fputs ("server_nick2=weechat2\n", file);
+ fputs ("server_nick3=weechat3\n", file);
+ fputs ("server_username=weechat\n", file);
+ fputs ("server_realname=WeeChat default realname\n", file);
+
+ fclose (file);
+ free (filename);
+ return 0;
+}
+
+/*
+ * config_write: write WeeChat configurtion
+ */
+
+void
+config_write ()
+{
+ /* TODO: write "config_write" function! */
+}