Vile 09/17 - vi feel-alike (multi-window)
Paul Fox
pgf at cayman.COM
Sat Jun 8 08:09:47 AEST 1991
#!/bin/sh
# this is vileshar.09 (part 9 of Vile)
# do not concatenate these parts, unpack them in order with /bin/sh
# file main.c continued
#
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 9; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
echo 'x - continuing file main.c'
sed 's/^X//' << 'SHAR_EOF' >> 'main.c' &&
X *
X * This file contains the main driving routine, and some keyboard processing
X * code, for the screen editor.
X *
X */
X
#include <stdio.h>
X
/* for MSDOS, increase the default stack space */
X
#if MSDOS & LATTICE
unsigned _stack = 32767;
#endif
X
#if ATARI & LATTICE & 0
int _mneed = 256000; /* reset memory pool size */
#endif
X
#if MSDOS & AZTEC
int _STKSIZ = 32767/16; /* stack size in paragraphs */
int _STKRED = 1024; /* stack checking limit */
int _HEAPSIZ = 4096/16; /* (in paragraphs) */
int _STKLOW = 0; /* default is stack above heap (small only) */
#endif
X
#if MSDOS & TURBO
unsigned _stklen = 32768;
#endif
X
/* make global definitions not external */
#define maindef
X
#include "estruct.h" /* global structures and defines */
X
#if UNIX
#include <signal.h>
#endif
X
#include "nefunc.h" /* function declarations */
#include "nebind.h" /* default key bindings */
#include "nename.h" /* name table */
#include "edef.h" /* global definitions */
X
X
#if VMS
#include <ssdef.h>
#define GOOD (SS$_NORMAL)
#endif
X
#ifndef GOOD
#define GOOD 0
#endif
X
main(argc, argv)
char *argv[];
{
X int c; /* command character */
X int f; /* default flag */
X int n; /* numeric repeat count */
X int s;
X register BUFFER *bp; /* temp buffer pointer */
X register int gotafile; /* filename arg present? */
X register int carg; /* current arg to scan */
X register int ranstartup; /* startup executed flag */
X BUFFER *firstbp = NULL; /* ptr to first buffer in cmd line */
X int viewflag; /* are we starting in view mode? */
X int gotoflag; /* do we need to goto a line at start? */
X int helpflag; /* do we need to goto a line at start? */
X int gline; /* if so, what line? */
X int searchflag; /* Do we need to search at start? */
#if TAGS
X int tagflag, didtag; /* look up a tag to start? */
X char *tname;
#endif
X char bname[NBUFN]; /* buffer name of file to read */
X char *msg;
#if CRYPT
X /* int cryptflag; /* encrypting on the way in? */
X char ekey[NPAT]; /* startup encryption key */
#endif
X char *strncpy();
#if UNIX
X extern int catchintr();
X extern int imdying();
X extern int sizesignal();
#endif
X extern char *pathname[]; /* startup file path/name array */
X
X charinit(); /* character types -- we need these pretty
X early */
X
X viewflag = FALSE; /* view mode defaults off in command line */
X gotoflag = FALSE; /* set to off to begin with */
X helpflag = FALSE; /* set to off to begin with */
X searchflag = FALSE; /* set to off to begin with */
#if TAGS
X tagflag = FALSE; /* set to off to begin with */
#endif
X gotafile = FALSE; /* no file to edit yet */
X ranstartup = FALSE; /* startup file not executed yet */
#if CRYPT
X cryptflag = FALSE; /* no encryption by default */
#endif
X
X /* Parse the command line */
X for (carg = 1; carg < argc; ++carg) {
X
X /* Process Switches */
X if (argv[carg][0] == '-') {
X switch (argv[carg][1]) {
#if NeWS
X case 'l': /* -l for screen lines */
X case 'L':
X term.t_nrow = atoi(&argv[carg][2]);
X break;
#endif
X case 'e': /* -e for Edit file */
X case 'E':
X viewflag = FALSE;
X break;
X case 'g': /* -g for initial goto */
X case 'G':
X gotoflag = TRUE;
X if (argv[carg][2]) {
X gline = atoi(&argv[carg][2]);
X } else {
X if (++carg < argc)
X gline = atoi(&argv[carg][0]);
X else
X goto usage;
X }
X break;
X case 'h': /* -h for initial help */
X case 'H':
X helpflag = TRUE;
X break;
#if CRYPT
X case 'k': /* -k<key> for code key */
X case 'K':
X cryptflag = TRUE;
X if (argv[carg][2]) {
X strcpy(ekey, &argv[carg][2]);
X } else {
X if (++carg < argc)
X strcpy(ekey, &argv[carg][0]);
X else
X goto usage;
X }
X break;
#endif
X case 's': /* -s for initial search string */
X case 'S':
X searchflag = TRUE;
X if (argv[carg][2]) {
X strncpy(pat,&argv[carg][2],NPAT);
X } else {
X if (++carg < argc)
X strncpy(pat,&argv[carg][0],NPAT);
X else
X goto usage;
X }
X rvstrcpy(tap, pat);
X break;
#if TAGS
X case 't': /* -t for initial tag lookup */
X case 'T':
X tagflag = TRUE;
X if (argv[carg][2]) {
X tname = &argv[carg][2];
X } else {
X if (++carg < argc)
X tname = &argv[carg][0];
X else
X goto usage;
X }
X break;
#endif
X case 'v': /* -v for View File */
X case 'V':
X viewflag = TRUE;
X break;
X default: /* unknown switch */
X usage:
X fprintf(stderr,
X "usage: %s -flags files...\n%s%s%s%s%s%s",argv[0],
X " -h to get help on startup\n",
X " -gNNN or simply +NNN to go to line NNN\n",
X " -sstring to search for string\n",
#if TAGS
X " -ttagname to look up a tag\n",
#else
X "",
#endif
X " -v to view files as read-only\n",
#if CRYPT
X " -kcryptkey for encrypted files\n"
#else
X ""
#endif
X );
X exit(1);
X }
X
X } else if (argv[carg][0]== '+') { /* alternate form of -g */
X gotoflag = TRUE;
X gline = atoi(&argv[carg][1]);
X } else if (argv[carg][0]== '@') {
X /* Process Startup macroes */
X if (startup(&argv[carg][1]) == TRUE)
X ranstartup = TRUE; /* don't execute .vilerc */
X } else {
X
X /* Process an input file */
X
X /* set up a buffer for this file */
X makename(bname, argv[carg]);
X unqname(bname,FALSE);
X
X bp = bfind(bname, OK_CREAT, 0);
X make_current(bp); /* pull it to the front */
X strcpy(bp->b_fname, argv[carg]);
X if (!gotafile) {
X firstbp = bp;
X gotafile = TRUE;
X }
X
X /* set the modes appropriatly */
X if (viewflag)
X bp->b_mode |= MDVIEW;
#if CRYPT
X if (cryptflag) {
X bp->b_mode |= MDCRYPT;
X crypt((char *)NULL, 0);
X crypt(ekey, strlen(ekey));
X strncpy(bp->b_key, ekey, NPAT);
X }
#endif
X }
X }
X
X /* initialize the editor */
#if UNIX
X signal(SIGHUP,imdying);
X signal(SIGINT,catchintr);
X signal(SIGBUS,imdying);
X signal(SIGSEGV,imdying);
X signal(SIGSYS,imdying);
X signal(SIGTERM,imdying);
X signal(SIGQUIT,imdying);
X signal(SIGPIPE,SIG_IGN);
#ifdef SIGWINCH
X signal(SIGWINCH,sizesignal);
#endif
#endif
X vtinit(); /* Display */
X winit(); /* windows */
X varinit(); /* user variables */
X
X /* we made some calls to makecurrent() above, to shuffle the
X list order. this set curbp, which isn't actually kosher */
X curbp = NULL;
X
X /* this comes out to 70 on an 80 column display */
X fillcol = (7 * term.t_ncol) / 8;
X if (fillcol > 70)
X fillcol = 70;
X
X /* if invoked with no other startup files,
X run the system startup file here */
X if (!ranstartup) {
X
X /* if .vilerc is one of the input files....don't clobber it */
X if (gotafile && strcmp(pathname[0], firstbp->b_bname) == 0) {
X c = firstbp->b_bname[0];
X firstbp->b_bname[0] = '[';
X startup(pathname[0]);
X firstbp->b_bname[0] = c;
X } else {
X startup(pathname[0]);
X }
X ranstartup = TRUE;
X }
X
X /* if there are any files to read, read the first one! */
X if (gotafile) {
X nextbuffer(FALSE,0);
X }
#if TAGS
X else if (tagflag) {
X tags(tname);
X didtag = TRUE;
X }
#endif
X if (!curbp) {
X bp = bfind("[unnamed]", OK_CREAT, 0);
X bp->b_active = TRUE;
X swbuffer(bp);
X }
X curbp->b_mode |= (gmode & ~(MDCMOD|MDDOS));
X
X msg = "";
X if (helpflag) {
X if (help(TRUE,1) != TRUE) {
X msg =
X "[Problem with help information. Type \":quit\" to exit if you wish]";
X }
X } else {
X msg = "[Use ^A-h, ^X-h, or :help to get help]";
X }
X
X /* Deal with startup gotos and searches */
X if (gotoflag + searchflag
#if TAGS
X + tagflag
#endif
X > 1) {
#if TAGS
X msg = "[Search, goto and tag are used one at a time]";
#else
X msg = "[Cannot search and goto at the same time]";
#endif
X } else if (gotoflag) {
X if (gotoline(TRUE,gline) == FALSE)
X msg = "[Invalid goto argument]";
X } else if (searchflag) {
X forwhunt(FALSE, 0);
#if TAGS
X } else if (tagflag && !didtag) {
X tags(tname);
#endif
X }
X
X update(FALSE);
X mlwrite(msg);
X
X
X /* process commands */
X loop();
X
}
X
loop()
{
X int s,c,f,n;
X while(1) {
X /* Vi doesn't let the cursor rest on the newline itself. This
X takes care of that. */
X if (curwp->w_doto == llength(curwp->w_dotp) &&
X llength(curwp->w_dotp) != 0)
X backchar(TRUE,1);
X
X /* same goes for end of file */
X if (curwp->w_dotp == curbp->b_linep &&
X lback(curwp->w_dotp) != curbp->b_linep)
X backline(TRUE,1);
X
X /* start recording for '.' command */
X dotcmdbegin();
X
X /* Fix up the screen */
X s = update(FALSE);
X
X /* get the next command from the keyboard */
X c = kbd_seq();
X
X /* if there is something on the command line, clear it */
X if (mpresf != FALSE) {
X mlerase();
X if (s != SORTOFTRUE) /* did nothing due to typeahead */
X update(FALSE);
X }
X
X f = FALSE;
X n = 1;
X
X do_num_proc(&c,&f,&n);
X do_rept_arg_proc(&c,&f,&n);
X
X kregflag = 0;
X
X /* flag the first time through for some commands -- e.g. subst
X must know to not prompt for strings again, and pregion
X must only restart the p-lines buffer once for each
X command. */
X calledbefore = FALSE;
X
X /* and execute the command */
X execute(kcod2fnc(c), f, n);
X
X if (bheadp != curbp)
X mlwrite("BUG: main: bheadp != curbp, bhead name is %s",
X bheadp->b_bname);
X
X /* stop recording for '.' command */
X dotcmdfinish();
X }
}
X
#if BSD | USG | V7
catchintr()
{
X interrupted = TRUE;
#if USG
X signal(SIGINT,catchintr);
#endif
}
#endif
X
/* do number processing if needed */
do_num_proc(cp,fp,np)
int *cp, *fp, *np;
{
X register int c, f, n;
X register int mflag;
X
X c = *cp;
X f = *fp;
X n = *np;
X
X if (iscntrl(c) || (c & (CTLA|CTLX|SPEC)))
X return;
X if ( isdigit(c) && c != '0' ) {
X f = TRUE; /* there is a # arg */
X n = 0; /* start with a zero default */
X mflag = 1; /* current minus flag */
X while (isdigit(c) || (c == '-')) {
X if (c == '-') {
X /* already hit a minus or digit? */
X if ((mflag == -1) || (n != 0))
X break;
X mflag = -1;
X } else {
X n = n * 10 + (c - '0');
X }
X if ((n == 0) && (mflag == -1)) /* lonely - */
X mlwrite("arg:");
X else
X mlwrite("arg: %d",n * mflag);
X
X c = kbd_seq(); /* get the next key */
X }
X n = n * mflag; /* figure in the sign */
X }
X *cp = c;
X *fp = f;
X *np = n;
}
X
/* do ^U-style repeat argument processing -- vile binds this to 'K' */
do_rept_arg_proc(cp,fp,np)
int *cp, *fp, *np;
{
X register int c, f, n;
X register int mflag;
X c = *cp;
X f = *fp;
X n = *np;
X
X if (c != reptc)
X return;
X
X f = TRUE;
X n = 4; /* with argument of 4 */
X mflag = 0; /* that can be discarded. */
X mlwrite("arg: 4");
X while (isdigit(c=kbd_seq()) || c==reptc || c=='-'){
X if (c == reptc)
X if ((n > 0) == ((n*4) > 0))
X n = n*4;
X else
X n = 1;
X /*
X * If dash, and start of argument string, set arg.
X * to -1. Otherwise, insert it.
X */
X else if (c == '-') {
X if (mflag)
X break;
X n = 0;
X mflag = -1;
X }
X /*
X * If first digit entered, replace previous argument
X * with digit and set sign. Otherwise, append to arg.
X */
X else {
X if (!mflag) {
X n = 0;
X mflag = 1;
X }
X n = 10*n + c - '0';
X }
X mlwrite("arg: %d", (mflag >=0) ? n : (n ? -n : -1));
X }
X /*
X * Make arguments preceded by a minus sign negative and change
X * the special argument "^U -" to an effective "^U -1".
X */
X if (mflag == -1) {
X if (n == 0)
X n++;
X n = -n;
X }
X
X *cp = c;
X *fp = f;
X *np = n;
}
X
X
/*
X * This is the general command execution routine. It takes care of checking
X * flags, globals, etc, to be sure we're not doing something dumb.
X * Return the status of command.
X */
X
int
execute(execfunc, f, n)
CMDFUNC *execfunc; /* ptr to function to execute */
{
X register int status, flags;
X LINE *odotp;
X int odoto;
X
X if (execfunc == NULL) {
X TTbeep();
#if REBIND
X mlwrite("[Key not bound]"); /* complain */
#else
X mlwrite("[Not a command]"); /* complain */
#endif
X return (FALSE);
X }
X
X flags = execfunc->c_flags;
X
X /* commands following operators can't be redone or undone */
X if ( !doingopcmd) {
X /* don't record non-redoable cmds */
X if ((flags & REDO) == 0)
X dotcmdstop();
X if (flags & UNDO) {
X /* undoable command can't be permitted when read-only */
X if (curbp->b_mode&MDVIEW)
X return(rdonly());
X mayneedundo();
X }
X }
X
X /* if motion is absolute, remember where we are */
X if (flags & ABS) {
X odotp = curwp->w_dotp;
X odoto = curwp->w_doto;
X }
X
X status = (execfunc->c_func)(f, n, NULL, NULL);
X if ((flags & GOAL) == 0) { /* goal should not be retained */
X curgoal = -1;
X }
X if (flags & UNDO) /* verify malloc arena after line changers */
X vverify("main");
X
X /* if motion was absolute, and we moved, update the "last dot" mark */
X if ((flags & ABS) && curwp->w_dotp != odotp) {
X curwp->w_ldmkp = odotp;
X curwp->w_ldmko = odoto;
X }
X
X return (status);
}
X
/*
X * Fancy quit command, as implemented by Norm. If the any buffer has
X * changed do a write on that buffer and exit, otherwise simply exit.
X */
quickexit(f, n)
{
X register BUFFER *bp; /* scanning pointer to buffers */
X register BUFFER *oldcb; /* original current buffer */
X register int status;
X int thiscmd;
X int cnt;
X
X oldcb = curbp; /* save in case we fail */
X
X thiscmd = lastcmd;
X if (cnt = anycb()) {
X mlwrite("Will write %d buffer%c %s ",
X cnt, cnt > 1 ? 's':'.',
X clexec ? "" : "Repeat command to continue.");
X if (!clexec && !isnamedcmd) {
X if (thiscmd != kbd_seq())
X return(FALSE);
X }
X
X bp = bheadp;
X while (bp != NULL) {
X if ((bp->b_flag&BFCHG) != 0 &&
X (bp->b_flag&BFINVS) == 0) {
X make_current(bp);
X mlwrite("[Saving %s]",bp->b_fname);
X mlwrite("\n");
X if ((status = filesave(f, n)) != TRUE) {
X make_current(oldcb);
X return(status);
X }
X mlwrite("\n");
X }
X bp = bp->b_bufp; /* on to the next buffer */
X }
X } else if (!clexec && !isnamedcmd) {
X if (thiscmd != kbd_seq())
X return(FALSE);
X }
X quithard(f, n); /* conditionally quit */
X return(TRUE);
}
X
/* Force quit by giving argument */
quithard(f,n)
{
X quit(TRUE,1);
}
X
/*
X * Quit command. If an argument, always quit. Otherwise confirm if a buffer
X * has been changed and not written out.
X */
quit(f, n)
{
X int cnt;
X
X if (f != FALSE || (cnt = anycb()) == 0) {
X vttidy(TRUE);
#if FILOCK
X if (lockrel() != TRUE) {
X exit(1);
X }
#endif
X exit(GOOD);
X }
X if (cnt == 1)
X mlwrite(
X "There is an unwritten modified buffer. Write it, or use :q!");
X else
X mlwrite(
X "There are %d unwritten modified buffers. Write them, or use :q!",
X cnt);
X return (FALSE);
}
X
writequit(f,n)
{
X int s;
X s = filesave(FALSE,n);
X if (s != TRUE)
X return s;
X return(quit(FALSE,n));
}
X
/*
X * Begin recording a dot command macro.
X * Set up variables and return.
X */
dotcmdbegin()
{
X switch (dotcmdmode) {
X case TMPSTOP:
X case PLAY:
X return(FALSE);
X }
X tmpcmdptr = &tmpcmdm[0];
X tmpcmdend = tmpcmdptr;
X dotcmdmode = RECORD;
X return (TRUE);
}
X
/*
X * End dot command
X */
dotcmdfinish()
{
X
X switch (dotcmdmode) {
X case STOP:
X case PLAY:
X case TMPSTOP:
X return(FALSE);
X
X case RECORD:
X ;
X }
X tmpcmdptr = &tmpcmdm[0];
X dotcmdptr = &dotcmdm[0];
X while (tmpcmdptr < tmpcmdend)
X *dotcmdptr++ = *tmpcmdptr++;
X dotcmdend = dotcmdptr;
X dotcmdptr = &dotcmdm[0];
X tmpcmdptr = tmpcmdptr = &tmpcmdm[0];
X /* leave us in RECORD mode */
X return(TRUE);
}
X
dotcmdstop()
{
X if (dotcmdmode == RECORD) {
X dotcmdmode = STOP;
X }
}
X
/*
X * Execute a macro.
X * The command argument is the number of times to loop. Quit as soon as a
X * command gets an error. Return TRUE if all ok, else FALSE.
X */
dotcmdplay(f, n)
{
X if (n <= 0)
X return (TRUE);
X dotcmdrep = n; /* remember how many times to execute */
X dotcmdmode = PLAY; /* put us in play mode */
X dotcmdptr = &dotcmdm[0]; /* at the beginning */
X
X return(TRUE);
}
/*
X * Begin a keyboard macro.
X * Error if not at the top level in keyboard processing. Set up variables and
X * return.
X */
ctlxlp(f, n)
{
X if (kbdmode != STOP) {
X mlwrite("%%Macro already active");
X return(FALSE);
X }
X mlwrite("[Start macro]");
X kbdptr = &kbdm[0];
X kbdend = kbdptr;
X kbdmode = RECORD;
X return (TRUE);
}
X
/*
X * End keyboard macro. Check for the same limit conditions as the above
X * routine. Set up the variables and return to the caller.
X */
ctlxrp(f, n)
{
X if (kbdmode == STOP) {
X mlwrite("%%Macro not active");
X return(FALSE);
X }
X if (kbdmode == RECORD) {
X mlwrite("[End macro]");
X kbdmode = STOP;
X }
X return(TRUE);
}
X
/*
X * Execute a macro.
X * The command argument is the number of times to loop. Quit as soon as a
X * command gets an error. Return TRUE if all ok, else FALSE.
X */
ctlxe(f, n)
{
X if (kbdmode != STOP) {
X mlwrite("%%Macro already active");
X return(FALSE);
X }
X if (n <= 0)
X return (TRUE);
X kbdrep = n; /* remember how many times to execute */
X kbdmode = PLAY; /* start us in play mode */
X kbdptr = &kbdm[0]; /* at the beginning */
X return(TRUE);
}
X
/*
X * Abort.
X * Beep the beeper. Kill off any keyboard macro, etc., that is in progress.
X * Sometimes called as a routine, to do general aborting of stuff.
X */
esc(f, n)
{
X TTbeep();
X kbdmode = STOP;
X dotcmdmode = STOP;
X fulllineregions = FALSE;
X doingopcmd = FALSE;
X opcmd = 0;
X mlwrite("[Aborted]");
X return(ABORT);
}
X
/* tell the user that this command is illegal while we are in
X VIEW (read-only) mode */
X
rdonly()
{
X TTbeep();
X mlwrite("[No changes are allowed while in \"view\" mode]");
X return FALSE;
}
X
showversion(f,n)
{
X mlwrite(version);
X return TRUE;
}
X
unimpl()
{
X TTbeep();
X mlwrite("[Sorry, that vi command is unimplemented in vile ]");
X return FALSE;
}
X
opercopy() { return unimpl(); }
opermove() { return unimpl(); }
opertransf() { return unimpl(); }
X
operglobals() { return unimpl(); }
opervglobals() { return unimpl(); }
X
map() { return unimpl(); }
unmap() { return unimpl(); }
X
source() { return unimpl(); }
X
subst_again() { return unimpl(); }
X
visual() { return unimpl(); }
ex() { return unimpl(); }
X
nullproc() /* user function that does (almost) NOTHING */
{
X return TRUE;
}
X
cntl_af() /* dummy function for binding to control-a prefix */
{
}
X
cntl_xf() /* dummy function for binding to control-x prefix */
{
}
X
unarg() /* dummy function for binding to universal-argument */
{
}
X
/* initialize our version of the "chartypes" stuff normally in ctypes.h */
charinit()
{
X register int c;
X
X /* legal in pathnames */
X _chartypes_['.'] =
X _chartypes_['_'] =
X _chartypes_['-'] =
X _chartypes_['*'] =
X _chartypes_['/'] = _path;
X
X /* legal in "identifiers" */
X _chartypes_['_'] |= _ident;
X
X /* whitespace */
X _chartypes_[' '] =
X _chartypes_['\t'] =
X _chartypes_['\r'] =
X _chartypes_['\n'] =
X _chartypes_['\f'] = _space;
X
X /* control characters */
X for (c = 0; c < ' '; c++)
X _chartypes_[c] |= _cntrl;
X _chartypes_[127] |= _cntrl;
X
X /* lowercase */
X for (c = 'a'; c <= 'z'; c++)
X _chartypes_[c] |= _lower|_path|_ident;
X
X /* uppercase */
X for (c = 'A'; c <= 'Z'; c++)
X _chartypes_[c] |= _upper|_path|_ident;
X
X /* digits */
X for (c = '0'; c <= '9'; c++)
X _chartypes_[c] |= _digit|_path|_ident|_linespec;
X
X /* punctuation */
X for (c = '!'; c <= '/'; c++)
X _chartypes_[c] |= _punct;
X for (c = ':'; c <= '@'; c++)
X _chartypes_[c] |= _punct;
X for (c = '['; c <= '`'; c++)
X _chartypes_[c] |= _punct;
X for (c = '{'; c <= '~'; c++)
X _chartypes_[c] |= _punct;
X
X /* printable */
X for (c = ' '; c <= '~'; c++)
X _chartypes_[c] |= _print;
X
X /* backspacers: ^H, rubout, and the user's backspace char */
X /* we'll add the user's char later */
X _chartypes_['\b'] |= _bspace;
X _chartypes_[127] |= _bspace;
X
X /* wildcard chars for most shells */
X _chartypes_['*'] |= _wild;
X _chartypes_['?'] |= _wild;
X _chartypes_['~'] |= _wild;
X _chartypes_['['] |= _wild;
X _chartypes_[']'] |= _wild;
X _chartypes_['$'] |= _wild;
X _chartypes_['{'] |= _wild;
X _chartypes_['}'] |= _wild;
X
X /* ex mode line specifiers */
X _chartypes_[','] |= _linespec;
X _chartypes_['%'] |= _linespec;
X _chartypes_['-'] |= _linespec;
X _chartypes_['+'] |= _linespec;
X _chartypes_['.'] |= _linespec;
X _chartypes_['$'] |= _linespec;
X _chartypes_['\''] |= _linespec;
X
}
X
X
/***** Compiler specific Library functions ****/
X
#if MWC86 & MSDOS
movmem(source, dest, size)
char *source; /* mem location to move memory from */
char *dest; /* memory location to move text to */
int size; /* number of bytes to move */
{
X register int i;
X
X for (i=0; i < size; i++)
X *dest++ = *source++;
}
#endif
X
#if (AZTEC | MSC | TURBO | LATTICE) & MSDOS
/* strncpy: copy a string...with length restrictions
X ALWAYS null terminate
Hmmmm...
I don't know much about DOS, but I do know that strncpy shouldn't ALWAYS
X null terminate. -pgf
*/
X
char *strncpy(dst, src, maxlen)
char *dst; /* destination of copied string */
char *src; /* source */
int maxlen; /* maximum length */
{
X char *dptr; /* ptr into dst */
X
X dptr = dst;
X while (*src && (maxlen-- > 0))
X *dptr++ = *src++;
X *dptr = 0;
X return(dst);
}
#endif
X
#if RAMSIZE & LATTICE & MSDOS
/* These routines will allow me to track memory usage by placing
X a layer on top of the standard system malloc() and free() calls.
X with this code defined, the environment variable, $RAM, will
X report on the number of bytes allocated via malloc.
X
X with SHOWRAM defined, the number is also posted on the
X end of the bottom mode line and is updated whenever it is changed.
*/
X
#undef malloc
#undef free
X
char *allocate(nbytes) /* allocate nbytes and track */
unsigned nbytes; /* # of bytes to allocate */
{
X char *mp; /* ptr returned from malloc */
X
X mp = malloc(nbytes);
X if (mp) {
X envram += nbytes;
#if RAMSHOW
X dspram();
#endif
X }
X
X return(mp);
}
X
release(mp) /* release malloced memory and track */
char *mp; /* chunk of RAM to release */
{
X unsigned *lp; /* ptr to the long containing the block size */
X
X if (mp) {
X lp = ((unsigned *)mp) - 1;
X
X /* update amount of ram currently malloced */
X envram -= (long)*lp - 2;
X free(mp);
#if RAMSHOW
X dspram();
#endif
X }
}
X
#if RAMSHOW
dspram() /* display the amount of RAM currently malloced */
{
X char mbuf[20];
X char *sp;
X
X TTmove(term.t_nrow - 1, 70);
#if COLOR
X TTforg(7);
X TTbacg(0);
#endif
X sprintf(mbuf, "[%lu]", envram);
X sp = &mbuf[0];
X while (*sp)
X TTputc(*sp++);
X TTmove(term.t_nrow, 0);
X movecursor(term.t_nrow, 0);
}
#endif
#endif
SHAR_EOF
echo 'File main.c is complete' &&
chmod 0444 main.c ||
echo 'restore of main.c failed'
Wc_c="`wc -c < 'main.c'`"
test 23507 -eq "$Wc_c" ||
echo 'main.c: original size 23507, current size' "$Wc_c"
# ============= make.ini ==============
echo 'x - extracting make.ini (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'make.ini' &&
CP = copy # what 'cp' to use.
RM = del # what 'rm' to use.
MV = ren # What 'mv' to use.
LINKER = \usr\lib\bin\tlink.exe # What link to use.
CC = tcc # What C compiler I am using.
X
INCLUDE = \usr\lib\tinclude # Where to find header files. .h
LIB = \usr\lib\tlib # Where to find the libary files. .lib
MAPFILE = \dev\nul # Where to put the link map file.
X
# switches for TurboC....
MODEL = l # t)iny s)mall c)ompact m)edium l)arge h)uge
MDL = $(MODEL) # The masm model.
CPU = 1 # 0=8088 1=186/286
MATH = f # f87=8087 f=emulate f-=no floating
MATHLIB = emu # emu, f87, or nothing
TYPE = G # G=speed O=size
SWITCHES= -I$(INCLUDE) -L$(LIB) -m$(MODEL) -$(CPU) -$(MATH) \
X -$(TYPE)
CFLAGS = $(SWITCHES)
X
# Print the `make -h' message
.HELP
X
# The order to search for rules and files is specified by .SUFFIXES
.SUFFIXES: .exe .obj .c .for .asm
X
# DEFAULT RULES
.asm.obj:
X masm $*.asm;
X
.c.obj:
X $(CC) $(CFLAGS) -c $*.c
X
.for.obj:
X for1 $*.for;
X pas2
X
.obj.exe:
X $(CP) $(LINKER) .\link.exe
X link $(LIB)\c0$(MODEL) $(OBJS), $@, $(MAPFILE), \
X $(LIB)\$(MATHLIB) $(LIB)\math$(MODEL) $(LIB)\c$(MODEL)
X $(RM) .\link.exe
X $(CP) $(PROGRAM) $(DEST)
X
# .obj.exe:
# link $*.obj, $@, $(MAPFILE), $(LIBS)
X
.asm.exe:
X masm $*.asm;
X link $*.obj, $@, $(MAPFILE), $(LIBS)
X $(RM) $*.obj
X
.c.exe:
X $(CC) $(CFLAGS) -c $*.c
X link $*.obj, $@;
X $(RM) $*.obj
X
.for.exe:
X for1 $*.for;
X pas2
X link $*.obj, $@, $(MAPFILE), $(LIB)\FORTRAN.LIB
SHAR_EOF
chmod 0444 make.ini ||
echo 'restore of make.ini failed'
Wc_c="`wc -c < 'make.ini'`"
test 1438 -eq "$Wc_c" ||
echo 'make.ini: original size 1438, current size' "$Wc_c"
# ============= makefile ==============
echo 'x - extracting makefile (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'makefile' &&
#
# makefile for vile.
# The defs for what system this is really running on are in estruct.h.
# Be sure to edit that, to define your system.
# The command/name/key/function bindings are defined in the file "cmdtbl". The
# mktbls program parses this to produce nebind.h, nename.h, and nefunc.h,
# which are used by the rest of the build.
#
# The version number (currently three) is found near the top of
# edef.h, and is displayed with the '*' and ":version" commands.
# Paul Fox
#
# original makefile for uemacs: Adam Fritz July 30,1987
X
X
# To change screen driver modules, change SCREEN below, and edit estruct.h to
# make sure the correct one is #defined as "1", and the others all as "0"
#SCREEN = at386
# if you use tcap.c, you'll need libtermcap.a too.
SCREEN = tcap
X
TARGET = vile
X
#DESTDIR = $(HOME)/bin
DESTDIR = /usr/local/bin
LIBS = -ltermcap
X
REMOTE=towno!pgf
X
#CFLAGS = -O
CFLAGS = -g
#CFLAGS = -g -systype sysv # for the mips machine
CC=cc
X
X
# All of the makefiles which should be preserved
MAKEFILES = makefile make.ini
HEADER_BUILDER = ./mktbls
X
ALLTOOLS = $(MAKEFILES)
X
# this stuff lives in the shorten subdirectory. It was lifted from the
# GNU emacs distribution. See the file COPYING for more info.
SHORTSTUFF = shorten/COPYING \
X shorten/names.c \
X shorten/dups.c \
X shorten/defines.c \
X shorten/header.h \
X shorten/reserved \
X shorten/special
X
# these are normal editable headers
HDRS = estruct.h epath.h evar.h edef.h
X
# these headers are built by the mktbls program from the information
# in cmdtbl, but are backed up and
# distributed anyway, in case you can't get mktbls running
BUILTHDRS = nebind.h nefunc.h nename.h
X
# this is obsolete stuff NOT needed by the build, but it shouldn't
# be thrown away (yet). For instance, ebind.h has per-machine binding
# information that hasn't been incorporated into cmdtbl yet.
OLDHDRS = ebind.h efunc.h
X
ALLHDRS = $(HDRS) $(BUILTHDRS) $(OLDHDRS)
X
# All the C files which should be saved
# (including tools, like mktbls.c, unused screen drivers, etc.)
CSRCac = ansi.c at386.c basic.c bind.c buffer.c crypt.c csrch.c
CSRCde = dg10.c display.c dolock.c eval.c exec.c
CSRCfh = file.c fileio.c finderr.c globals.c hp110.c hp150.c
CSRCim = ibmpc.c input.c isearch.c line.c lock.c main.c mktbls.c
CSRCnr = news.c npopen.c opers.c oneliner.c random.c region.c
CSRCst = search.c spawn.c st520.c tags.c tcap.c termio.c tipc.c
CSRCuz = undo.c vmalloc.c vmsvt.c vt52.c window.c word.c wordmov.c z309.c
X
CSRC = $(CSRCac) $(CSRCde) $(CSRCfh) $(CSRCim) $(CSRCnr) \
X $(CSRCst) $(CSRCuz)
X
# non-C source code
OTHERSRC = z100bios.asm news.cps
X
# text and data files
TEXTFILES = README cmdtbl vile.hlp tags buglist readme.news
X
ALLSRC = $(CSRC) $(OTHERSRC)
X
EVERYTHING = $(ALLTOOLS) $(ALLHDRS) $(ALLSRC) $(TEXTFILES) $(SHORTSTUFF)
X
SRC = npopen.c finderr.c main.c buffer.c $(SCREEN).c termio.c display.c \
X word.c wordmov.c window.c spawn.c \
X region.c search.c random.c isearch.c lock.c line.c \
X input.c fileio.c exec.c file.c eval.c \
X dolock.c crypt.c bind.c basic.c opers.c undo.c csrch.c tags.c \
X vmalloc.c globals.c oneliner.c
X
OBJ = npopen.o finderr.o main.o buffer.o $(SCREEN).o termio.o display.o \
X word.o wordmov.o window.o spawn.o \
X region.o search.o random.o isearch.o lock.o line.o \
X input.o fileio.o exec.o file.o eval.o \
X dolock.o crypt.o bind.o basic.o opers.o undo.o csrch.o tags.o \
X vmalloc.o globals.o oneliner.o
X
all: $(TARGET)
X
$(TARGET) : $(BUILTHDRS) $(OBJ) makefile
X -mv $(TARGET) o$(TARGET)
X $(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LIBS)
X
$(BUILTHDRS): cmdtbl $(HEADER_BUILDER)
X $(HEADER_BUILDER) cmdtbl
X
install : $(TARGET)
X cp $(TARGET) $(DESTDIR)
X test -f vile.hlp && /bin/rm -f $(DESTDIR)/vile.hlp
X cp vile.hlp $(DESTDIR)
X chmod 0644 $(DESTDIR)/vile.hlp
X
compr-shar:
X [ -d cshardir ] || mkdir cshardir
# add -a for archive headers, add -s pgf at cayman.com for submitted-by
X shar -p -nvile -L55 -o cshardir/vileshar \
X -T README -C `ls $(EVERYTHING) | sed /README/d`
X
shar:
X [ -d shardir ] || mkdir shardir
# add -a for archive headers, add -s pgf at cayman.com for submitted-by
X shar -x -a -spgf at cayman.com -nVile -L55 \
X -o shardir/vileshar `ls $(EVERYTHING)`
X
# only uucp things changed since last time
uuto:
X uuto `ls -t $(EVERYTHING) uutodone | sed '/uutodone/q'` $(REMOTE)
X date >uutodone
X
floppy:
X ls $(EVERYTHING) | oo
X
# you don't want to know...
dosscript:
X ( \
X echo echo on ;\
X for x in `ls -t $(EVERYTHING) dosback.bat | sed '/dosback.bat/q'` ;\
X do \
X echo copy o:$$x a: ;\
X done ;\
X echo quit ;\
X ) >tmp.bat
X ud < tmp.bat >dosback.bat
X /bin/rm -f tmp.bat
X #-dos
X #>dosback.bat
X
newdosfloppy:
X touch 0101010170 dosback.bat
X
# dump a list of the important files
list:
X @ls $(EVERYTHING) | more
X
# dump a list of files that may have changed since last backup
rw list-writeable:
X @for x in $(EVERYTHING) ;\
X do \
X if [ -w $$x ] ;\
X then \
X echo $$x ;\
X fi \
X done
X
no-write:
X chmod -w $(EVERYTHING)
X
tags:
X dotags $(SRC) $(HDRS)
X
lint: $(SRC)
X lint -hbvxac $(SRC) >lint.out
X
clean:
X rm -f *.o o$(TARGET) $(BUILTHDRS) $(HEADER_BUILDER) news.h core *~ *.BAK
X
clobber: clean
X rm -f $(TARGET)
X
news.h: news.cps
X cps news.cps
X
print:
X pr makefile $(HDRS) $(SRC) | lpr
X
depend: $(SRC) $(HDRS) $(BUILTHDRS)
X mv -f makefile makefile.orig
X (sed -e '/^#DEPENDS/,$$d' makefile.orig ; \
X echo "#DEPENDS" ; \
X $(CC) -M $(CFLAGS) $? ) > makefile
X
# you need this if SHORTNAMES is 0 in estruct.h
# estruct.h: shorten/remap.h
X
# or this either
shorten/remap.h:
X cd shorten; $(MAKE) remap.h
X
#DEPENDS
news.o: news.c
news.o: /usr/include/stdio.h
news.o: ./estruct.h
news.o: ./edef.h
news.o: ./news.h
word.o: word.c
word.o: /usr/include/stdio.h
word.o: ./estruct.h
word.o: ./edef.h
vmsvt.o: vmsvt.c
vmsvt.o: /usr/include/stdio.h
vmsvt.o: ./estruct.h
vmsvt.o: ./edef.h
window.o: window.c
window.o: /usr/include/stdio.h
window.o: ./estruct.h
window.o: ./edef.h
vt52.o: vt52.c
vt52.o: /usr/include/stdio.h
vt52.o: ./estruct.h
vt52.o: ./edef.h
tipc.o: tipc.c
tipc.o: /usr/include/stdio.h
tipc.o: ./estruct.h
tipc.o: ./edef.h
tcap.o: tcap.c
tcap.o: /usr/include/stdio.h
tcap.o: ./estruct.h
tcap.o: ./edef.h
termio.o: termio.c
termio.o: /usr/include/stdio.h
termio.o: ./estruct.h
termio.o: ./edef.h
termio.o: /usr/include/sgtty.h
termio.o: /usr/include/sys/ioctl.h
#termio.o: /usr/include/sys/ttychars.h
#termio.o: /usr/include/sys/ttydev.h
termio.o: /usr/include/signal.h
termio.o: /usr/include/sys/ioctl.h
spawn.o: spawn.c
spawn.o: /usr/include/stdio.h
spawn.o: ./estruct.h
spawn.o: ./edef.h
spawn.o: /usr/include/signal.h
st520.o: st520.c
st520.o: /usr/include/stdio.h
st520.o: ./estruct.h
st520.o: ./edef.h
region.o: region.c
region.o: /usr/include/stdio.h
region.o: ./estruct.h
region.o: ./edef.h
search.o: search.c
search.o: /usr/include/stdio.h
search.o: ./estruct.h
search.o: ./edef.h
main.o: main.c
main.o: /usr/include/stdio.h
main.o: ./estruct.h
main.o: ./nefunc.h
main.o: ./edef.h
main.o: ./nebind.h
main.o: ./nename.h
random.o: random.c
random.o: /usr/include/stdio.h
random.o: ./estruct.h
random.o: ./edef.h
isearch.o: isearch.c
isearch.o: /usr/include/stdio.h
isearch.o: ./estruct.h
isearch.o: ./edef.h
lock.o: lock.c
lock.o: /usr/include/stdio.h
lock.o: ./estruct.h
lock.o: ./edef.h
lock.o: /usr/include/sys/errno.h
line.o: line.c
line.o: /usr/include/stdio.h
line.o: ./estruct.h
line.o: ./edef.h
ibmpc.o: ibmpc.c
ibmpc.o: /usr/include/stdio.h
ibmpc.o: ./estruct.h
ibmpc.o: ./edef.h
input.o: input.c
input.o: /usr/include/stdio.h
input.o: ./estruct.h
input.o: ./edef.h
hp110.o: hp110.c
hp110.o: /usr/include/stdio.h
hp110.o: ./estruct.h
hp110.o: ./edef.h
hp150.o: hp150.c
hp150.o: /usr/include/stdio.h
hp150.o: ./estruct.h
hp150.o: ./edef.h
fileio.o: fileio.c
fileio.o: /usr/include/stdio.h
fileio.o: ./estruct.h
fileio.o: ./edef.h
exec.o: exec.c
exec.o: /usr/include/stdio.h
exec.o: ./estruct.h
exec.o: ./edef.h
file.o: file.c
file.o: /usr/include/stdio.h
file.o: ./estruct.h
file.o: ./edef.h
eval.o: eval.c
eval.o: /usr/include/stdio.h
eval.o: ./estruct.h
eval.o: ./edef.h
eval.o: ./evar.h
display.o: display.c
display.o: /usr/include/stdio.h
display.o: ./estruct.h
display.o: ./edef.h
dolock.o: dolock.c
buffer.o: buffer.c
buffer.o: /usr/include/stdio.h
buffer.o: ./estruct.h
buffer.o: ./edef.h
crypt.o: crypt.c
crypt.o: /usr/include/stdio.h
crypt.o: ./estruct.h
crypt.o: ./edef.h
dg10.o: dg10.c
dg10.o: /usr/include/stdio.h
dg10.o: ./estruct.h
dg10.o: ./edef.h
bind.o: bind.c
bind.o: /usr/include/stdio.h
bind.o: ./estruct.h
bind.o: ./edef.h
bind.o: ./epath.h
basic.o: basic.c
basic.o: /usr/include/stdio.h
basic.o: ./estruct.h
basic.o: ./edef.h
ansi.o: ansi.c
ansi.o: /usr/include/stdio.h
ansi.o: ./estruct.h
ansi.o: ./edef.h
opers.o: opers.c
opers.o: ./estruct.h
opers.o: ./edef.h
wordmov.o: wordmov.c
wordmov.o: ./estruct.h
wordmov.o: ./edef.h
csrch.o: csrch.c
csrch.o: ./estruct.h
csrch.o: ./edef.h
undo.o: undo.c
undo.o: ./estruct.h
undo.o: ./edef.h
tags.o: tags.c
tags.o: ./estruct.h
tags.o: ./edef.h
finderr.o: finderr.c
finderr.o: ./estruct.h
finderr.o: ./edef.h
at386.o: at386.c
at386.o: /usr/include/stdio.h
at386.o: ./estruct.h
at386.o: ./edef.h
npopen.o: npopen.c
npopen.o: ./estruct.h
npopen.o: ./edef.h
oneliner.o: oneliner.c
oneliner.o: ./estruct.h
oneliner.o: ./edef.h
globals.o: globals.c
globals.o: ./estruct.h
globals.o: ./edef.h
SHAR_EOF
chmod 0444 makefile ||
echo 'restore of makefile failed'
Wc_c="`wc -c < 'makefile'`"
test 9302 -eq "$Wc_c" ||
echo 'makefile: original size 9302, current size' "$Wc_c"
# ============= mktbls.c ==============
echo 'x - extracting mktbls.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'mktbls.c' &&
#include <stdio.h>
X
/* This standalone utility program constructs the function, key and command
X binding tables for vile. The input is a data file containing the
X desired default relationships among the three entities. Output
X is nebind.h, nefunc.h, and nename.h, all of which are then included
X in main.c
X This code written by Paul Fox, (c)1990
X
X See the file "cmdtbls" for input data formats, and "estruct.h" for
X the output structures.
X
*/
X
char *progcreat = "/* %s: this header file was produced automatically by\n\
X * the %s program, based on input from the file %s\n */\n";
X
#define DIFCNTRL 0x40
#define tocntrl(c) ((c)^DIFCNTRL)
#define toalpha(c) ((c)^DIFCNTRL)
#define DIFCASE 0x20
#define toupper(c) ((c)^DIFCASE)
#define tolower(c) ((c)^DIFCASE)
X
int l = 0;
FILE *nebind, *nefunc, *nename, *cmdtbl;
X
char *malloc();
char *formcond();
X
struct stringl {
X char *s1;
X char *s2;
X char *s3;
X struct stringl *nst;
};
X
main(argc, argv)
char *argv[];
{
X char line[100];
X char func[50];
X char flags[50];
X char english[50];
X char fcond[50];
X char ncond[50];
X char key[50];
X char bcond[50];
X int r;
X
X if (argc != 2) {
X fprintf(stderr, "usage: mktbls cmd-file\n");
X exit(1);
X }
X
X if ((cmdtbl = fopen(argv[1],"r")) == NULL ) {
X fprintf(stderr,"mktbls: couldn't open cmd-file\n");
X exit(1);
X }
X
X if ( (nebind = fopen("nebind.h","w")) == NULL ||
X (nefunc = fopen("nefunc.h","w")) == NULL ||
X (nename = fopen("nename.h","w")) == NULL ) {
X fprintf(stderr,"mktbls: couldn't open header files\n");
X exit(1);
X }
X
X fprintf(nebind,progcreat,"nebind.h",argv[0],argv[1]);
X fprintf(nefunc,progcreat,"nefunc.h",argv[0],argv[1]);
X fprintf(nename,progcreat,"nename.h",argv[0],argv[1]);
X
X
X /* process each input line */
X while (fgets(line,100,cmdtbl) != NULL) {
X l++;
X if (line[0] == '#') { /* comment */
X continue;
X } else if (line[0] == '\n') { /* empty line */
X continue;
X } else if (line[0] != '\t') { /* then it's a new func */
X /* we can spill information about funcs right away */
X r = sscanf(line,"%s %s %s",func,flags,fcond);
X if (r < 2 || r > 3)
X badfmt("looking for new function");
X if (r != 3)
X fcond[0] = '\0';
X
X if (fcond[0])
X fprintf(nefunc,"#if %s\n",fcond);
X fprintf(nefunc,"extern int %s();\n", func);
X fprintf(nefunc,"\tCMDFUNC f_%s = { %s,\t%s };\n",
X func, func, flags);
X if (fcond[0])
X fprintf(nefunc,"#endif\n");
X
X } else if (line[1] == '"') { /* then it's an english name */
X
X r = sscanf(line, " \"%[^\"]\" %s", english,ncond);
X if (r < 1 || r > 2)
X badfmt("looking for english name");
X if (r != 2)
X ncond[0] = '\0';
X
X savenames(english, func, formcond(fcond,ncond));
X
X } else if (line[1] == '\'') { /* then it's a key */
X r = sscanf(&line[2], "%[^']' %s", key, ncond);
X if (r < 1 || r > 2)
X badfmt("looking for key binding");
X if (r != 2)
X ncond[0] = '\0';
X
X savebindings(key, func, formcond(fcond,ncond));
X
X } else {
X badfmt("bad line");
X }
X }
X
X dumpnames();
X dumpbindings();
X
X exit(0);
}
X
char *
formcond(c1,c2)
char *c1, *c2;
{
X static char cond[50];
X if (c1[0] && c2[0])
X sprintf(cond,"#if (%s) & (%s)\n",c1,c2);
X else if (c1[0] || c2[0])
X sprintf(cond,"#if (%s%s)\n",c1,c2);
X else
X cond[0] = '\0';
X return cond;
}
X
badfmt(s)
{
X fprintf(stderr,"\"cmdtbl\", line %d: bad format:",l);
X fprintf(stderr," %s\n",s);
X exit(1);
}
X
#define ASCIIBIND 0
#define CTLXBIND 1
#define CTLABIND 2
#define SPECBIND 3
char *bindings[4][128];
char *conditions[4][128];
char *tblname[] = {"asciitbl", "ctlxtbl", "metatbl", "spectbl" };
char *prefname[] = {"", "CTLX|", "CTLA|", "SPEC|" };
X
/* prc2kcod: translate printable code to C-language keycode */
savebindings(s,func,cond)
char *s, *func, *cond;
{
X int btype, c;
X
X btype = ASCIIBIND;
X
X if (*s == '^' && *(s+1) == 'A'&& *(s+2) == '-') {
X btype = CTLABIND;
X s += 3;
X } else if (*s == 'F' && *(s+1) == 'N' && *(s+2) == '-') {
X btype = SPECBIND;
X s += 3;
X } else if (*s == '^' && *(s+1) == 'X'&& *(s+2) == '-') {
X btype = CTLXBIND;
X s += 3;
X }
X
X if (*s == '\\') { /* try for an octal value */
X c = 0;
X while (*++s < '8' && *s >= '0') c = (c*8) + *s - '0';
X if (c > 127)
X badfmt("octal character");
X if (bindings[btype][c] != NULL)
X badfmt("duplicate key binding");
X bindings[btype][c] = malloc(strlen(func)+1);
X strcpy(bindings[btype][c], func);
X } else if (*s == '^' && (c = *(s+1)) != '\0') { /* a control char? */
X if (c > 'a' && c < 'z')
X c = toupper(c);
X c = tocntrl(c);
X if (bindings[btype][c] != NULL)
X badfmt("duplicate key binding");
X bindings[btype][c] = malloc(strlen(func)+1);
X strcpy(bindings[btype][c], func);
X s += 2;
X } else if (c = *s) {
X if (bindings[btype][c] != NULL)
X badfmt("duplicate key binding");
X bindings[btype][c] = malloc(strlen(func)+1);
X strcpy(bindings[btype][c], func);
X s++;
X } else {
X badfmt("getting binding");
X }
X if (cond[0]) {
X conditions[btype][c] = malloc(strlen(cond)+1);
X strcpy(conditions[btype][c], cond);
X } else {
X conditions[btype][c] = NULL;
X }
X
X if (*s != '\0')
X badfmt("got extra characters");
X
}
X
dumpbindings()
{
X char **bindptr;
X char *sctl;
X int i, c, btype;
X
X btype = ASCIIBIND;
X
X fprintf(nebind,"\nCMDFUNC *%s[128] = {\n",tblname[btype]);
X for (i = 0; i < 128; i++) {
X if (conditions[btype][i]) {
X fprintf(nebind,"%s", conditions[btype][i]);
X }
X if (i < ' ' || i > '~' ) {
X sctl = "ctrl-";
X c = toalpha(i);
X } else {
X sctl = "";
X c = i;
X }
X
X if (bindings[btype][i])
X fprintf(nebind," &f_%s, /* %s%c */\n",
X bindings[btype][i], sctl, c);
X else
X fprintf(nebind," NULL, /* %s%c */\n", sctl, c);
X if (conditions[btype][i]) {
X fprintf(nebind,"#else\n NULL,\n#endif\n");
X }
X
X }
X fprintf(nebind,"};\n");
X
X
X fprintf(nebind,"\nKBIND kbindtbl[NBINDS] = {\n");
X for (btype = 1; btype <= 3; btype++) {
X for (i = 0; i < 128; i++) {
X if (bindings[btype][i]) {
X if (conditions[btype][i]) {
X fprintf(nebind,"%s",
X conditions[btype][i]);
X }
X if (i < ' ')
X fprintf(nebind,
X " { %stocntrl('%c'), &f_%s },\n",
X prefname[btype],
X toalpha(i),bindings[btype][i]);
X else
X fprintf(nebind,
X " { %s'%c', &f_%s },\n",
X prefname[btype],
X i, bindings[btype][i]);
X if (conditions[btype][i]) {
X fprintf(nebind,"#endif\n");
X }
X }
X }
X }
X fprintf(nebind," { 0, NULL }\n");
X fprintf(nebind,"};\n");
}
X
struct stringl lastname = {"\177\177\177\177\177\177", "", "", NULL};
struct stringl lnamecond = {"", "", "", NULL};
struct stringl firstname = {"", "", "", &lastname};
struct stringl fnamecond = {"", "", "", &lnamecond};
X
savenames(name,func,cond)
char *name, *func, *cond;
{
X char tmpline[80];
X struct stringl *n, *m;
X int r;
X
X n = (struct stringl *)malloc(sizeof (struct stringl));
X
X /* strtolower(name); */
X
X n->s1 = (char *)malloc(strlen(name)+1);
X strcpy(n->s1, name);
X
X sprintf(tmpline,"\t{ \"%s\",\t&f_%s },\n",
X name, func);
X n->s2 = (char *)malloc(strlen(func)+1);
X strcpy(n->s2, func);
X
X n->s3 = (char *)malloc(strlen(cond)+1);
X strcpy(n->s3, cond);
X
X for (m = &firstname; m->nst != NULL; m = m->nst) {
X if ((r = strcmp(n->s1, m->nst->s1)) < 0) { /* insert it here */
X n->nst = m->nst;
X m->nst = n;
X break;
X } else if (r == 0) {
X badfmt("duplicate english name");
X }
X }
}
X
dumpnames()
{
X struct stringl *m;
X
X fprintf(nename,"\n/* if you maintain this by hand, keep it in */\n");
X fprintf(nename,"/* alphabetical order!!!! */\n\n");
X fprintf(nename,"NTAB nametbl[] = {\n");
X for (m = firstname.nst; m->nst != NULL; m = m->nst) {
X if (m->s3[0])
X fprintf(nename,"%s",m->s3);
X fprintf(nename,"\t{ \"%s\",\t&f_%s },\n", m->s1, m->s2);
X if (m->s3[0])
X fprintf(nename,"#endif\n");
X }
X fprintf(nename," { NULL, NULL }\n};\n");
}
X
strtolower(s)
char *s;
{
X while (*s) {
X if (*s >= 'A' && *s <= 'Z')
X *s = tolower(*s);
X s++;
X }
}
SHAR_EOF
chmod 0444 mktbls.c ||
echo 'restore of mktbls.c failed'
Wc_c="`wc -c < 'mktbls.c'`"
test 7809 -eq "$Wc_c" ||
echo 'mktbls.c: original size 7809, current size' "$Wc_c"
# ============= nebind.h ==============
echo 'x - extracting nebind.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'nebind.h' &&
/* nebind.h: this header file was produced automatically by
X * the ./mktbls program, based on input from the file cmdtbl
X */
X
CMDFUNC *asciitbl[128] = {
X NULL, /* ctrl-@ */
X &f_cntl_af, /* ctrl-A */
X &f_backpage, /* ctrl-B */
X NULL, /* ctrl-C */
X &f_forwhpage, /* ctrl-D */
X &f_mvdnwind, /* ctrl-E */
X &f_forwpage, /* ctrl-F */
X &f_showcpos, /* ctrl-G */
X &f_backchar, /* ctrl-H */
X NULL, /* ctrl-I */
X &f_forwline, /* ctrl-J */
X &f_delwind, /* ctrl-K */
X &f_refresh, /* ctrl-L */
X &f_forwbline, /* ctrl-M */
X &f_nextwind, /* ctrl-N */
X &f_onlywind, /* ctrl-O */
X &f_prevwind, /* ctrl-P */
X &f_nullproc, /* ctrl-Q */
X &f_insfile, /* ctrl-R */
X &f_nullproc, /* ctrl-S */
X &f_splitwind, /* ctrl-T */
X &f_backhpage, /* ctrl-U */
X &f_quote, /* ctrl-V */
X &f_operwrite, /* ctrl-W */
X &f_cntl_xf, /* ctrl-X */
X &f_mvupwind, /* ctrl-Y */
#if (UNIX&&defined(SIGTSTP))
X &f_bktoshell, /* ctrl-Z */
#else
X NULL,
#endif
X &f_esc, /* ctrl-[ */
X NULL, /* ctrl-\ */
#if (TAGS)
X &f_gototag, /* ctrl-] */
#else
X NULL,
#endif
X &f_altbuff, /* ctrl-^ */
X NULL, /* ctrl-_ */
X &f_forwchar, /* */
X &f_operfilter, /* ! */
X &f_usekreg, /* " */
X NULL, /* # */
X &f_gotoeol, /* $ */
#if (CFENCE)
X &f_getfence, /* % */
#else
X NULL,
#endif
X NULL, /* & */
X &f_golinenmmark, /* ' */
X &f_unimpl, /* ( */
X &f_unimpl, /* ) */
X &f_togglelistbuffers, /* * */
X &f_forwbline, /* + */
X &f_rev_csrch, /* , */
X &f_backbline, /* - */
X &f_dotcmdplay, /* . */
X &f_forwsearch, /* / */
X &f_gotobol, /* 0 */
X NULL, /* 1 */
X NULL, /* 2 */
X NULL, /* 3 */
X NULL, /* 4 */
X NULL, /* 5 */
X NULL, /* 6 */
X NULL, /* 7 */
X NULL, /* 8 */
X NULL, /* 9 */
X &f_namedcmd, /* : */
X &f_rep_csrch, /* ; */
X &f_operlshift, /* < */
X NULL, /* = */
X &f_operrshift, /* > */
X &f_backsearch, /* ? */
X NULL, /* @ */
X &f_appendeol, /* A */
X &f_backword, /* B */
X &f_chgtoeol, /* C */
X &f_deltoeol, /* D */
X &f_forwendw, /* E */
X &f_bcsrch, /* F */
X &f_gotoline, /* G */
X &f_gotobos, /* H */
X &f_insertbol, /* I */
X &f_join, /* J */
X &f_unarg, /* K */
X &f_gotoeos, /* L */
X &f_gotomos, /* M */
X &f_revsearch, /* N */
X &f_openup, /* O */
X &f_putbefore, /* P */
X &f_quit, /* Q */
X &f_overwrite, /* R */
X &f_chgline, /* S */
X &f_bcsrch_to, /* T */
X &f_lineundo, /* U */
X &f_enlargewind, /* V */
X &f_forwword, /* W */
X &f_backdelchar, /* X */
X &f_yankline, /* Y */
X &f_quickexit, /* Z */
#if (WORDPRO)
X &f_gotobosec, /* [ */
#else
X NULL,
#endif
X NULL, /* \ */
#if (WORDPRO)
X &f_gotoeosec, /* ] */
#else
X NULL,
#endif
X &f_firstnonwhite, /* ^ */
X &f_histbuff, /* _ */
X &f_goexactnmmark, /* ` */
X &f_append, /* a */
X &f_backviword, /* b */
X &f_operchg, /* c */
X &f_operdel, /* d */
X &f_forwviendw, /* e */
X &f_fcsrch, /* f */
X NULL, /* g */
X &f_backchar, /* h */
X &f_insert, /* i */
X &f_forwline, /* j */
X &f_backline, /* k */
X &f_forwchar, /* l */
X &f_setnmmark, /* m */
X &f_consearch, /* n */
X &f_opendown, /* o */
X &f_putafter, /* p */
X NULL, /* q */
X &f_replacechar, /* r */
X &f_chgchar, /* s */
X &f_fcsrch_to, /* t */
X &f_undo, /* u */
X &f_shrinkwind, /* v */
X &f_forwviword, /* w */
X &f_forwdelchar, /* x */
X &f_operyank, /* y */
X &f_poswind, /* z */
#if (WORDPRO)
X &f_gotobop, /* { */
#else
X NULL,
#endif
X &f_gotocol, /* | */
#if (WORDPRO)
X &f_gotoeop, /* } */
#else
X NULL,
#endif
X &f_flipchar, /* ~ */
X NULL, /* ctrl-? */
};
X
KBIND kbindtbl[NBINDS] = {
X { CTLX|tocntrl('C'), &f_quit },
X { CTLX|tocntrl('L'), &f_mvleftwind },
X { CTLX|tocntrl('R'), &f_mvrightwind },
#if (FINDERR)
X { CTLX|tocntrl('X'), &f_finderr },
#endif
#if (TAGS)
X { CTLX|tocntrl(']'), &f_untagpop },
#endif
X { CTLX|'!', &f_pipecmd },
X { CTLX|'&', &f_ctlxe },
X { CTLX|'(', &f_ctlxlp },
X { CTLX|')', &f_ctlxrp },
X { CTLX|'/', &f_scrforwsearch },
X { CTLX|'0', &f_delwind },
X { CTLX|'1', &f_onlywind },
X { CTLX|'2', &f_splitwind },
X { CTLX|'=', &f_showcpos },
X { CTLX|'?', &f_scrbacksearch },
X { CTLX|'P', &f_lineputbefore },
#if (ISRCH)
X { CTLX|'R', &f_risearch },
#endif
#if (ISRCH)
X { CTLX|'S', &f_fisearch },
#endif
#if (CRYPT)
X { CTLX|'X', &f_setkey },
#endif
X { CTLX|'c', &f_operlinechg },
X { CTLX|'d', &f_operlinedel },
X { CTLX|'e', &f_filefind },
X { CTLX|'f', &f_setfillcol },
X { CTLX|'h', &f_help },
X { CTLX|'p', &f_lineputafter },
X { CTLX|'s', &f_opersubst },
X { CTLX|'t', &f_settab },
#if (VMALLOC)
X { CTLX|'v', &f_setvmalloc },
#endif
X { CTLX|'y', &f_operlineyank },
X { CTLA|tocntrl('D'), &f_scrnextdw },
X { CTLA|tocntrl('E'), &f_mvdnnxtwind },
#if (AEDIT)
X { CTLA|tocntrl('I'), &f_entab },
#endif
X { CTLA|tocntrl('U'), &f_scrnextup },
X { CTLA|tocntrl('Y'), &f_mvupnxtwind },
#if (AEDIT)
X { CTLA|' ', &f_detab },
#endif
X { CTLA|'*', &f_listbuffers },
X { CTLA|'/', &f_scrsearchpat },
X { CTLA|':', &f_onamedcmd },
#if (WORDPRO)
X { CTLA|'f', &f_operformat },
#endif
X { CTLA|'h', &f_help },
#if (WORDPRO)
X { CTLA|'j', &f_operformat },
#endif
X { CTLA|'l', &f_operlower },
#if (AEDIT)
X { CTLA|'o', &f_deblank },
#endif
X { CTLA|'t', &f_trimline },
X { CTLA|'u', &f_operupper },
X { CTLA|'~', &f_operflip },
#if (TERMCAP)
X { SPEC|'1', &f_cbuf1 },
#endif
#if (TERMCAP)
X { SPEC|'2', &f_cbuf2 },
#endif
#if (TERMCAP)
X { SPEC|'3', &f_cbuf3 },
#endif
#if (TERMCAP)
X { SPEC|'4', &f_cbuf4 },
#endif
#if (TERMCAP)
X { SPEC|'5', &f_cbuf5 },
#endif
#if (TERMCAP)
X { SPEC|'6', &f_cbuf6 },
#endif
#if (TERMCAP)
X { SPEC|'7', &f_cbuf7 },
#endif
#if (TERMCAP)
X { SPEC|'8', &f_cbuf8 },
#endif
#if (TERMCAP)
X { SPEC|'9', &f_cbuf9 },
#endif
X { 0, NULL }
};
SHAR_EOF
chmod 0664 nebind.h ||
echo 'restore of nebind.h failed'
Wc_c="`wc -c < 'nebind.h'`"
test 5332 -eq "$Wc_c" ||
echo 'nebind.h: original size 5332, current size' "$Wc_c"
# ============= nefunc.h ==============
echo 'x - extracting nefunc.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'nefunc.h' &&
/* nefunc.h: this header file was produced automatically by
X * the ./mktbls program, based on input from the file cmdtbl
X */
extern int altbuff();
X CMDFUNC f_altbuff = { altbuff, NONE };
extern int append();
X CMDFUNC f_append = { append, REDO|UNDO };
extern int appendeol();
X CMDFUNC f_appendeol = { appendeol, REDO|UNDO };
#if APROP|REBIND
extern int apro();
X CMDFUNC f_apro = { apro, NONE };
#endif
extern int backchar();
X CMDFUNC f_backchar = { backchar, MOTION };
extern int backdelchar();
X CMDFUNC f_backdelchar = { backdelchar, REDO|UNDO };
#if !SMALLER
extern int backhunt();
X CMDFUNC f_backhunt = { backhunt, ABS|MOTION };
#endif
extern int backhpage();
X CMDFUNC f_backhpage = { backhpage, NONE };
extern int backline();
X CMDFUNC f_backline = { backline, GOAL|MOTION|FL };
extern int backbline();
X CMDFUNC f_backbline = { backbline, MOTION|FL };
extern int backpage();
X CMDFUNC f_backpage = { backpage, MOTION };
extern int backword();
X CMDFUNC f_backword = { backword, MOTION };
extern int backviword();
X CMDFUNC f_backviword = { backviword, MOTION };
extern int backsearch();
X CMDFUNC f_backsearch = { backsearch, ABS|MOTION };
extern int bcsrch();
X CMDFUNC f_bcsrch = { bcsrch, MOTION };
extern int bcsrch_to();
X CMDFUNC f_bcsrch_to = { bcsrch_to, MOTION };
#if REBIND
extern int bindkey();
X CMDFUNC f_bindkey = { bindkey, NONE };
#endif
#if UNIX&&defined(SIGTSTP)
extern int bktoshell();
X CMDFUNC f_bktoshell = { bktoshell, NONE };
#endif
extern int cntl_xf();
X CMDFUNC f_cntl_xf = { cntl_xf, NONE };
extern int chgchar();
X CMDFUNC f_chgchar = { chgchar, REDO|UNDO };
extern int chgline();
X CMDFUNC f_chgline = { chgline, REDO|UNDO };
extern int chgtoeol();
X CMDFUNC f_chgtoeol = { chgtoeol, REDO|UNDO };
extern int clrmes();
X CMDFUNC f_clrmes = { clrmes, NONE };
extern int consearch();
X CMDFUNC f_consearch = { consearch, ABS|MOTION };
extern int opercopy();
X CMDFUNC f_opercopy = { opercopy, OPER|(RANGE|EXTRA) };
extern int ctlxlp();
X CMDFUNC f_ctlxlp = { ctlxlp, NONE };
extern int ctlxrp();
X CMDFUNC f_ctlxrp = { ctlxrp, NONE };
extern int ctlxe();
X CMDFUNC f_ctlxe = { ctlxe, REDO };
extern int cbuf1();
X CMDFUNC f_cbuf1 = { cbuf1, REDO };
extern int cbuf2();
X CMDFUNC f_cbuf2 = { cbuf2, REDO };
extern int cbuf3();
X CMDFUNC f_cbuf3 = { cbuf3, REDO };
extern int cbuf4();
X CMDFUNC f_cbuf4 = { cbuf4, REDO };
extern int cbuf5();
X CMDFUNC f_cbuf5 = { cbuf5, REDO };
extern int cbuf6();
X CMDFUNC f_cbuf6 = { cbuf6, REDO };
extern int cbuf7();
X CMDFUNC f_cbuf7 = { cbuf7, REDO };
extern int cbuf8();
X CMDFUNC f_cbuf8 = { cbuf8, REDO };
extern int cbuf9();
X CMDFUNC f_cbuf9 = { cbuf9, REDO };
extern int cbuf10();
X CMDFUNC f_cbuf10 = { cbuf10, REDO };
#if !SMALLER
extern int cbuf11();
X CMDFUNC f_cbuf11 = { cbuf11, REDO };
#endif
#if !SMALLER
extern int cbuf12();
X CMDFUNC f_cbuf12 = { cbuf12, REDO };
#endif
#if !SMALLER
extern int cbuf13();
X CMDFUNC f_cbuf13 = { cbuf13, REDO };
#endif
#if !SMALLER
extern int cbuf14();
X CMDFUNC f_cbuf14 = { cbuf14, REDO };
#endif
#if !SMALLER
extern int cbuf15();
X CMDFUNC f_cbuf15 = { cbuf15, REDO };
#endif
#if !SMALLER
extern int cbuf16();
X CMDFUNC f_cbuf16 = { cbuf16, REDO };
#endif
#if !SMALLER
extern int cbuf17();
X CMDFUNC f_cbuf17 = { cbuf17, REDO };
#endif
#if !SMALLER
extern int cbuf18();
X CMDFUNC f_cbuf18 = { cbuf18, REDO };
#endif
#if !SMALLER
extern int cbuf19();
X CMDFUNC f_cbuf19 = { cbuf19, REDO };
#endif
#if !SMALLER
extern int cbuf20();
X CMDFUNC f_cbuf20 = { cbuf20, REDO };
#endif
#if !SMALLER
extern int cbuf21();
X CMDFUNC f_cbuf21 = { cbuf21, REDO };
#endif
#if !SMALLER
extern int cbuf22();
X CMDFUNC f_cbuf22 = { cbuf22, REDO };
#endif
#if !SMALLER
extern int cbuf23();
X CMDFUNC f_cbuf23 = { cbuf23, REDO };
#endif
#if !SMALLER
extern int cbuf24();
X CMDFUNC f_cbuf24 = { cbuf24, REDO };
#endif
#if !SMALLER
extern int cbuf25();
X CMDFUNC f_cbuf25 = { cbuf25, REDO };
#endif
#if !SMALLER
extern int cbuf26();
X CMDFUNC f_cbuf26 = { cbuf26, REDO };
#endif
#if !SMALLER
extern int cbuf27();
X CMDFUNC f_cbuf27 = { cbuf27, REDO };
#endif
#if !SMALLER
extern int cbuf28();
X CMDFUNC f_cbuf28 = { cbuf28, REDO };
#endif
#if !SMALLER
extern int cbuf29();
X CMDFUNC f_cbuf29 = { cbuf29, REDO };
#endif
#if !SMALLER
extern int cbuf30();
X CMDFUNC f_cbuf30 = { cbuf30, REDO };
#endif
#if !SMALLER
extern int cbuf31();
X CMDFUNC f_cbuf31 = { cbuf31, REDO };
#endif
#if !SMALLER
extern int cbuf32();
X CMDFUNC f_cbuf32 = { cbuf32, REDO };
#endif
#if !SMALLER
extern int cbuf33();
X CMDFUNC f_cbuf33 = { cbuf33, REDO };
#endif
#if !SMALLER
extern int cbuf34();
X CMDFUNC f_cbuf34 = { cbuf34, REDO };
#endif
#if !SMALLER
extern int cbuf35();
X CMDFUNC f_cbuf35 = { cbuf35, REDO };
#endif
#if !SMALLER
extern int cbuf36();
X CMDFUNC f_cbuf36 = { cbuf36, REDO };
#endif
#if !SMALLER
extern int cbuf37();
X CMDFUNC f_cbuf37 = { cbuf37, REDO };
#endif
#if !SMALLER
extern int cbuf38();
X CMDFUNC f_cbuf38 = { cbuf38, REDO };
#endif
#if !SMALLER
extern int cbuf39();
X CMDFUNC f_cbuf39 = { cbuf39, REDO };
SHAR_EOF
true || echo 'restore of nefunc.h failed'
echo 'End of Vile part 9'
echo 'File nefunc.h is continued in part 10'
echo 10 > _shar_seq_.tmp
exit 0
--
paul fox, pgf at cayman.com, (617)494-1999
Cayman Systems, 26 Landsdowne St., Cambridge, MA 02139
More information about the Alt.sources
mailing list