/******************************************************************************
* 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 *
******************************************************************************/
/******************************************************************************
* *
* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
* *
* coded by peter unold 1992 *
* modified by Bill Reiss 1993 *
* updated by Igor van den Hoven 2004 *
******************************************************************************/
#include <stdio.h>
#include <zlib.h>
#include <signal.h>
#include <ctype.h>
#include <stdarg.h>
#include <termios.h>
#include <pcre.h>
/******************************************************************************
* Autoconf patching by David Hedbor *
*******************************************************************************/
#include "config.h"
#if defined(HAVE_STRING_H)
#include <string.h>
#elif defined(HAVE_STRINGS_H)
#include <strings.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef TIME_WITH_SYS_TIME
#include <sys/time.h>
#endif
#ifdef SOCKS
#include <socks.h>
#endif
#ifndef BADSIG
#define BADSIG (RETSIGTYPE (*)(int))-1
#endif
#ifdef HAVE_NET_ERRNO_H
#include <net/errno.h>
#endif
#ifndef __TINTIN_H__
#define __TINTIN_H__
/*
Typedefs
*/
// typedef struct listnode LNODE;
/*
A bunch of constants
*/
#define FALSE 0
#define TRUE 1
#define GET_ONE 0 /* stop at spaces */
#define GET_ALL 1 /* stop at semicolon */
#define GET_NST 2 /* nest square brackets */
#define GET_VBT 4 /* ignore semicolon for verbatim mode */
#define TEL_N 0
#define TEL_Y 1
#define TEL_I 2
#define SCREEN_WIDTH 80
#define SCREEN_HEIGHT 24
#define PRIORITY 0
#define ALPHA 1
#define APPEND 2
#define DEFAULT_OPEN '{'
#define DEFAULT_CLOSE '}'
#define COMMAND_SEPARATOR ';'
#define HISTORY_FILE ".tt_history"
#define STRING_SIZE 45000
#define BUFFER_SIZE 20000
#define NUMBER_SIZE 100
#define LIST_SIZE 2
#define CLIENT_NAME "TinTin++"
#define CLIENT_VERSION "2.00.6"
#define ESCAPE 27
#define TELNET_PORT 23
#define TIMER_POLL_INPUT 0
#define TIMER_POLL_SESSIONS 1
#define TIMER_POLL_CHAT 2
#define TIMER_UPDATE_TICKS 3
#define TIMER_UPDATE_DELAYS 4
#define TIMER_UPDATE_PACKETS 5
#define TIMER_UPDATE_CHAT 6
#define TIMER_UPDATE_TERMINAL 7
#define TIMER_UPDATE_TIME 8
#define TIMER_UPDATE_MEMORY 9
#define TIMER_STALL_PROGRAM 10
#define TIMER_CPU 11
#define PULSE_PER_SECOND 20
#define PULSE_POLL_INPUT 1
#define PULSE_POLL_SESSIONS 1
#define PULSE_POLL_CHAT 2
#define PULSE_UPDATE_TICKS 1
#define PULSE_UPDATE_DELAYS 1
#define PULSE_UPDATE_PACKETS 2
#define PULSE_UPDATE_CHAT 2
#define PULSE_UPDATE_TERMINAL 1
#define PULSE_UPDATE_MEMORY 2
#define PULSE_UPDATE_TIME 20
/*
Index for lists used by tintin
*/
#define LIST_ACTION 0
#define LIST_ALIAS 1
#define LIST_CLASS 2
#define LIST_CONFIG 3
#define LIST_DELAY 4
#define LIST_EVENT 5
#define LIST_FUNCTION 6
#define LIST_GAG 7
#define LIST_HIGHLIGHT 8
#define LIST_HISTORY 9
#define LIST_MACRO 10
#define LIST_PATH 11
#define LIST_PATHDIR 12
#define LIST_PROMPT 13
#define LIST_SUBSTITUTE 14
#define LIST_TAB 15
#define LIST_TABCYCLE 16
#define LIST_TICKER 17
#define LIST_VARIABLE 18
#define LIST_MAX 19
/*
Command type
*/
enum operators
{
TOKEN_TYPE_BREAK,
TOKEN_TYPE_CASE,
TOKEN_TYPE_COMMAND,
TOKEN_TYPE_CONTINUE,
TOKEN_TYPE_DEFAULT,
TOKEN_TYPE_END,
TOKEN_TYPE_ELSE,
TOKEN_TYPE_ELSEIF,
TOKEN_TYPE_FOREACH,
TOKEN_TYPE_BROKEN_FOREACH,
TOKEN_TYPE_IF,
TOKEN_TYPE_LOOP,
TOKEN_TYPE_BROKEN_LOOP,
TOKEN_TYPE_PARSE,
TOKEN_TYPE_BROKEN_PARSE,
TOKEN_TYPE_REGEX,
TOKEN_TYPE_RETURN,
TOKEN_TYPE_SESSION,
TOKEN_TYPE_STRING,
TOKEN_TYPE_SWITCH,
TOKEN_TYPE_WHILE,
TOKEN_TYPE_BROKEN_WHILE
};
/*
generic define for show_message
*/
#define LIST_MESSAGE -1
/*
Various flags
*/
#define COL_BLD (1 << 1)
#define COL_UND (1 << 2)
#define COL_BLK (1 << 3)
#define COL_REV (1 << 4)
#define COL_XTF (1 << 5)
#define COL_XTB (1 << 6)
#define COL_256 (1 << 7)
#define CHAT_NAME_CHANGE 1
#define CHAT_REQUEST_CONNECTIONS 2
#define CHAT_CONNECTION_LIST 3
#define CHAT_TEXT_EVERYBODY 4
#define CHAT_TEXT_PERSONAL 5
#define CHAT_TEXT_GROUP 6
#define CHAT_MESSAGE 7
#define CHAT_DO_NOT_DISTURB 8
#define CHAT_SEND_ACTION 9
#define CHAT_SEND_ALIAS 10
#define CHAT_SEND_MACRO 11
#define CHAT_SEND_VARIABLE 12
#define CHAT_SEND_EVENT 13
#define CHAT_SEND_GAG 14
#define CHAT_SEND_HIGHLIGHT 15
#define CHAT_SEND_LIST 16
#define CHAT_SEND_ARRAY 17
#define CHAT_SEND_BARITEM 18
#define CHAT_VERSION 19
#define CHAT_FILE_START 20
#define CHAT_FILE_DENY 21
#define CHAT_FILE_BLOCK_REQUEST 22
#define CHAT_FILE_BLOCK 23
#define CHAT_FILE_END 24
#define CHAT_FILE_CANCEL 25
#define CHAT_PING_REQUEST 26
#define CHAT_PING_RESPONSE 27
#define CHAT_PEEK_CONNECTIONS 28
#define CHAT_PEEK_LIST 29
#define CHAT_SNOOP_START 30
#define CHAT_SNOOP_DATA 31
#define CHAT_END_OF_COMMAND 255
#define CHAT_FLAG_PRIVATE (1 << 1)
#define CHAT_FLAG_REQUEST (1 << 2)
#define CHAT_FLAG_SERVE (1 << 3)
#define CHAT_FLAG_IGNORE (1 << 4)
#define CHAT_FLAG_FORWARD (1 << 5)
#define CHAT_FLAG_FORWARDBY (1 << 6)
#define CHAT_FLAG_FORWARDALL (1 << 7)
#define CHAT_FLAG_DND (1 << 8)
#define CHAT_FLAG_LINKLOST (1 << 9)
#define SUB_NONE 0
#define SUB_ARG (1 << 0)
#define SUB_VAR (1 << 1)
#define SUB_FUN (1 << 2)
#define SUB_COL (1 << 3)
#define SUB_ESC (1 << 4)
#define SUB_CMD (1 << 5)
#define SUB_SEC (1 << 6)
#define SUB_EOL (1 << 7)
#define SUB_LNF (1 << 8)
#define SUB_FIX (1 << 9)
#define TINTIN_FLAG_RESETBUFFER (1 << 0)
#define TINTIN_FLAG_CONVERTMETACHAR (1 << 1)
#define TINTIN_FLAG_HISTORYBROWSE (1 << 2)
#define TINTIN_FLAG_HISTORYSEARCH (1 << 3)
#define TINTIN_FLAG_PROCESSINPUT (1 << 4)
#define TINTIN_FLAG_USERCOMMAND (1 << 5) /* Unused */
#define TINTIN_FLAG_INSERTINPUT (1 << 6)
#define TINTIN_FLAG_VERBATIM (1 << 7) /* Unused */
#define TINTIN_FLAG_TERMINATE (1 << 8)
#define SES_FLAG_ECHOCOMMAND (1 << 1)
#define SES_FLAG_SNOOP (1 << 2)
#define SES_FLAG_MCCP (1 << 3)
#define SES_FLAG_MAPPING (1 << 4)
#define SES_FLAG_SPLIT (1 << 5)
#define SES_FLAG_SPEEDWALK (1 << 6)
#define SES_FLAG_READMUD (1 << 8)
#define SES_FLAG_WORDWRAP (1 << 9)
#define SES_FLAG_VERBATIM (1 << 10)
#define SES_FLAG_CONNECTED (1 << 11)
#define SES_FLAG_REPEATENTER (1 << 12)
#define SES_FLAG_VERBOSE (1 << 13)
#define SES_FLAG_VERBOSELINE (1 << 14) /* Unused */
#define SES_FLAG_LOGLEVEL (1 << 15)
#define SES_FLAG_LOGPLAIN (1 << 16)
#define SES_FLAG_LOGHTML (1 << 17)
#define SES_FLAG_GAG (1 << 18)
#define SES_FLAG_UPDATEVTMAP (1 << 19)
#define SES_FLAG_COLORPATCH (1 << 20)
#define SES_FLAG_SCROLLLOCK (1 << 21)
#define SES_FLAG_SCAN (1 << 22)
#define SES_FLAG_SCROLLSTOP (1 << 23)
#define SES_FLAG_CONVERTMETA (1 << 24)
#define SES_FLAG_RUN (1 << 25)
#define TELOPT_FLAG_SGA (1 << 0)
#define TELOPT_FLAG_ECHO (1 << 1)
#define TELOPT_FLAG_NAWS (1 << 2)
#define TELOPT_FLAG_PROMPT (1 << 3)
#define TELOPT_FLAG_DEBUG (1 << 4)
#define TELOPT_FLAG_TSPEED (1 << 5)
#define TELOPT_FLAG_TTYPE (1 << 6)
#define LIST_FLAG_IGNORE (1 << 0)
#define LIST_FLAG_MESSAGE (1 << 1)
#define LIST_FLAG_DEBUG (1 << 2)
#define LIST_FLAG_LOG (1 << 3)
#define LIST_FLAG_CLASS (1 << 4)
#define LIST_FLAG_READ (1 << 5)
#define LIST_FLAG_WRITE (1 << 6)
#define LIST_FLAG_SHOW (1 << 7)
#define LIST_FLAG_INHERIT (1 << 8)
#define LIST_FLAG_NEST (1 << 9)
#define LIST_FLAG_DEFAULT LIST_FLAG_MESSAGE
#define NODE_FLAG_META (1 << 0)
#define NODE_FLAG_PCRE (1 << 1)
#define NODE_FLAG_VARS (1 << 2)
#define ROOM_FLAG_AVOID (1 << 0)
#define ROOM_FLAG_HIDE (1 << 1)
#define ROOM_FLAG_LEAVE (1 << 2)
#define ROOM_FLAG_VOID (1 << 3)
#define ROOM_FLAG_STATIC (1 << 4)
#define ROOM_FLAG_RIVER (1 << 5)
#define ROOM_FLAG_PATH (1 << 6)
#define EXIT_FLAG_HIDE (1 << 0)
#define MAP_FLAG_STATIC (1 << 0)
#define MAP_FLAG_VTMAP (1 << 1)
#define MAP_FLAG_VTGRAPHICS (1 << 2)
#define MAP_FLAG_ASCIIGRAPHICS (1 << 3)
#define MAP_FLAG_ASCIIVNUMS (1 << 4)
#define MAP_FLAG_MUDFONT (1 << 5)
#define MAP_FLAG_NOFOLLOW (1 << 6)
#define MAP_EXIT_N (1 << 0)
#define MAP_EXIT_E (1 << 1)
#define MAP_EXIT_S (1 << 2)
#define MAP_EXIT_W (1 << 3)
#define MAP_EXIT_U (1 << 4)
#define MAP_EXIT_D (1 << 5)
#define MAP_EXIT_NE (1 << 6)
#define MAP_EXIT_NW (1 << 7)
#define MAP_EXIT_SE (1 << 8)
#define MAP_EXIT_SW (1 << 9)
#define MAP_UNDO_CREATE (1 << 0)
#define MAP_UNDO_LINK (1 << 1)
#define STR_HASH_FLAG_NOGREP (1 << 0)
#define MAX_STR_HASH 10000
/*
Some macros to deal with double linked lists
*/
#define LINK(link, head, tail) \
{ \
if ((head) == NULL) \
{ \
(head) = (link); \
} \
else \
{ \
(tail)->next = (link); \
} \
(link)->next = NULL; \
(link)->prev = (tail); \
(tail) = (link); \
}
#define INSERT_LEFT(link, rght, head) \
{ \
(link)->prev = (rght)->prev; \
(rght)->prev = (link); \
(link)->next = (rght); \
\
if ((link)->prev) \
{ \
(link)->prev->next = (link); \
} \
else \
{ \
(head) = (link); \
} \
}
#define INSERT_RIGHT(link, left, tail) \
{ \
(link)->next = (left)->next; \
(left)->next = (link); \
(link)->prev = (left); \
\
if ((link)->next) \
{ \
(link)->next->prev = (link); \
} \
else \
{ \
(tail) = (link); \
} \
}
#define UNLINK(link, head, tail) \
{ \
if (((link)->prev == NULL && (link) != head) \
|| ((link)->next == NULL && (link) != tail)) \
{ \
tintin_printf2(NULL, "#UNLINK ERROR in file %s on line %d", __FILE__, __LINE__); \
dump_stack(); \
} \
if ((link)->prev == NULL) \
{ \
(head) = (link)->next; \
} \
else \
{ \
(link)->prev->next = (link)->next; \
} \
if ((link)->next == NULL) \
{ \
(tail) = (link)->prev; \
} \
else \
{ \
(link)->next->prev = (link)->prev; \
} \
(link)->next = NULL; \
(link)->prev = NULL; \
}
/*
string allocation
*/
#define RESTRING(point, value) \
{ \
free(point); \
point = strdup((value)); \
}
#define STRFREE(point) \
{ \
free((point)); \
point = NULL; \
}
#define URANGE(a, b, c) ((b) < (a) ? (a) : (b) > (c) ? (c) : (b))
#define UMAX(a, b) ((a) > (b) ? (a) : (b))
#define UMIN(a, b) ((a) < (b) ? (a) : (b))
#define up(u) (u < 99 ? u++ : u)
#define IS_SPLIT(ses) ((ses)->rows != (ses)->bot_row || (ses)->top_row != 1)
#define SCROLL(ses) ((ses)->cur_row == 0 || ((ses)->cur_row >= (ses)->top_row && (ses)->cur_row <= (ses)->bot_row) || (ses)->cur_row == (ses)->rows)
#define VERBATIM(ses) ((ses)->input_level == 0 && HAS_BIT((ses)->flags, SES_FLAG_VERBATIM))
#define DO_ARRAY(array) struct session *array (struct session *ses, struct listnode *list, char *arg)
#define DO_CHAT(chat) void chat (char *left, char *right)
#define DO_CLASS(class) struct session *class (struct session *ses, char *left, char *right)
#define DO_COMMAND(command) struct session *command (struct session *ses, char *arg)
#define DO_CONFIG(config) struct session *config (struct session *ses, char *arg, int index)
#define DO_MAP(map) void map (struct session *ses, char *arg, char *arg1, char *arg2)
#define DO_PATH(path) void path (struct session *ses, char *arg)
#define DO_LINE(line) struct session *line (struct session *ses, char *arg)
#define DO_CURSOR(cursor) void cursor (char *arg)
#define DO_HISTORY(history) void history (struct session *ses, char *arg)
#define DO_BUFFER(buffer) void buffer (struct session *ses, char *arg)
/*
Bit operations
*/
#define HAS_BIT(bitvector, bit) ((bitvector) & (bit))
#define SET_BIT(bitvector, bit) ((bitvector) |= (bit))
#define DEL_BIT(bitvector, bit) ((bitvector) &= (~(bit)))
#define TOG_BIT(bitvector, bit) ((bitvector) ^= (bit))
#define FFS_BIT(bitvector) ((ffs(bitvector) - 1))
/*
Compatibility
*/
#define atoll(str) (strtoll(str, NULL, 10))
/************************ structures *********************/
struct listroot
{
struct listnode ** list;
struct session * ses;
int size;
int used;
int type;
int update;
int flags;
};
struct listnode
{
struct listroot * root;
char * left;
char * right;
char * pr;
char * group;
pcre * regex;
long long data;
short flags;
};
struct session
{
struct session * next;
struct session * prev;
struct map_data * map;
z_stream * mccp;
char ** buffer;
char * name;
char * group;
FILE * logfile;
FILE * logline;
struct listroot * list[LIST_MAX];
struct listroot * history;
int rows;
int cols;
int top_row;
int bot_row;
int cur_row;
int sav_row;
int cur_col;
int sav_col;
int scroll_max;
int scroll_row;
int scroll_line;
int scroll_base;
int fgc;
int bgc;
int vtc;
int socket;
int telopts;
int telopt_flag[8];
int flags;
char * host;
char * ip;
char * port;
char * cmd_color;
unsigned char * read_buf;
int read_len;
int read_max;
int debug_level;
int input_level;
long long connect_retry;
int connect_error;
char more_output[BUFFER_SIZE];
char color[100];
long long check_output;
int auto_tab;
};
struct tintin_data
{
struct session * ses;
struct session * update;
struct session * dispose_next;
struct session * dispose_prev;
struct chat_data * chat;
struct termios old_terminal;
struct termios new_terminal;
char * mud_output_buf;
int mud_output_max;
int mud_output_len;
unsigned char * mccp_buf;
int mccp_len;
char input_buf[BUFFER_SIZE];
char input_tmp[BUFFER_SIZE];
char macro_buf[BUFFER_SIZE];
char paste_buf[BUFFER_SIZE];
int input_len;
int input_cur;
int input_pos;
int input_off;
long long time;
long long timer[TIMER_CPU][5];
long long total_io_ticks;
long long total_io_exec;
long long total_io_delay;
int str_hash_size;
int history_size;
int command_ref[26];
int flags;
int quiet;
char tintin_char;
char verbatim_char;
char repeat_char;
char * vars[100];
char * cmds[100];
int args[100];
};
struct chat_data
{
struct chat_data * next;
struct chat_data * prev;
char * name;
char * ip;
char * version;
char * download;
char * reply;
char * paste_buf;
char * color;
char * group;
int port;
int fd;
time_t timeout;
int flags;
long long paste_time;
FILE * file_pt;
char * file_name;
long long file_size;
int file_block_cnt;
int file_block_tot;
int file_block_patch;
long long file_start_time;
};
struct link_data
{
struct link_data * next;
struct link_data * prev;
char * str1;
char * str2;
char * str3;
};
/*
Typedefs
*/
typedef struct session *ARRAY (struct session *ses, struct listnode *list, char *arg);
typedef void CHAT (char *left, char *right);
typedef struct session *CLASS (struct session *ses, char *left, char *right);
typedef struct session *CONFIG (struct session *ses, char *arg, int index);
typedef struct session *COMMAND (struct session *ses, char *arg);
typedef void MAP (struct session *ses, char *arg, char *arg1, char *arg2);
typedef void CURSOR (char *arg);
typedef void PATH (struct session *ses, char *arg);
typedef struct session *LINE (struct session *ses, char *arg);
typedef void HISTORY (struct session *ses, char *arg);
typedef void BUFFER (struct session *ses, char *arg);
/*
Structures for tables.c
*/
struct array_type
{
char * name;
ARRAY * array;
int lval;
int rval;
};
struct chat_type
{
char * name;
CHAT * fun;
int lval;
int rval;
char * desc;
};
struct class_type
{
char * name;
CLASS * group;
};
struct color_type
{
char * name;
char * number;
char * code;
};
struct command_type
{
char * name;
COMMAND * command;
int type;
};
struct config_type
{
char * name;
char * msg_on;
char * msg_off;
CONFIG * config;
};
struct event_type
{
char * name;
char * desc;
};
struct list_type
{
char * name;
char * name_multi;
int mode;
int args;
int flags;
};
struct substitution_type
{
char * name;
int bitvector;
};
struct map_type
{
char * name;
MAP * map;
int check;
};
struct cursor_type
{
char * name;
char * desc;
char * code;
CURSOR * fun;
};
struct timer_type
{
char * name;
};
struct path_type
{
char * name;
PATH * fun;
};
struct line_type
{
char * name;
LINE * fun;
};
struct history_type
{
char * name;
HISTORY * fun;
char * desc;
};
struct buffer_type
{
char * name;
BUFFER * fun;
char * desc;
};
struct telopt_type
{
char * name;
int want;
int flag;
};
struct str_hash_data
{
struct str_hash_data * next;
struct str_hash_data * prev;
unsigned int count;
unsigned short flags;
unsigned short lines;
unsigned short hash;
};
struct str_hash_index_data
{
struct str_hash_data * f_node;
struct str_hash_data * l_node;
};
struct map_data
{
struct room_data ** room_list;
struct room_data ** grid;
FILE * logfile;
struct link_data * undo_head;
struct link_data * undo_tail;
char * exit_color;
char * path_color;
char * room_color;
int max_grid_x;
int max_grid_y;
int undo_size;
int size;
int flags;
int in_room;
int last_room;
short nofollow;
char legend[17][100];
};
struct room_data
{
struct exit_data * f_exit;
struct exit_data * l_exit;
int vnum;
int size;
int flags;
char * color;
char * name;
char * symbol;
char * desc;
char * area;
char * note;
};
struct exit_data
{
struct exit_data * next;
struct exit_data * prev;
int vnum;
int dir;
int flags;
char * name;
char * cmd;
};
#endif
/*
Function declarations
*/
#ifndef __ACTION_H__
#define __ACTION_H__
extern struct session *do_action(struct session *ses, char *arg);
extern struct session *do_unaction(struct session *ses, char *arg);
extern void check_all_actions(struct session *ses, char *original, char *line);
#endif
#ifndef __ADVERTISE_H__
#define __ADVERTISE_H__
extern DO_COMMAND(do_advertise);
#endif
#ifndef __CURSOR_H__
#define __CURSOR_H__
extern DO_COMMAND(do_cursor);
extern DO_CURSOR(cursor_backspace);
extern DO_CURSOR(cursor_buffer_down);
extern DO_CURSOR(cursor_buffer_end);
extern DO_CURSOR(cursor_buffer_home);
extern DO_CURSOR(cursor_buffer_lock);
extern DO_CURSOR(cursor_buffer_up);
extern DO_CURSOR(cursor_check_line);
extern DO_CURSOR(cursor_clear_left);
extern DO_CURSOR(cursor_clear_line);
extern DO_CURSOR(cursor_clear_right);
extern DO_CURSOR(cursor_convert_meta);
extern DO_CURSOR(cursor_delete);
extern DO_CURSOR(cursor_delete_exit);
extern DO_CURSOR(cursor_delete_word_left);
extern DO_CURSOR(cursor_delete_word_right);
extern DO_CURSOR(cursor_echo_on);
extern DO_CURSOR(cursor_echo_off);
extern DO_CURSOR(cursor_end);
extern DO_CURSOR(cursor_enter);
extern DO_CURSOR(cursor_exit);
extern DO_CURSOR(cursor_fix_line);
extern DO_CURSOR(cursor_history_find);
extern DO_CURSOR(cursor_history_next);
extern DO_CURSOR(cursor_history_prev);
extern DO_CURSOR(cursor_history_search);
extern DO_CURSOR(cursor_home);
extern DO_CURSOR(cursor_insert);
extern DO_CURSOR(cursor_left);
extern DO_CURSOR(cursor_left_word);
extern DO_CURSOR(cursor_paste_buffer);
extern DO_CURSOR(cursor_redraw_input);
extern DO_CURSOR(cursor_redraw_line);
extern DO_CURSOR(cursor_right);
extern DO_CURSOR(cursor_right_word);
extern DO_CURSOR(cursor_suspend);
extern DO_CURSOR(cursor_tab_backward);
extern DO_CURSOR(cursor_tab_forward);
extern DO_CURSOR(cursor_auto_tab_backward);
extern DO_CURSOR(cursor_auto_tab_forward);
extern DO_CURSOR(cursor_mixed_tab_backward);
extern DO_CURSOR(cursor_mixed_tab_forward);
#endif
#ifndef __INPUT_H__
#define __INPUT_H__
extern void process_input(void);
extern void read_line();
extern void read_key(void);
extern void convert_meta(char *input, char *output);
extern void unconvert_meta(char *input, char *output);
extern void echo_command(struct session *ses, char *line);
extern void input_printf(char *format, ...);
extern void modified_input(void);
#endif
#ifndef __ARRAY_H__
#define __ARRAY_H__
extern DO_COMMAND(do_list);
extern DO_ARRAY(array_add);
extern DO_ARRAY(array_clear);
extern DO_ARRAY(array_create);
extern DO_ARRAY(array_insert);
extern DO_ARRAY(array_delete);
extern DO_ARRAY(array_find);
extern DO_ARRAY(array_get);
extern DO_ARRAY(array_size);
extern DO_ARRAY(array_set);
extern DO_ARRAY(array_sort);
#endif
#ifndef __CHAT_H__
#define __CHAT_H__
extern DO_COMMAND(do_chat);
extern DO_CHAT(chat_accept);
extern DO_CHAT(chat_call);
extern DO_CHAT(chat_cancelfile);
extern DO_CHAT(chat_color);
extern DO_CHAT(chat_decline);
extern DO_CHAT(chat_dnd);
extern DO_CHAT(chat_downloaddir);
extern DO_CHAT(chat_emote);
extern DO_CHAT(chat_filestat);
extern DO_CHAT(chat_group);
extern DO_CHAT(chat_forward);
extern DO_CHAT(chat_forwardall);
extern DO_CHAT(chat_ignore);
extern DO_CHAT(chat_initialize);
extern DO_CHAT(chat_info);
extern DO_CHAT(chat_ip);
extern DO_CHAT(chat_message);
extern DO_CHAT(chat_name);
extern DO_CHAT(chat_paste);
extern DO_CHAT(chat_peek);
extern DO_CHAT(chat_ping);
extern DO_CHAT(chat_private);
extern DO_CHAT(chat_public);
extern DO_CHAT(chat_reply);
extern DO_CHAT(chat_request);
extern DO_CHAT(chat_send);
extern DO_CHAT(chat_sendfile);
extern DO_CHAT(chat_transfer);
extern DO_CHAT(chat_serve);
extern DO_CHAT(chat_uninitialize);
extern DO_CHAT(chat_who);
extern DO_CHAT(chat_zap);
extern int chat_new(int s);
extern void close_chat(struct chat_data *buddy, int unlink);
extern void process_chat_connections(fd_set *read_set, fd_set *write_set, fd_set *exc_set);
extern void chat_forward_session(struct session *ses, char *linelog);
extern void chat_socket_printf(struct chat_data *buddy, char *format, ...);
extern void chat_printf(char *format, ...);
extern int process_chat_input(struct chat_data *buddy);
extern void get_chat_commands(struct chat_data *buddy, char *buf, int len);
extern void chat_name_change(struct chat_data *buddy, char *txt);
extern void chat_receive_text_everybody(struct chat_data *buddy, char *txt);
extern void chat_receive_text_personal(struct chat_data *buddy, char *txt);
extern void chat_receive_text_group(struct chat_data *buddy, char *txt);
extern void chat_receive_message(struct chat_data *buddy, char *txt);
extern void chat_receive_snoop_data(struct chat_data *buddy, char *txt);
extern void ping_response(struct chat_data *ch, char *time);
extern void request_response(struct chat_data *requester);
extern void parse_requested_connections(struct chat_data *buddy, char *txt);
extern void peek_response(struct chat_data *peeker);
extern void parse_peeked_connections(struct chat_data *buddy, char *txt);
extern void chat_receive_file(char *arg, struct chat_data *ch);
extern void send_block(struct chat_data *ch);
extern void receive_block(unsigned char *s, struct chat_data *ch, int size);
extern void deny_file(struct chat_data *ch, char *arg);
extern void file_denied(struct chat_data *ch, char *txt);
extern void file_cleanup(struct chat_data *buddy);
extern int get_file_size(char *fpath);
extern void chat_puts(char *arg);
extern struct chat_data *find_buddy(char *arg);
extern struct chat_data *find_group(char *arg);
extern char *fix_file_name(char *name);
#endif
#ifndef __TERMINAL_H__
#define __TERMINAL_H__
extern void init_terminal(void);
extern void restore_terminal(void);
extern void refresh_terminal(void);
extern void echo_on(struct session *ses);
extern void echo_off(struct session *ses);
extern void init_screen_size(struct session *ses);
extern int get_scroll_size(struct session *ses);
#endif
#ifndef __CLASS_H__
#define __CLASS_H__
extern DO_COMMAND(do_class);
extern int count_class(struct session *ses, struct listnode *group);
extern DO_CLASS(class_open);
extern DO_CLASS(class_close);
extern DO_CLASS(class_read);
extern DO_CLASS(class_write);
extern DO_CLASS(class_kill);
extern void parse_class(struct session *ses, char *input, struct listnode *group);
#endif
#ifndef __MAPPER_H__
#define __MAPPER_H__
extern DO_COMMAND(do_map);
extern DO_MAP(map_at);
extern DO_MAP(map_color);
extern DO_MAP(map_create);
extern DO_MAP(map_delete);
extern DO_MAP(map_destroy);
extern DO_MAP(map_dig);
extern DO_MAP(map_exit);
extern DO_MAP(map_exitflag);
extern DO_MAP(map_explore);
extern DO_MAP(map_find);
extern DO_MAP(map_flag);
extern DO_MAP(map_get);
extern DO_MAP(map_goto);
extern DO_MAP(map_info);
extern DO_MAP(map_insert);
extern DO_MAP(map_jump);
extern DO_MAP(map_leave);
extern DO_MAP(map_legend);
extern DO_MAP(map_link);
extern DO_MAP(map_list);
extern DO_MAP(map_map);
extern DO_MAP(map_move);
extern DO_MAP(map_name);
extern DO_MAP(map_read);
extern DO_MAP(map_resize);
extern DO_MAP(map_return);
extern DO_MAP(map_roomflag);
extern DO_MAP(map_run);
extern DO_MAP(map_set);
extern DO_MAP(map_travel);
extern DO_MAP(map_undo);
extern DO_MAP(map_uninsert);
extern DO_MAP(map_unlink);
extern DO_MAP(map_write);
extern void create_map(struct session *ses, char *arg);
extern void delete_map(struct session *ses);
extern int create_room(struct session *ses, char *arg);
extern void delete_room(struct session *ses, int room, int exits);
extern void create_exit(struct session *ses, int room, char *arg);
extern void delete_exit(struct session *ses, int room, struct exit_data *exit);
extern void create_legend(struct session *ses, char *arg);
extern int match_room(struct session *ses, int room, char *arg1, char *arg2, char *arg3, char *arg4, char *arg5);
extern int find_room(struct session *ses, char *arg);
extern void goto_room(struct session *ses, int room);
extern struct exit_data *find_exit(struct session *ses, int room, char *arg);
extern int get_map_exit(struct session *ses, char *arg);
extern int get_map_exits(struct session *ses, int room);
extern void create_map_grid(struct session *ses, int room, int x, int y);
extern void build_map_grid(int room, int x, int y, int z);
extern int follow_map(struct session *ses, char *argument);
extern void add_undo(struct session *ses, char *format, ...);
extern void del_undo(struct session *ses, struct link_data *link);
extern char *draw_room(struct session *ses, struct room_data *room, int line);
extern void search_path(int room, int size, int dir);
extern void fill_map(struct session *ses);
extern void shortest_path(struct session *ses, int run, char *delay, char *arg);
extern void explore_path(struct session *ses, int run, char *left, char *right);
extern int find_coord(struct session *ses, char *arg);
extern void search_coord_bf(int vnum);
extern void show_vtmap(struct session *ses);
#endif
#ifndef __MATH_H__
#define __MATH_H__
extern DO_COMMAND(do_math);
extern double get_number(struct session *ses, char *str);
extern char *get_alnum(struct session *ses, char *str);
extern void get_number_string(struct session *ses, char *str, char *result);
extern double mathswitch(struct session *ses, char *left, char *right);
extern void mathexp(struct session *ses, char *str, char *result);
extern int mathexp_tokenize(struct session *ses, char *str);
extern void mathexp_level(struct session *ses, struct link_data *node);
extern void mathexp_compute(struct session *ses, struct link_data *node);
extern double tintoi(char *str);
extern double tincmp(char *left, char *right);
extern double tineval(struct session *ses, char *left, char *right);
extern double tindice(char *left, char *right);
#endif
#ifndef __PROMPT_H__
#define __PROMPT_H__
extern DO_COMMAND(do_split);
extern DO_COMMAND(do_unsplit);
extern void init_split(struct session *ses, int top, int bot);
extern void clean_screen(struct session *ses);
extern void dirty_screen(struct session *ses);
extern DO_COMMAND(do_prompt);
extern DO_COMMAND(do_unprompt);
extern void check_all_prompts(struct session *ses, char *original, char *line);
extern void do_one_prompt(struct session *ses, char *prompt, int row);
#endif
#ifndef __TINEXP_H__
#define __TINEXP_H__
extern int substitute(struct session *ses, char *string, char *result, int flags);
extern int match(struct session *ses, char *str, char *exp);
extern int find(struct session *ses, char *str, char *exp, int sub);
DO_COMMAND(do_regexp);
extern int regexp_compare(pcre *regex, char *str, char *exp, int option, int flag);
extern int check_one_regexp(struct session *ses, struct listnode *node, char *line, char *original, int option);
extern int tintin_regexp_check(char *exp);
extern int tintin_regexp(pcre *pcre, char *str, char *exp, int option, int flag);
extern pcre *tintin_regexp_compile(struct listnode *node, char *exp, int option);
#endif
#ifndef __CONFIG_H__
#define __CONFIG_H__
extern DO_COMMAND(do_configure);
extern DO_CONFIG(config_speedwalk);
extern DO_CONFIG(config_verbatim);
extern DO_CONFIG(config_repeatenter);
extern DO_CONFIG(config_commandecho);
extern DO_CONFIG(config_commandcolor);
extern DO_CONFIG(config_verbose);
extern DO_CONFIG(config_wordwrap);
extern DO_CONFIG(config_log);
extern DO_CONFIG(config_buffersize);
extern DO_CONFIG(config_scrolllock);
extern DO_CONFIG(config_historysize);
extern DO_CONFIG(config_connectretry);
extern DO_CONFIG(config_packetpatch);
extern DO_CONFIG(config_tintinchar);
extern DO_CONFIG(config_verbatimchar);
extern DO_CONFIG(config_repeatchar);
extern DO_CONFIG(config_debugtelnet);
extern DO_CONFIG(config_convertmeta);
extern DO_CONFIG(config_loglevel);
extern DO_CONFIG(config_colorpatch);
extern DO_CONFIG(config_mccp);
extern DO_CONFIG(config_autotab);
extern DO_CONFIG(config_big5);
#endif
#ifndef __MACRO_H__
#define __MACRO_H__
extern DO_COMMAND(do_macro);
extern DO_COMMAND(do_unmacro);
extern void macro_update(void);
#endif
#ifndef __STRHASH_H__
#define __STRHASH_H__
extern char *str_hash(char *str, int lines);
extern char *str_unhash(char *str);
extern unsigned short str_hash_lines(char *str);
extern unsigned short str_hash_grep(char *str, int write);
extern void reset_hash_table(void);
extern DO_BUFFER(buffer_info);
#endif
#ifndef __BUFFER_H__
#define __BUFFER_H__
extern void init_buffer(struct session *ses, int size);
extern void add_line_buffer(struct session *ses, char *line, int more_output);
extern DO_COMMAND(do_buffer);
extern DO_COMMAND(do_grep);
extern int show_buffer(struct session *ses);
extern DO_BUFFER(buffer_up);
extern DO_BUFFER(buffer_clear);
extern DO_BUFFER(buffer_down);
extern DO_BUFFER(buffer_get);
extern DO_BUFFER(buffer_home);
extern DO_BUFFER(buffer_end);
extern DO_BUFFER(buffer_lock);
extern DO_BUFFER(buffer_find);
extern DO_BUFFER(buffer_write);
#endif
#ifndef __DATA_H__
#define __DATA_H__
extern struct listroot *init_list(struct session *ses, int type, int size);
extern void kill_list(struct listroot *root);
extern void free_list(struct listroot *root);
extern struct listroot *copy_list(struct session *ses, struct listroot *sourcelist, int type);
extern struct listnode *insert_node_list(struct listroot *root, char *ltext, char *rtext, char *prtext);
extern struct listnode *update_node_list(struct listroot *root, char *ltext, char *rtext, char *prtext);
extern struct listnode *insert_index_list(struct listroot *root, struct listnode *node, int index);
extern int show_node_with_wild(struct session *ses, char *cptr, int type);
extern void show_node(struct listroot *root, struct listnode *node, int level);
extern void show_nest(struct listnode *node, char *result);
extern void show_list(struct listroot *root, int level);
extern struct listnode *search_node_list(struct listroot *root, char *text);
extern void delete_node_list(struct session *ses, int type, struct listnode *node);
extern void delete_node_with_wild(struct session *ses, int index, char *string);
extern void delete_index_list(struct listroot *root, int index);
extern int search_index_list(struct listroot *root, char *text, char *priority);
extern int locate_index_list(struct listroot *root, char *text, char *priority);
extern int bsearch_alpha_list(struct listroot *root, char *text, int seek);
extern int bsearch_priority_list(struct listroot *root, char *text, char *priority, int seek);
extern int nsearch_list(struct listroot *root, char *text);
extern DO_COMMAND(do_kill);
extern DO_COMMAND(do_message);
extern DO_COMMAND(do_ignore);
extern DO_COMMAND(do_debug);
#endif
#ifndef __DEBUG_H__
#define __DEBUG_H__
extern int push_call(char *f, ...);
extern void pop_call(void);
extern void dump_stack(void);
extern void dump_full_stack(void);
#endif
#ifndef __EVENT_H__
#define __EVENT_H__
extern DO_COMMAND(do_event);
extern DO_COMMAND(do_unevent);
extern int check_all_events(struct session *ses, int args, int vars, char *fmt, ...);
#endif
#ifndef __ALIAS_H__
#define __ALIAS_H__
extern struct session *do_alias(struct session *ses, char *arg);
extern struct session *do_unalias(struct session *ses, char *arg);
int check_all_aliases(struct session *ses, char *input);
#endif
#ifndef __FILES_H__
#define __FILES_H__
extern DO_COMMAND(do_read);
extern DO_COMMAND(do_write);
extern void write_node(struct session *ses, int mode, struct listnode *node, FILE *file);
#endif
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
extern DO_COMMAND(do_function);
extern DO_COMMAND(do_unfunction);
#endif
#ifndef __GAG_H__
#define __GAG_H__
extern DO_COMMAND(do_gag);
extern DO_COMMAND(do_ungag);
extern void check_all_gags(struct session *ses, char *original, char *line);
#endif
#ifndef __HELP_H__
#define __HELP_H__
extern DO_COMMAND(do_help);
#endif
#ifndef __HIGHLIGHT_H__
#define __HIGHLIGHT_H__
extern DO_COMMAND(do_highlight);
extern int is_high_arg(char *s);
extern DO_COMMAND(do_unhighlight);
extern void check_all_highlights(struct session *ses, char *original, char *line);
extern int get_highlight_codes(struct session *ses, char *htype, char *result);
#endif
#ifndef __HISTORY_H__
#define __HISTORY_H__
extern DO_COMMAND(do_history);
extern void add_line_history(struct session *ses, char *line);
extern void insert_line_history(struct session *ses, char *line);
extern void search_line_history(struct session *ses, char *line);
extern int write_history(struct session *ses, char *filename);
extern int read_history(struct session *ses, char *filename);
DO_HISTORY(history_character);
DO_HISTORY(history_delete);
DO_HISTORY(history_insert);
DO_HISTORY(history_list);
DO_HISTORY(history_size);
DO_HISTORY(history_read);
DO_HISTORY(history_write);
#endif
#ifndef __LINE_H__
#define __LINE_H__
extern DO_COMMAND(do_line);
extern DO_LINE(line_gag);
extern DO_LINE(line_log);
extern DO_LINE(line_logverbatim);
extern DO_LINE(line_substitute);
extern DO_LINE(line_verbose);
#endif
#ifndef __LOG_H__
#define __LOG_H__
extern void logit(struct session *ses, char *txt, FILE *file, int newline);
extern DO_COMMAND(do_log);
extern void write_html_header(FILE *fp);
extern void vt102_to_html(struct session *ses, char *txt, char *out);
#endif
#ifndef __MAIN_H__
#define __MAIN_H__
extern struct session *gts;
extern struct tintin_data *gtd;
extern void winch_handler(int signal);
extern void abort_handler(int signal);
extern void pipe_handler(int signal);
extern void suspend_handler(int signal);
extern void trap_handler(int signal);
extern int main(int argc, char **argv);
extern void init_tintin(int greeting);
extern void quitmsg(char *message);
#endif
#ifndef __MEMORY_H__
#define __MEMORY_H__
extern char *restring(char *point, char *string);
extern char *refstring(char *point, char *fmt, ...);
#endif
#ifndef __MISC_H__
#define __MISC_H__
extern DO_COMMAND(do_all);
extern DO_COMMAND(do_bell);
extern DO_COMMAND(do_commands);
extern DO_COMMAND(do_cr);
extern DO_COMMAND(do_echo);
extern DO_COMMAND(do_end);
extern DO_COMMAND(do_forall);
extern DO_COMMAND(do_info);
extern DO_COMMAND(do_nop);
extern DO_COMMAND(do_run);extern DO_COMMAND(do_send);
extern DO_COMMAND(do_showme);
extern DO_COMMAND(do_snoop);
extern DO_COMMAND(do_suspend);
extern DO_COMMAND(do_test);
extern DO_COMMAND(do_zap);
#endif
#ifndef __NEST_H__
#define __NEST_H__
extern struct listroot *search_nest_root(struct listroot *root, char *arg);
extern struct listnode *search_base_node(struct listroot *root, char *variable);
extern struct listnode *search_nest_node(struct listroot *root, char *variable);
extern int search_nest_index(struct listroot *root, char *variable);
extern struct listroot *update_nest_root(struct listroot *root, char *arg);
extern void update_nest_node(struct listroot *root, char *arg);
extern int delete_nest_node(struct listroot *root, char *variable);
extern int get_nest_size(struct listroot *root, char *variable, char *result);
extern struct listnode *get_nest_node(struct listroot *root, char *variable, char *result, int def);
extern int get_nest_index(struct listroot *root, char *variable, char *result, int def);
extern struct listnode *set_nest_node(struct listroot *root, char *arg1, char *format, ...);
extern struct listnode *add_nest_node(struct listroot *root, char *arg1, char *format, ...);
extern void show_nest_node(struct listnode *node, char *result, int initialize);
extern void copy_nest_node(struct listroot *dst_root, struct listnode *dst, struct listnode *src);
#endif
#ifndef __NET_H__
#define __NET_H__
extern int connect_mud(struct session *ses, char *host, char *port);
extern void write_line_mud(struct session *ses, char *line, int size);
extern int read_buffer_mud(struct session *ses);
extern void readmud(struct session *ses);
extern void process_mud_output(struct session *ses, char *linebuf, int prompt);
#endif
#ifndef __TELOPT_H__
#define __TELOPT_H__
extern int translate_telopts(struct session *ses, unsigned char *src, int cplen);
extern int send_will_sga(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_eor(struct session *ses, int cplen, unsigned char *cpsrc);
extern int mark_prompt(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_will_naws(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_sb_naws(struct session *ses, int cplen, unsigned char *cpsrc);
extern int recv_sb_tspeed(struct session *ses, int cplen, unsigned char *cpsrc);
extern int recv_dont_ttype(struct session *ses, int cplen, unsigned char *cpsrc);
extern int recv_sb_ttype(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_wont_status(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_dont_status(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_dont_sga(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_sga(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_wont_oldenviron(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_echo_on(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_echo_off(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_echo_will(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_ip(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_wont_telopt(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_dont_telopt(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_will_telopt(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_telopt(struct session *ses, int cplen, unsigned char *cpsrc);
extern int recv_sb_mssp(struct session *ses, int cplen, unsigned char *src);
extern int recv_sb_msdp(struct session *ses, int cplen, unsigned char *src);
extern int recv_sb_gmcp(struct session *ses, int cplen, unsigned char *src);
extern int recv_sb_new_environ(struct session *ses, int cplen, unsigned char *src);
extern int recv_sb_zmp(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_mssp(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_mccp1(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_do_mccp2(struct session *ses, int cplen, unsigned char *cpsrc);
extern int send_dont_mccp2(struct session *ses, int cplen, unsigned char *cpsrc);
extern int init_mccp(struct session *ses, int cplen, unsigned char *cpsrc);
extern void *zlib_alloc(void *opaque, unsigned int items, unsigned int size);
extern void zlib_free(void *opaque, void *address);
extern void init_telnet_session(struct session *ses);
extern int skip_sb(struct session *ses, int cplen, unsigned char *cpsrc);
extern int recv_sb(struct session *ses, int cplen, unsigned char *cpsrc);
#endif
#ifndef __PARSE_H__
#define __PARSE_H__
extern struct session *parse_input(struct session *ses, char *input);
extern struct session *parse_command(struct session *ses, char *input);
extern int is_speedwalk(struct session *ses, char *input);
extern void process_speedwalk(struct session *ses, char *input);
extern struct session *parse_tintin_command(struct session *ses, char *input);
extern char *get_arg_all(char *string, char *result, int flag);
extern char *get_arg_in_braces(char *string, char *result, int flag);
extern char *sub_arg_in_braces(struct session *ses, char *string, char *result, int flag, int sub);
extern char *get_arg_with_spaces(char *string, char *result, int flag);
extern char *get_arg_stop_spaces(char *string, char *result, int flag);
extern char *space_out(char *string);
extern char *get_arg_to_brackets(char *string, char *result);
extern char *get_arg_at_brackets(char *string, char *result);
extern char *get_arg_in_brackets(char *string, char *result);
extern void write_mud(struct session *ses, char *command, int flags);
extern void do_one_line(char *line, struct session *ses);
#endif
#ifndef __PATH_H__
#define __PATH_H__
extern DO_COMMAND(do_path);
extern DO_PATH(path_del);
extern DO_PATH(path_end);
extern DO_PATH(path_ins);
extern DO_PATH(path_load);
extern DO_PATH(path_map);
extern DO_PATH(path_new);
extern DO_PATH(path_run);
extern DO_PATH(path_save);
extern DO_PATH(path_walk);
extern DO_PATH(path_zip);
extern DO_COMMAND(do_pathdir);
extern DO_COMMAND(do_unpathdir);
extern void check_insert_path(char *command, struct session *ses);
#endif
#ifndef __RLTAB_H__
#define __RLTAB_H__
extern DO_COMMAND(do_tab);
extern DO_COMMAND(do_untab);
#endif
#ifndef __SESSION_H__
#define __SESSION_H__
extern DO_COMMAND(do_session);
extern struct session *session_command(char *arg, struct session *ses);
extern void show_session(struct session *ses, struct session *ptr);
extern struct session *newactive_session(void);
extern struct session *activate_session(struct session *ses);
extern struct session *new_session(struct session *ses, char *name, char *address, int desc);
extern void connect_session(struct session *ses);
extern void cleanup_session(struct session *ses);
extern void dispose_session(struct session *ses);
#endif
#ifndef __SUBSTITUTE_H__
#define __SUBSTITUTE_H__
extern DO_COMMAND(do_substitute);
extern DO_COMMAND(do_unsubstitute);
extern void check_all_substitutions(struct session *ses, char *original, char *line);
#endif
#ifndef __SYSTEM_H__
#define __SYSTEM_H__
extern DO_COMMAND(do_run);
extern DO_COMMAND(do_scan);
extern DO_COMMAND(do_script);
extern DO_COMMAND(do_system);
extern DO_COMMAND(do_textin);
#endif
#ifndef __TABLES_H__
#define __TABLES_H__
extern struct array_type array_table[];
extern struct chat_type chat_table[];
extern struct class_type class_table[];
extern struct color_type color_table[];
extern struct command_type command_table[];
extern struct config_type config_table[];
extern struct cursor_type cursor_table[];
extern struct event_type event_table[];
extern struct list_type list_table[LIST_MAX];
extern struct substitution_type substitution_table[];
extern struct map_type map_table[];
extern struct timer_type timer_table[];
extern struct path_type path_table[];
extern struct line_type line_table[];
extern struct history_type history_table[];
extern struct buffer_type buffer_table[];
extern struct telopt_type telopt_table[];
#endif
#ifndef __TEXT_H__
#define __TEXT_H__
extern void printline(struct session *ses, char *str, int isaprompt);
int word_wrap(struct session *ses, char *textin, char *textout, int display);
int word_wrap_split(struct session *ses, char *textin, char *textout, int skip, int keep);
#endif
#ifndef __TICKS_H__
#define __TICKS_H__
extern DO_COMMAND(do_tick);
extern DO_COMMAND(do_untick);
extern DO_COMMAND(do_delay);
extern DO_COMMAND(do_undelay);
#endif
#ifndef __TOKENIZE_H__
#define __TOKENIZE_H__
extern struct session *script_driver(struct session *ses, int list, char *str);
extern char *script_writer(struct session *ses, char *str);
#endif
#ifndef __UPDATE_H__
#define __UPDATE_H__
extern void mainloop(void);
extern void poll_input(void);
extern void poll_sessions(void);
extern void poll_chat(void);
extern void tick_update(void);
extern void delay_update(void);
extern void packet_update(void);
extern void chat_update(void);
extern void terminal_update(void);
extern void memory_update(void);
extern void time_update(void);
#endif
#ifndef __UTILS_H__
#define __UTILS_H__
extern int is_abbrev(char *s1, char *s2);
extern int is_color_code(char *str);
extern int is_number(char *str);
extern int hex_number(char *str);
extern int oct_number(char *str);
extern long long utime(void);
extern char *capitalize(char *str);
extern char *ntos(long long number);
extern char *indent(int cnt);
extern void cat_sprintf(char *dest, char *fmt, ...);
extern void ins_sprintf(char *dest, char *fmt, ...);
extern int str_suffix(char *str1, char *str2);
extern void syserr(char *msg);
extern void show_message(struct session *ses, int index, char *format, ...);
extern void show_debug(struct session *ses, int index, char *format, ...);
extern void tintin_header(struct session *ses, char *format, ...);
extern void socket_printf(struct session *ses, size_t length, char *format, ...);
extern void tintin_printf2(struct session *ses, char *format, ...);
extern void tintin_printf(struct session *ses, char *format, ...);
extern void tintin_puts3(struct session *ses, char *string);
extern void tintin_puts2(struct session *ses, char *string);
extern void tintin_puts(struct session *ses, char *string);
extern void show_cpu(struct session *ses);
extern long long display_timer(struct session *ses, int timer);
extern void open_timer(int timer);
extern void close_timer(int timer);
#endif
#ifndef __VARIABLE_H__
#define __VARIABLE_H__
extern DO_COMMAND(do_variable);
extern DO_COMMAND(do_unvariable);
extern int delete_variable(struct session *ses, char *variable);
extern struct listnode *search_variable(struct session *ses, char *variable);
extern struct listnode *get_variable(struct session *ses, char *variable, char *result);
extern struct listnode *set_variable(struct session *ses, char *variable, char *format, ...);
extern int get_variable_index(struct session *ses, char *variable, char *result);
extern DO_COMMAND(do_format);
extern DO_COMMAND(do_tolower);
extern DO_COMMAND(do_toupper);
extern DO_COMMAND(do_postpad);
extern DO_COMMAND(do_prepad);
extern DO_COMMAND(do_replace);
#endif
#ifndef __VT102_H__
#define __VT102_H__
extern void save_pos(struct session *ses);
extern void restore_pos(struct session *ses);
extern void restore_cursor(struct session *ses);
extern void goto_rowcol(struct session *ses, int row, int col);
extern void erase_screen(struct session *ses);
extern void erase_toeol(void);
extern void erase_scroll_region(struct session *ses);
extern void reset(void);
extern void scroll_region(struct session *ses, int top, int bottom);
extern void reset_scroll_region(struct session *ses);
extern int skip_vt102_codes(char *str);
extern int skip_vt102_codes_non_graph(char *str);
extern void strip_vt102_codes(char *str, char *buf);
extern void strip_vt102_codes_non_graph(char *str, char *buf);
extern void strip_non_vt102_codes(char *str, char *buf);
extern void get_color_codes(char *old, char *str, char *buf);
extern int strip_vt102_strlen(char *str);
extern int strip_color_strlen(char *str);
extern int interpret_vt102_codes(struct session *ses, char *str, int real);
#endif