home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1992 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1992.iso
/
usenet
/
altsrcs
/
1
/
1708
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-28
|
5KB
|
308 lines
/* main.c */
/* Author:
* Steve Kirkendall
* 16820 SW Tallac Way
* Beaverton, OR 97006
* kirkenda@jove.cs.pdx.edu, or ...uunet!tektronix!psueea!jove!kirkenda
*/
/* This file contains the main() function of vi */
#include "config.h"
#include <signal.h>
#include <setjmp.h>
#include "vi.h"
extern trapint(); /* defined below */
extern char *getenv();
jmp_buf jmpenv;
/*---------------------------------------------------------------------*/
void main(argc, argv)
int argc;
char *argv[];
{
int i;
char *cmd = (char *)0;
char *tag = (char *)0;
char *str;
#if MSDOS || TOS
char firstarg[256];
#else
char *firstarg;
#endif
#ifndef NO_ARGV0
/* set mode to MODE_VI or MODE_EX depending on program name */
switch (argv[0][strlen(argv[0]) - 1])
{
case 'x': /* "ex" */
mode = MODE_EX;
break;
case 'w': /* "view" */
mode = MODE_VI;
*o_readonly = TRUE;
break;
#ifndef NO_EXTENSIONS
case 't': /* "edit" or "input" */
mode = MODE_VI;
*o_inputmode = TRUE;
break;
#endif
default: /* "vi" or "elvis" */
mode = MODE_VI;
}
#endif
/* start curses */
initscr();
cbreak();
noecho();
scrollok(stdscr, TRUE);
#ifndef DEBUG
#ifdef SIGQUIT
/* normally, we ignore SIGQUIT. SIGINT is trapped later */
signal(SIGQUIT, SIG_IGN);
#endif
#endif
/* initialize the options */
initopts();
/* map the arrow keys. The KU,KD,KL,and KR variables correspond to
* the :ku=: (etc.) termcap capabilities. The variables are defined
* as part of the curses package.
*/
if (has_KU) mapkey(has_KU, "k", WHEN_VICMD|WHEN_INMV, "<Up>");
if (has_KD) mapkey(has_KD, "j", WHEN_VICMD|WHEN_INMV, "<Down>");
if (has_KL) mapkey(has_KL, "h", WHEN_VICMD|WHEN_INMV, "<Left>");
if (has_KR) mapkey(has_KR, "l", WHEN_VICMD|WHEN_INMV, "<Right>");
if (has_HM) mapkey(has_HM, "^", WHEN_VICMD|WHEN_INMV, "<Home>");
if (has_EN) mapkey(has_EN, "$", WHEN_VICMD|WHEN_INMV, "<End>");
if (has_PU) mapkey(has_PU, "\002", WHEN_VICMD|WHEN_INMV, "<PgUp>");
if (has_PD) mapkey(has_PD, "\006", WHEN_VICMD|WHEN_INMV, "<PgDn>");
#if MSDOS
if (*o_pcbios)
{
mapkey("#R", "i", WHEN_VICMD|WHEN_INMV, "<Insrt>");
mapkey("#S", "x", WHEN_VICMD|WHEN_INMV, "<Del>");
mapkey("#s", "B", WHEN_VICMD|WHEN_INMV, "^<left>");
mapkey("#t", "W", WHEN_VICMD|WHEN_INMV, "^<right>");
}
#else
if (ERASEKEY != '\177')
{
mapkey("\177", "x", WHEN_VICMD|WHEN_INMV, "<Del>");
}
#endif
/* process any flags */
for (i = 1; i < argc && *argv[i] == '-'; i++)
{
switch (argv[i][1])
{
case 'R': /* readonly */
*o_readonly = TRUE;
break;
case 'r': /* recover */
msg("Use the `virec` command to recover lost files\n");
refresh();
endwin();
exit(0);
break;
case 't': /* tag */
if (argv[i][2])
{
tag = argv[i] + 2;
}
else
{
i++;
tag = argv[i];
}
break;
case 'v': /* vi mode */
mode = MODE_VI;
break;
case 'e': /* ex mode */
mode = MODE_EX;
break;
#ifndef NO_EXTENSIONS
case 'i': /* input mode */
*o_inputmode = TRUE;
break;
#endif
default:
msg("Ignoring unknown flag \"%s\"", argv[i]);
}
}
/* if we were given an initial ex command, save it... */
if (i < argc && *argv[i] == '+')
{
if (argv[i][1])
{
cmd = argv[i++] + 1;
}
else
{
cmd = "$"; /* "vi + file" means start at EOF */
i++;
}
}
/* the remaining args are file names. */
nargs = argc - i;
if (nargs > 0)
{
#if ! ( MSDOS || TOS )
firstarg = argv[i];
#endif
strcpy(args, argv[i]);
while (++i < argc && strlen(args) + 1 + strlen(argv[i]) < sizeof args)
{
strcat(args, " ");
strcat(args, argv[i]);
}
}
#if ! ( MSDOS || TOS )
else
{
firstarg = "";
}
#endif
argno = 0;
#if MSDOS || TOS
if (nargs > 0)
{
strcpy(args, wildcard(args));
nargs = 1;
for (i = 0; args[i]; i++)
{
if (args[i] == ' ')
{
nargs++;
}
}
for (i = 0; args[i] && args[i] != ' '; i++)
{
firstarg[i] = args[i];
}
firstarg[i] = '\0';
}
else
{
firstarg[0] = '\0';
}
#endif
/* perform the .exrc files and EXINIT environment variable */
#ifdef SYSEXRC
doexrc(SYSEXRC);
#endif
#ifdef HMEXRC
str = getenv("HOME");
if (str)
{
sprintf(tmpblk.c, "%s%c%s", str, SLASH, HMEXRC);
doexrc(tmpblk.c);
}
#endif
doexrc(EXRC);
#ifdef EXINIT
str = getenv(EXINIT);
if (str)
{
doexcmd(str);
}
#endif
/* search for a tag now, if desired */
blkinit();
if (tag)
{
cmd_tag(MARK_FIRST, MARK_FIRST, CMD_TAG, 0, tag);
}
/* if no tag, or tag failed, then start with first arg */
if (tmpfd < 0 && tmpstart(firstarg) == 0 && *origname)
{
ChangeText
{
}
clrflag(file, MODIFIED);
}
/* now we do the immediate ex command that we noticed before */
if (cmd)
{
doexcmd(cmd);
}
/* repeatedly call ex() or vi() (depending on the mode) until the
* mode is set to MODE_QUIT
*/
while (mode != MODE_QUIT)
{
if (setjmp(jmpenv))
{
/* Maybe we just aborted a change? */
abortdo();
}
#if TURBOC
signal(SIGINT, (void(*)()) trapint);
#else
signal(SIGINT, trapint);
#endif
switch (mode)
{
case MODE_VI:
vi();
break;
case MODE_EX:
ex();
break;
#ifdef DEBUG
default:
msg("mode = %d?", mode);
mode = MODE_QUIT;
#endif
}
}
/* free up the cut buffers */
cutend();
/* end curses */
#ifndef NO_CURSORSHAPE
if (has_CQ)
do_CQ();
#endif
refresh();
endwin();
exit(0);
/*NOTREACHED*/
}
/*ARGSUSED*/
trapint(signo)
int signo;
{
resume_curses(FALSE);
longjmp(jmpenv, 1);
}