/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */
/*********************************************************************/
/* file: main.c - main module - signal setup/shutdown etc */
/* TINTIN++ */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/*********************************************************************/
/* note: a bunch of changes were made here to add readline support -- daw */
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#include <signal.h>
#include "tintin.h"
#include <fcntl.h>
#if defined(HAVE_SYS_TERMIO_H) && !defined(BSD_ECHO)
#include <sys/termio.h>
#ifdef HAVE_TCFLAG_T
tcflag_t c_lflag;
cc_t c_cc[NCCS];
#else
unsigned char c_cc[NCC];
unsigned short c_lflag;
#endif
#endif
#ifndef BADSIG
#define BADSIG (void (*)())-1
#endif
/*************** globals ******************/
int case_insensitive=FALSE; /* @@@added -- perry */
int term_echoing=TRUE;
int echo=DEFAULT_ECHO;
int speedwalk=DEFAULT_SPEEDWALK;
int togglesubs=DEFAULT_TOGGLESUBS;
int presub=DEFAULT_PRESUB;
int redraw=DEFAULT_REDRAW;
int sessionsstarted;
int puts_echoing=TRUE;
int verbose=FALSE;
int alnum=0;
int acnum=0;
int subnum=0;
int varnum=0;
int hinum=0;
int pdnum=0;
int antisubnum=0;
int verbatim=0;
char homepath[1025];
char E=27;
struct session *sessionlist, *activesession;
struct listnode *common_aliases, *common_actions, *common_subs, *common_myvars;
struct listnode *common_highs, *common_antisubs, *common_pathdirs;
char vars[10][BUFFER_SIZE]; /* the %0, %1, %2,....%9 variables */
char tintin_char=DEFAULT_TINTIN_CHAR;
char verbatim_char=DEFAULT_VERBATIM_CHAR;
char system_com[80]=SYSTEM_COMMAND_DEFAULT;
int mesvar[7];
int display_row, display_col, input_row, input_col;
int split_line, term_columns;
char k_input[BUFFER_SIZE];
char done_input[BUFFER_SIZE], prev_command[BUFFER_SIZE];
int hist_num;
int is_split;
int text_came;
void tintin();
void read_mud();
void do_one_line();
void snoop();
void tintin_puts2();
/************ externs *************/
extern int ignore_interrupt;
extern int ticker_interrupted, time0;
extern int tick_size, sec_to_tick;
extern void check_all_actions(); /* new */
extern void myquitsig();
extern struct session *newactive_session();
extern struct session *parse_input();
extern struct session *read_command();
extern struct completenode *complete_head;
extern struct listnode *init_list();
/* extern void term_noecho(); */
extern void read_complete();
extern void syserr();
extern void alarm();
extern int do_one_antisub();
extern void do_one_sub();
extern void do_one_high();
extern void prompt();
int read();
int select();
extern void do_history();
extern int read_buffer_mud();
extern void cleanup_session();
int write();
/* int fwrite(); */
/* int sscanf(); */
/* extern void term_echo(); */
int last_line_length;
extern void initsplit();
/* when the screen size changes, take note of it */
void
winchhandler()
{
/*
* select() will see a "syscall interrupted" error;
* remember not to worry
*/
ignore_interrupt = 1;
if (is_split)
initsplit(1); /* @@@changed -- perry */
tintin_puts("#SCREEN SIZE RESET (FROM SIGWINCH).", NULL);
/* we haveta reinitialize the signals for sysv machines */
if(signal(SIGWINCH, winchhandler) == BADSIG)
syserr("signal SIGWINCH");
}
/* CHANGED to get rid of double-echoing bug when tintin++ gets suspended */
void tstphandler(sig, code, scp, addr)
int sig;
int code;
struct sigcontext *scp;
char *addr;
{
/* select() will see a "syscall interrupted" error; remember not to worry */
ignore_interrupt = 1;
cleanscreen();
kill(getpid(), SIGSTOP);
dirtyscreen();
tintin_puts("#RETURNING BACK TO TINTIN++.", NULL);
/* we haveta reinitialize the signals for sysv machines */
if(signal(SIGTSTP, tstphandler)==BADSIG)
syserr("signal SIGTSTP");
/* the other stuff is obsolete, now that we have readline */
}
/**************************************************************************/
/* main() - show title - setup signals - init lists - readcoms - tintin() */
/**************************************************************************/
int main(argc, argv, environ)
int argc;
char **argv;
char **environ;
{
struct session *ses;
char *strptr, temp[BUFFER_SIZE];
int arg_num;
int fd;
#if defined(SOCKS)
SOCKSinit( argv[0]);
#endif
/*
#if defined(SYSV)
init_echo();
#endif
*/
is_split=FALSE;
ses=NULL;
/* new with readline */
rltab_read();
tintin_puts2("##################################################", ses);
sprintf(temp,"# T I N T I N + + %-18s%1s", VERSION_NUM, "#");
tintin_puts2(temp, ses);
tintin_puts2("# THIS IS A DEVELOPMENT VERSION!!! #", ses);
tintin_puts2("# (T)he k(I)cki(N) (T)ickin d(I)kumud clie(N)t #", ses);
tintin_puts2("# a DIKU-mud client #", ses);
tintin_puts2("# new code by Bill Reiss, David A. Wagner #", ses);
tintin_puts2("# Joann Ellsworth, Jeremy C. Jack 1994 #", ses);
tintin_puts2("# thanks to Peter Unold for original TINTIN code #", ses);
tintin_puts2("##################################################", ses);
if(signal(SIGTERM, myquitsig)==BADSIG)
syserr("signal SIGTERM");
if(signal(SIGINT, myquitsig)==BADSIG)
syserr("signal SIGINT");
/* CHANGED to get rid of double-echoing bug when tintin++ gets suspended */
if(signal(SIGTSTP, tstphandler)==BADSIG)
syserr("signal SIGTSTP");
if(signal(SIGWINCH, winchhandler)==BADSIG)
syserr("signal SIGWINCH");
common_aliases=init_list();
common_actions=init_list();
common_subs=init_list();
common_myvars=init_list();
common_highs=init_list();
common_antisubs=init_list();
common_pathdirs=init_list();
mesvar[0]=DEFAULT_ALIAS_MESS;
mesvar[1]=DEFAULT_ACTION_MESS;
mesvar[2]=DEFAULT_SUB_MESS;
mesvar[3]=DEFAULT_ANTISUB_MESS;
mesvar[4]=DEFAULT_HIGHLIGHT_MESS;
mesvar[5]=DEFAULT_VARIABLE_MESS;
mesvar[6]=DEFAULT_PATHDIR_MESS;
*homepath='\0';
if (!strcmp(DEFAULT_FILE_DIR, "HOME"))
if (strptr = (char *)getenv("HOME"))
strcpy(homepath, strptr);
else *homepath = '\0';
else strcpy(homepath, DEFAULT_FILE_DIR);
arg_num=1;
if(argc > 1 && argv[1]) {
if (*argv[1]=='-' && *(argv[1]+1)=='v') {
arg_num=2;
verbose=TRUE;
}
}
if(argc > arg_num && argv[arg_num]) {
activesession=read_command(argv[arg_num], NULL);
}
else {
strcpy(temp,homepath);
strcat(temp,"/.tintinrc");
if((fd=open(temp, O_RDONLY)) > 0) { /* Check if it exists */
close(fd);
activesession=read_command(temp, NULL);
}
else {
if(strptr = (char *)getenv("HOME")) {
strcpy(homepath, strptr);
strcpy(temp, homepath);
strcat(temp,"/.tintinrc");
if((fd=open(temp, O_RDONLY)) > 0) { /* Check if it exists */
close(fd);
activesession=read_command(temp, NULL);
}
}
}
}
mainloop();
return 1;
}
/**********************************************************/
/* do all of the functions to one line of buffer */
/**********************************************************/
void do_one_line(line, ses)
char *line;
struct session *ses;
{
if (!presub && !ses->ignore)
check_all_actions(line,ses);
if (!togglesubs)
if(!do_one_antisub(line,ses))
do_one_sub(line,ses);
if (presub && !ses->ignore)
check_all_actions(line,ses);
do_one_high(line, ses);
}