/******************************************************************************
* TinTin++ *
* Copyright (C) 2004 (See CREDITS file) *
* *
* This program is protected under the GNU GPL (See COPYING) *
* *
* 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 *
******************************************************************************/
/******************************************************************************
* file: config.c - funtions related tintin++ configuration *
* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
* coded by Igor van den Hoven 2004 *
******************************************************************************/
#include "tintin.h"
DO_COMMAND(do_configure)
{
char left[BUFFER_SIZE], right[BUFFER_SIZE];
struct listroot *root;
struct listnode *node;
int index;
root = ses->list[LIST_CONFIG];
arg = get_arg_in_braces(arg, left, FALSE);
arg = sub_arg_in_braces(ses, arg, right, GET_ONE, SUB_VAR|SUB_FUN);
if (*left == 0)
{
tintin_header(ses, " CONFIGURATIONS ");
for (index = 0 ; *config_table[index].name != 0 ; index++)
{
node = search_node_list(ses->list[LIST_CONFIG], config_table[index].name);
if (node)
{
tintin_printf2(ses, "[%-13s] [%8s] %s",
node->left,
node->right,
strcmp(node->right, "ON") == 0 ? config_table[index].msg_on : config_table[index].msg_off);
}
}
tintin_header(ses, "");
}
else
{
for (index = 0 ; *config_table[index].name != 0 ; index++)
{
if (is_abbrev(left, config_table[index].name))
{
if (config_table[index].config(ses, right, index) != NULL)
{
show_message(ses, LIST_CONFIG, "#CONFIG {%s} HAS BEEN SET TO {%s}.", config_table[index].name, capitalize(right));
}
return ses;
}
}
tintin_printf(ses, "#ERROR: #CONFIG {%s} IS NOT A VALID OPTION.", capitalize(left));
}
return ses;
}
DO_CONFIG(config_speedwalk)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_SPEEDWALK);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_SPEEDWALK);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_verbatim)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_VERBATIM);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_VERBATIM);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_repeatenter)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_REPEATENTER);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_REPEATENTER);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_commandcolor)
{
char buf[BUFFER_SIZE];
if (!is_color_code(arg))
{
tintin_printf2(ses, "#CONFIG COMMAND COLOR: Invalid color code '%s'.", arg);
return NULL;
}
substitute(ses, arg, buf, SUB_COL);
RESTRING(ses->cmd_color, buf);
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, arg, "");
return ses;
}
DO_CONFIG(config_commandecho)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_ECHOCOMMAND);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_ECHOCOMMAND);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_verbose)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_VERBOSE);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_VERBOSE);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_wordwrap)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_WORDWRAP);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_WORDWRAP);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
SET_BIT(gtd->flags, TINTIN_FLAG_RESETBUFFER);
return ses;
}
DO_CONFIG(config_log)
{
if (!strcasecmp(arg, "HTML"))
{
DEL_BIT(ses->flags, SES_FLAG_LOGPLAIN);
SET_BIT(ses->flags, SES_FLAG_LOGHTML);
}
else if (!strcasecmp(arg, "PLAIN"))
{
SET_BIT(ses->flags, SES_FLAG_LOGPLAIN);
DEL_BIT(ses->flags, SES_FLAG_LOGHTML);
}
else if (!strcasecmp(arg, "RAW"))
{
DEL_BIT(ses->flags, SES_FLAG_LOGPLAIN);
DEL_BIT(ses->flags, SES_FLAG_LOGHTML);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG LOG <HTML|PLAIN|RAW>");
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_buffersize)
{
if (!is_number(arg))
{
tintin_printf(ses, "#SYNTAX: #CONFIG {BUFFER SIZE} <NUMBER>");
return NULL;
}
if (atoi(arg) < 100 || atoi(arg) > 999999)
{
tintin_printf(ses, "#ERROR: #CONFIG BUFFER: PROVIDE A NUMBER BETWEEN 100 and 999999");
return NULL;
}
init_buffer(ses, atoi(arg));
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_scrolllock)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_SCROLLLOCK);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_SCROLLLOCK);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_connectretry)
{
if (!is_number(arg))
{
tintin_printf(ses, "#SYNTAX: #CONFIG {CONNECT RETRY} <NUMBER>");
return NULL;
}
gts->connect_retry = atoll(arg) * 1000000LL;
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_packetpatch)
{
if (!is_number(arg))
{
tintin_printf(ses, "#SYNTAX: #CONFIG {PACKET PATCH} <NUMBER>");
return NULL;
}
if (atof(arg) < 0 || atof(arg) > 10)
{
tintin_printf(ses, "#ERROR: #CONFIG PACKET PATCH: PROVIDE A NUMBER BETWEEN 0.00 and 10.00");
return NULL;
}
gts->check_output = (long long) (get_number(ses, arg) * 1000000LL);
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_historysize)
{
if (!is_number(arg))
{
tintin_printf(ses, "#SYNTAX: #CONFIG {HISTORY SIZE} <NUMBER>");
}
if (atoi(arg) < 0 || atoi(arg) > 9999)
{
tintin_printf(ses, "#ERROR: #CONFIG HISTORY: PROVIDE A NUMBER BETWEEN 0 and 9999");
return NULL;
}
gtd->history_size = atoi(arg);
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_tintinchar)
{
gtd->tintin_char = arg[0];
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, arg, "");
return ses;
}
DO_CONFIG(config_verbatimchar)
{
gtd->verbatim_char = arg[0];
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, arg, "");
return ses;
}
DO_CONFIG(config_repeatchar)
{
gtd->repeat_char = arg[0];
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, arg, "");
return ses;
}
DO_CONFIG(config_debugtelnet)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->telopts, TELOPT_FLAG_DEBUG);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->telopts, TELOPT_FLAG_DEBUG);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_convertmeta)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_CONVERTMETA);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_CONVERTMETA);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_loglevel)
{
if (!strcasecmp(arg, "LOW"))
{
SET_BIT(ses->flags, SES_FLAG_LOGLEVEL);
}
else if (!strcasecmp(arg, "HIGH"))
{
DEL_BIT(ses->flags, SES_FLAG_LOGLEVEL);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <LOW|HIGH>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_colorpatch)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_COLORPATCH);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_COLORPATCH);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_mccp)
{
if (!strcasecmp(arg, "ON"))
{
SET_BIT(ses->flags, SES_FLAG_MCCP);
}
else if (!strcasecmp(arg, "OFF"))
{
DEL_BIT(ses->flags, SES_FLAG_MCCP);
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_autotab)
{
if (!is_number(arg))
{
tintin_printf(ses, "#SYNTAX: #CONFIG {AUTO TAB} <NUMBER>");
return NULL;
}
if (atoi(arg) < 1 || atoi(arg) > 999999)
{
tintin_printf(ses, "#ERROR: #CONFIG BUFFER: PROVIDE A NUMBER BETWEEN 1 and 999999");
return NULL;
}
ses->auto_tab = atoi(arg);
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}
DO_CONFIG(config_big5)
{
if (!strcasecmp(arg, "ON"))
{
#define BIG5
}
else if (!strcasecmp(arg, "OFF"))
{
#undef BIG5D
}
else
{
tintin_printf(ses, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
return NULL;
}
update_node_list(ses->list[LIST_CONFIG], config_table[index].name, capitalize(arg), "");
return ses;
}