/*************************************************************************
* TinyFugue - programmable mud client
* Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys
*
* TinyFugue (aka "tf") is protected under the terms of the GNU
* General Public License. See the file "COPYING" for details.
************************************************************************/
static const char RCSid[] = "$Id: main.c,v 35004.115 2007/01/13 23:12:39 kkeys Exp $";
/***********************************************
* Fugue main routine *
* *
* Initializes many internal global variables, *
* determines initial world (if any), reads *
* configuration file, and calls main loop in *
* socket.c *
***********************************************/
#include "tfconfig.h"
#include "port.h"
#include "tf.h"
#include "util.h"
#include "pattern.h" /* for tfio.h */
#include "search.h"
#include "tfio.h"
#include "history.h"
#include "world.h"
#include "socket.h"
#include "macro.h"
#include "output.h"
#include "attr.h"
#include "signals.h"
#include "command.h"
#include "keyboard.h"
#include "variable.h"
#include "tty.h" /* no_tty */
#include "expand.h"
#include "expr.h"
#include "process.h"
const char sysname[] = UNAME;
/* For customized versions, please add a unique identifer (e.g., your initials)
* to the version number, and put a brief description of the modifications
* in the mods[] string.
*/
const char version[] =
#if DEVELOPMENT
"DEVELOPMENT VERSION: "
#endif
"TinyFugue version 5.0 beta 8";
const char mods[] = "";
const char copyright[] =
"Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys (kenkeys@users.sourceforge.net)";
const char contrib[] =
#ifdef PLATFORM_OS2
"OS/2 support written by Andreas Sahlbach (asa@stardiv.de)";
#else
"";
#endif
int restriction = 0;
int debug = 0;
static void read_configuration(const char *fname);
int main(int argc, char **argv);
int main(int argc, char *argv[])
{
char *opt, *argv0 = argv[0];
char *configfile = NULL, *command = NULL, *libdir = NULL;
int worldflag = TRUE;
int autologin = -1, quietlogin = -1, autovisual = TRUE;
String *scratch;
puts("");
puts(version);
puts(copyright);
while (--argc > 0 && (*++argv)[0] == '-') {
if (!(*argv)[1]) { argc--; argv++; break; }
for (opt = *argv + 1; *opt; )
switch (*opt++) {
case 'd':
debug = TRUE;
break;
case 'l':
autologin = FALSE;
break;
case 'q':
quietlogin = TRUE;
break;
case 'n':
worldflag = FALSE;
break;
case 'v':
autovisual = FALSE;
break;
case 'f':
configfile = opt;
goto nextarg;
case 'c':
command = opt;
goto nextarg;
case 'L':
libdir = opt;
goto nextarg;
default:
fprintf(stderr, "\n%s: illegal option -- %c\n", argv0, *--opt);
goto error;
}
nextarg: /* empty statement */;
}
if (argc > 2) {
error:
fputs("\n", stderr);
fprintf(stderr, "Usage: %s [-L<dir>] [-f[<file>]] [-c<cmd>] [-vnlq] [<world>]\n", argv0);
fprintf(stderr, " %s [-L<dir>] [-f[<file>]] [-c<cmd>] [-vlq] <host> <port>\n", argv0);
fputs("Options:\n", stderr);
fputs(" -L<dir> use <dir> as library directory (%TFLIBDIR)\n", stderr);
fputs(" -f don't load personal config file (.tfrc)\n", stderr);
fputs(" -f<file> load <file> instead of config file\n", stderr);
fputs(" -c<cmd> execute <cmd> after loading config file\n", stderr);
fputs(" -n no automatic first connection\n", stderr);
fputs(" -l no automatic login/password\n", stderr);
fputs(" -q quiet login\n", stderr);
fputs(" -v no automatic visual mode\n", stderr);
fputs("Arguments:\n", stderr);
fputs(" <host> hostname or IP address\n", stderr);
fputs(" <port> port number or name\n", stderr);
fputs(" <world> connect to <world> defined by addworld()\n", stderr);
fputs("\n", stderr);
exit(1);
}
#if SOCKS
SOCKSinit(argv0); /* writes message to stdout */
#endif
init_exename(argv0);
SRAND(getpid() + time(NULL)); /* seed random generator */
init_malloc(); /* malloc.c */
init_tfio(); /* tfio.c */
init_util1(); /* util.c */
init_expand(); /* expand.c */
init_variables(); /* variable.c */
init_signals(); /* signals.c */
init_sock(); /* socket.c */
init_macros(); /* macro.c */
init_histories(); /* history.c */
init_output(); /* output.c */
init_attrs(); /* attr.c */
init_keyboard(); /* keyboard.c */
oputs(version);
oputs(copyright);
oputs("Type `/help copyright' for more information.");
if (*contrib) oputs(contrib);
if (*mods) oputs(mods);
oprintf("Using PCRE version %s", pcre_version());
oputs("Type `/help', `/help topics', or `/help intro' for help.");
oputs("Type `/quit' to quit tf.");
oputs("");
init_util2(); /* util.c */
if (libdir) {
set_str_var_by_name("TFLIBDIR", Stringnew(libdir, -1, 0));
}
if (!ffindglobalvar("TFLIBRARY")) {
scratch = Stringnew(NULL, 0, 0);
Sprintf(scratch, "%s/stdlib.tf", TFLIBDIR);
set_str_var_by_name("TFLIBRARY", scratch);
}
if (!ffindglobalvar("TFHELP")) {
scratch = Stringnew(NULL, 0, 0);
Sprintf(scratch, "%s/tf-help", TFLIBDIR);
set_str_var_by_name("TFHELP", scratch);
}
read_configuration(configfile);
if (command) {
String *scmd;
(scmd = Stringnew(command, -1, 0))->links++;
macro_run(CS(scmd), 0, NULL, 0, sub, "\bSTART");
Stringfree(scmd);
}
/* If %visual was not explicitly set, set it now. */
if (getintvar(VAR_visual) < 0 && !no_tty)
set_var_by_id(VAR_visual, autovisual);
/* If %interactive was not explicitly set, set it now. */
if (getintvar(VAR_interactive) < 0)
set_var_by_id(VAR_interactive, !no_tty);
if (argc > 0 || worldflag) {
int flags = 0;
if (autologin < 0) autologin = login;
if (quietlogin < 0) quietlogin = quietflag;
if (autologin) flags |= CONN_AUTOLOGIN;
if (quietlogin) flags |= CONN_QUIETLOGIN;
if (argc == 0)
openworld(NULL, NULL, flags);
else if (argc == 1)
openworld(argv[0], NULL, flags);
else /* if (argc == 2) */
openworld(argv[0], argv[1], flags);
} else {
world_hook("---- No world ----", NULL);
}
main_loop();
kill_procs();
#if USE_DMALLOC
free_screen_lines(default_screen);
#endif
minimal_fix_screen();
reset_tty();
#if USE_DMALLOC
free_macros();
free_worlds();
free_histories();
free_output();
free_vars();
free_keyboard();
free_search();
free_expand();
free_expr();
free_help();
free_util();
free_patterns();
free_dstring();
free_reserve();
fflush(stdout);
fflush(stderr);
debug_mstats("tf");
#endif
return 0;
}
static void read_configuration(const char *fname)
{
#if 1 /* XXX */
if (do_file_load(getvar("TFLIBRARY"), FALSE) < 0)
die("Can't read required library.", 0);
#endif
if (fname) {
if (*fname) do_file_load(fname, FALSE);
return;
}
(void)( /* ignore value of expression */
/* Try the next file if a file can't be read, but not if there's
* an error _within_ a file. */
do_file_load("~/.tfrc", TRUE) >= 0 ||
do_file_load("~/tfrc", TRUE) >= 0 ||
do_file_load("./.tfrc", TRUE) >= 0 ||
do_file_load("./tfrc", TRUE)
);
/* support for old fashioned .tinytalk files */
do_file_load((fname = getvar("TINYTALK")) ? fname : "~/.tinytalk", TRUE);
}
syntax highlighted by Code2HTML, v. 0.9.1