Clean up deleted files.

This commit is contained in:
mycroft 1994-01-24 05:56:05 +00:00
parent c7f69ec3a1
commit 2b9550b580
19 changed files with 0 additions and 5404 deletions

View File

@ -1,68 +0,0 @@
The following options are missing:
[no]optimize - affects screen redrawing method
[no]redraw - simulate character insertion by redrawing line
[no]slowopen - don't use character insertion
tags="tags" - list of tags, used as TAGPATH
I'd like to improve the versatility of the options whose value is a command:
cc, make, kp, and ep. I'd like to add some notation that allows you to say
where to insert the current filename or current word.
-------------------------------------------------------------------------------
Currently, elvis is configured to look for | only in .exrc files. It doesn't
look for | in any interactively entered command lines, yet.
-------------------------------------------------------------------------------
The 'p', '#', and 'l' flags aren't supported. Also, ex commands don't accept
counts; e.g., ":c5" can't be used to change five lines.
-------------------------------------------------------------------------------
The following have been reported, but have not been verified. If you have
experienced any of the following, and haven't reported it yet, then please
report it now! I need more information about these bugs.
[Bugs that are not in this list should also be reported, of course.]
- Under VMS on an 80-column screen, after scolling sideways to approximately
column 110, a ^L will not redraw the part of the line after the cursor.
- On an Atari ST running under TOS: some ASCII keys seem to send '#' plus
another key. (This is normal for non-ASCII keys like <F1> or <Help>, but
ASCII keys should always send a single ASCII character.)
-------------------------------------------------------------------------------
BIG JOBS:
Desirable extension: merge input mode and visual command mode.
Display long lines by wrapping, like the real vi (if ":set sidescroll=0")
-------------------------------------------------------------------------------
- In the ":w >>filename" command, elvis doesn't allow any whitespace between
the ">>" and "filename".
- Elvis doesn't allow "backslash newline" inside a single EX command.
- VMS intercepts the control-T character, which is normally used to increase
indentation. The <Tab> key works, but it doesn't do quite the same thing.
(":map! ^I ^T" helps.)
- Under VMS, file I/O is very slow. Looking over the vmsio.c file, I get the
impression that it is rather over-done for elvis. Its speed could
probably be inproved.
- The errlist feature doesn't seem to work with the Borland compilers. Perhaps
they write to stderr instead of stdout? This will probably be easy to solve
once I modify the "cc" and "make" options, as described earlier.
- The command ":0" should move the cursor to line 1. Currently, it doesn't
move the cursor at all.
- File preservation is still flakey. On DOS/TOS/VMS systems, it is also more
complex that it should be.
- The act of appending to a cut buffer (as in "Ayy) sets file modification
flag. It shouldn't!
- The .exrc file is limited to BLKSIZE bytes -- 2048 on most systems, but
1024 on Minicx-PC, Coherent, and MS-DOS.
- I *still* haven't quite perfected the screen update code. If you suspect
that the screen doesn't accurately reflect the contents of the edit buffer,
then you should try doing a control-L.
I'll be overhauling the screen update code soon to make it wrap long lines
like the real vi. I expect to fix this bug then.

View File

@ -1,14 +0,0 @@
# $Id: Makefile,v 1.6 1993/11/11 01:30:13 jtc Exp $
PROG= elvis
CFLAGS+=-DBSD -DREGEX
DPADD= ${LIBTERM}
LDADD= -ltermcap
SRCS= blk.c cmd1.c cmd2.c ctype.c curses.c cut.c ex.c input.c main.c misc.c \
modify.c move1.c move2.c move3.c move4.c move5.c opts.c recycle.c \
redraw.c regexp.c regsub.c system.c tio.c tmp.c unix.c vars.c vcmd.c vi.c
LINKS= ${BINDIR}/elvis ${BINDIR}/vi ${BINDIR}/elvis ${BINDIR}/ex \
${BINDIR}/elvis ${BINDIR}/view
MLINKS= elvis.1 vi.1 elvis.1 ex.1 elvis.1 view.1
.include <bsd.prog.mk>

View File

@ -1,31 +0,0 @@
Elvis is a clone of vi/ex, the standard UNIX editor. Elvis supports
nearly all of the vi/ex commands, in both visual mode and colon mode.
Elvis runs under BSD UNIX, AT&T SysV UNIX, SCO Xenix, Minix, MS-DOS
(Turbo-C or MSC 5.1), Atari TOS, OS9/68000, Coherent, VMS, and AmigaDos.
Ports to other operating systems are in progress; contact me before you
start porting it to some other OS, because somebody else may have
already done it for you.
Elvis is freely redistributable, in either source form or executable
form. There are no restrictions on how you may use it.
The file "elvisman.txt" contains the manual for elvis. It is a plain
ASCII file with nothing more exotic than a newline character. It is
formatted for 66-line, 80-column pages. There may also be an archive of
"*.ms" and "*.man" files, which contain the TROFF source text used to
generate that manual.
The file named "Makefile.mix" is used to compile elvis for all systems
except VMS and possibly MS-DOS. You should copy "Makefile.mix" to
"Makefile", and then edit "Makefile" to select the appropriate group of
settings for your system.
Author: Steve Kirkendall
14407 SW Teal Blvd. #C
Beaverton, OR 97005
E-mail: kirkenda@cs.pdx.edu
Phone: (503) 643-6980

View File

@ -1,491 +0,0 @@
/* blk.c */
/* Author:
* Steve Kirkendall
* 14407 SW Teal Blvd. #C
* Beaverton, OR 97005
* kirkenda@cs.pdx.edu
*/
/* This file contains the functions that get/put blocks from the temp file.
* It also contains the "do" and "undo" functions.
*/
#ifndef lint
static char rcsid[] = "$Id: blk.c,v 1.4 1993/11/19 12:53:32 pk Exp $";
#endif /* not lint */
#include "config.h"
#include "vi.h"
#ifndef NBUFS
# define NBUFS 5 /* must be at least 3 -- more is better */
#endif
/*------------------------------------------------------------------------*/
BLK hdr; /* buffer for the header block */
static int b4cnt; /* used to count context of beforedo/afterdo */
static struct _blkbuf
{
BLK buf; /* contents of a text block */
unsigned short logical; /* logical block number */
int dirty; /* must the buffer be rewritten? */
}
blk[NBUFS], /* buffers for text[?] blocks */
*toonew, /* buffer which shouldn't be recycled yet */
*newtoo, /* another buffer which should be recycled */
*recycle = blk; /* next block to be recycled */
void blkflush P_((REG struct _blkbuf *this));
/* This function wipes out all buffers */
void blkinit()
{
int i;
for (i = 0; i < NBUFS; i++)
{
blk[i].logical = 0;
blk[i].dirty = FALSE;
}
for (i = 0; i < MAXBLKS; i++)
{
hdr.n[i] = 0;
}
}
/* This function allocates a buffer and fills it with a given block's text */
BLK *blkget(logical)
int logical; /* logical block number to fetch */
{
REG struct _blkbuf *this; /* used to step through blk[] */
REG int i;
/* if logical is 0, just return the hdr buffer */
if (logical == 0)
{
return &hdr;
}
/* see if we have that block in mem already */
for (this = blk; this < &blk[NBUFS]; this++)
{
if (this->logical == (unsigned)logical)
{
newtoo = toonew;
toonew = this;
return &this->buf;
}
}
/* choose a block to be recycled */
do
{
this = recycle++;
if (recycle == &blk[NBUFS])
{
recycle = blk;
}
} while (this == toonew || this == newtoo);
/* if it contains a block, flush that block */
blkflush(this);
/* fill this buffer with the desired block */
this->logical = logical;
if (hdr.n[logical])
{
/* it has been used before - fill it from tmp file */
lseek(tmpfd, (long)hdr.n[logical] * (long)BLKSIZE, 0);
if (read(tmpfd, this->buf.c, (unsigned)BLKSIZE) != BLKSIZE)
{
msg("Error reading back from tmp file!");
}
}
else
{
/* it is new - zero it */
for (i = 0; i < BLKSIZE; i++)
{
this->buf.c[i] = 0;
}
}
/* This isn't really a change, but it does potentially invalidate
* the kinds of shortcuts that the "changes" variable is supposed
* to protect us from... so count it as a change.
*/
changes++;
/* mark it as being "not dirty" */
this->dirty = 0;
/* return it */
newtoo = toonew;
toonew = this;
return &this->buf;
}
/* This function writes a block out to the temporary file */
void blkflush(this)
REG struct _blkbuf *this; /* the buffer to flush */
{
long seekpos; /* seek position of the new block */
unsigned short physical; /* physical block number */
/* if its empty (an orphan blkadd() maybe?) then make it dirty */
if (this->logical && !*this->buf.c)
{
blkdirty(&this->buf);
}
/* if it's an empty buffer or a clean version is on disk, quit */
if (!this->logical || hdr.n[this->logical] && !this->dirty)
{
return;
}
/* find a free place in the file */
#ifndef NO_RECYCLE
seekpos = allocate();
lseek(tmpfd, seekpos, 0);
#else
seekpos = lseek(tmpfd, 0L, 2);
#endif
physical = seekpos / BLKSIZE;
/* put the block there */
if (write(tmpfd, this->buf.c, (unsigned)BLKSIZE) != BLKSIZE)
{
msg("Trouble writing to tmp file");
deathtrap(0);
}
this->dirty = FALSE;
/* update the header so it knows we put it there */
hdr.n[this->logical] = physical;
}
/* This function sets a block's "dirty" flag or deletes empty blocks */
void blkdirty(bp)
BLK *bp; /* buffer returned by blkget() */
{
REG int i, j;
REG char *scan;
REG int k;
/* find the buffer */
for (i = 0; i < NBUFS && bp != &blk[i].buf; i++)
{
}
#ifdef DEBUG
if (i >= NBUFS)
{
msg("blkdirty() called with unknown buffer at 0x%lx", bp);
return;
}
if (blk[i].logical == 0)
{
msg("blkdirty called with freed buffer");
return;
}
#endif
/* if this block ends with line# INFINITY, then it must have been
* allocated unnecessarily during tmpstart(). Forget it.
*/
if (lnum[blk[i].logical] == INFINITY)
{
#ifdef DEBUG
if (blk[i].buf.c[0])
{
msg("bkldirty called with non-empty extra BLK");
}
#endif
blk[i].logical = 0;
blk[i].dirty = FALSE;
return;
}
/* count lines in this block */
for (j = 0, scan = bp->c; *scan && scan < bp->c + BLKSIZE; scan++)
{
if (*scan == '\n')
{
j++;
}
}
/* adjust lnum, if necessary */
k = blk[i].logical;
j += (lnum[k - 1] - lnum[k]);
if (j != 0)
{
nlines += j;
while (k < MAXBLKS && lnum[k] != INFINITY)
{
lnum[k++] += j;
}
}
/* if it still has text, mark it as dirty */
if (*bp->c)
{
blk[i].dirty = TRUE;
}
else /* empty block, so delete it */
{
/* adjust the cache */
k = blk[i].logical;
for (j = 0; j < NBUFS; j++)
{
if (blk[j].logical >= (unsigned)k)
{
blk[j].logical--;
}
}
/* delete it from hdr.n[] and lnum[] */
blk[i].logical = 0;
blk[i].dirty = FALSE;
while (k < MAXBLKS - 1)
{
hdr.n[k] = hdr.n[k + 1];
lnum[k] = lnum[k + 1];
k++;
}
hdr.n[MAXBLKS - 1] = 0;
lnum[MAXBLKS - 1] = INFINITY;
}
}
/* insert a new block into hdr, and adjust the cache */
BLK *blkadd(logical)
int logical; /* where to insert the new block */
{
static long chg;
REG int i;
/* if we're approaching the limit, then give a warning */
if (hdr.n[MAXBLKS - 10] && chg != changes)
{
chg = changes;
msg("WARNING: The edit buffer will overflow soon.");
}
if (hdr.n[MAXBLKS - 2])
{
msg("BAD NEWS: edit buffer overflow -- GOOD NEWS: text preserved");
deathtrap(0);
}
/* adjust hdr and lnum[] */
for (i = MAXBLKS - 1; i > logical; i--)
{
hdr.n[i] = hdr.n[i - 1];
lnum[i] = lnum[i - 1];
}
hdr.n[logical] = 0;
lnum[logical] = lnum[logical - 1];
/* adjust the cache */
for (i = 0; i < NBUFS; i++)
{
if (blk[i].logical >= (unsigned)logical)
{
blk[i].logical++;
}
}
/* return the new block, via blkget() */
return blkget(logical);
}
/* This function forces all dirty blocks out to disk */
void blksync()
{
int i;
for (i = 0; i < NBUFS; i++)
{
/* blk[i].dirty = TRUE; */
blkflush(&blk[i]);
}
if (*o_sync)
{
sync();
}
}
/*------------------------------------------------------------------------*/
static MARK undocurs; /* where the cursor should go if undone */
static long oldnlines;
static long oldlnum[MAXBLKS];
/* This function should be called before each command that changes the text.
* It defines the state that undo() will reset the file to.
*/
void beforedo(forundo)
int forundo; /* boolean: is this for an undo? */
{
REG int i;
REG long l;
/* if this is a nested call to beforedo, quit! Use larger context */
if (b4cnt++ > 0)
{
return;
}
/* force all block buffers to disk */
blksync();
#ifndef NO_RECYCLE
/* perform garbage collection on blocks from tmp file */
garbage();
#endif
/* force the header out to disk */
lseek(tmpfd, 0L, 0);
if (write(tmpfd, hdr.c, (unsigned)BLKSIZE) != BLKSIZE)
{
msg("Trouble writing header to tmp file");
deathtrap(0);
}
/* copy or swap oldnlines <--> nlines, oldlnum <--> lnum */
if (forundo)
{
for (i = 0; i < MAXBLKS; i++)
{
l = lnum[i];
lnum[i] = oldlnum[i];
oldlnum[i] = l;
}
l = nlines;
nlines = oldnlines;
oldnlines = l;
}
else
{
for (i = 0; i < MAXBLKS; i++)
{
oldlnum[i] = lnum[i];
}
oldnlines = nlines;
}
/* save the cursor position */
undocurs = cursor;
/* upon return, the calling function continues and makes changes... */
}
/* This function marks the end of a (nested?) change to the file */
void afterdo()
{
if (--b4cnt)
{
/* after abortdo(), b4cnt may decribe nested beforedo/afterdo
* pairs incorrectly. If it is decremented to often, then
* keep b4cnt sane but don't do anything else.
*/
if (b4cnt < 0)
b4cnt = 0;
return;
}
/* make sure the cursor wasn't left stranded in deleted text */
if (markline(cursor) > nlines)
{
cursor = MARK_LAST;
}
/* NOTE: it is still possible that markidx(cursor) is after the
* end of a line, so the Vi mode will have to take care of that
* itself */
/* if a significant change has been made to this file, then set the
* MODIFIED flag.
*/
if (significant)
{
setflag(file, MODIFIED);
setflag(file, UNDOABLE);
}
}
/* This function cuts short the current set of changes. It is called after
* a SIGINT.
*/
void abortdo()
{
/* finish the operation immediately. */
if (b4cnt > 0)
{
b4cnt = 1;
afterdo();
}
/* in visual mode, the screen is probably screwed up */
if (mode == MODE_COLON)
{
mode = MODE_VI;
}
if (mode == MODE_VI)
{
redraw(MARK_UNSET, FALSE);
}
}
/* This function discards all changes made since the last call to beforedo() */
int undo()
{
BLK oldhdr;
/* if beforedo() has never been run, fail */
if (!tstflag(file, UNDOABLE))
{
msg("You haven't modified this file yet.");
return FALSE;
}
/* read the old header form the tmp file */
lseek(tmpfd, 0L, 0);
if (read(tmpfd, oldhdr.c, (unsigned)BLKSIZE) != BLKSIZE)
{
msg("Trouble rereading the old header from tmp file");
}
/* "do" the changed version, so we can undo the "undo" */
cursor = undocurs;
beforedo(TRUE);
/* This is a change */
significant = TRUE;
afterdo();
/* wipe out the block buffers - we can't assume they're correct */
blkinit();
/* use the old header -- and therefore the old text blocks */
hdr = oldhdr;
changes++;
return TRUE;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,637 +0,0 @@
/*
* vi configuration file
* We try to automatically configure to various compilers and operating
* systems. Extend the autoconf section as needed.
*
* $Id: config.h,v 1.4 1993/08/10 15:44:23 mycroft Exp $
*/
#include <sys/unistd.h>
#ifndef _CONFIG_H
# define _CONFIG_H
/*************************** autoconf section ************************/
/* Commodore-Amiga */
#ifdef amiga
# define AMIGA 1
# define COMPILED_BY "Manx Aztec C 5.2b"
# define TINYSTACK 1
#endif
/* standard unix V (?) */
#ifdef M_SYSV
# define UNIXV 1
# ifdef M_XENIX
# ifndef M_I386
# define TINYSTACK 1
# endif
# endif
# undef COHERENT
#endif
/* xelos system, University of Ulm */
#ifdef xelos
# define UNIXV 1
#endif
/* BSD UNIX? */
#ifdef bsd
# define BSD 1
#else
# ifdef sun
# ifndef M_SYSV
# define BSD 1
# endif
# endif
#endif
/* Microsoft C: sorry, Watcom does the same thing */
#ifdef M_I86
# ifndef M_SYSV
# define MSDOS 1
# ifdef IBMC2
# define COMPILED_BY "IBM C/2 1.00"
# else
# define MICROSOFT 1
# define COMPILED_BY "Microsoft C 5.10"
# endif
# define TINYSTACK 1
# endif
#endif
/* Borland's Turbo C */
#ifdef __TURBOC__
# define MSDOS 1
# define TURBOC 1
# ifdef __BORLANDC__
# define COMPILED_BY "Borland C 2.00"
# else
# define COMPILED_BY (__TURBOC__ >= 661 ? "Turbo C++ 1.00" : "Turbo C 2.00")
# endif
# define TINYSTACK 1
#endif
/* Tos Mark-Williams */
#ifdef M68000
# define TOS 1
# define COMPILED_BY "Mark Williams C"
# define TINYSTACK 1
#endif
/* Tos GNU-C */
#ifdef __atarist__
# ifdef __gem__
# define TOS 1
# define COMPILED_BY "GNU-C " __VERSION__
# define TINYSTACK 1
# endif
#endif
/* OS9/68000 */
#ifdef OSK
# define COMPILED_BY "Microware C V2.3 Edition 40"
# define TINYSTACK 1
#endif
/* DEC Rainbow, running MS-DOS (handled by earlier MS-DOS tests) */
/* (would need -DRAINBOW in CFLAGS to compile a Rainbow-compatible .EXE) */
#ifdef VMS
# define COMPILED_BY "VAX/VMS VAXC compiler"
# undef VMS
# define VMS 1
#endif
#ifdef COHERENT
# ifdef _I386
# define COH_386 1
# define COH_286 0
# else
# define COH_386 0
# define COH_286 1
# endif
# undef COHERENT
# define COHERENT 1
#endif
/*************************** end of autoconf section ************************/
/* All undefined symbols are defined to zero here, to allow for older */
/* compilers which dont understand #if defined() or #if UNDEFINED_SYMBOL */
/*************************** operating systems *****************************/
#ifndef BSD
# define BSD 0 /* UNIX - Berkeley 4.x */
#endif
#ifndef UNIXV
# define UNIXV 0 /* UNIX - AT&T SYSV */
#endif
#ifndef UNIX7
# define UNIX7 0 /* UNIX - version 7 */
#endif
#ifndef MSDOS
# define MSDOS 0 /* PC */
#endif
#ifndef TOS
# define TOS 0 /* Atari ST */
#endif
#ifndef AMIGA
# define AMIGA 0 /* Commodore Amiga */
#endif
#ifndef OSK
# define OSK 0 /* OS-9 / 68k */
#endif
#ifndef COHERENT
# define COHERENT 0 /* Coherent */
#endif
#ifndef RAINBOW /* DEC Rainbow support, under MS-DOS */
# define RAINBOW 0
#endif
#ifndef VMS
# define VMS 0 /* VAX/VMS */
#endif
/* Minix has no predefines */
#if !BSD && !UNIXV && !UNIX7 && !MSDOS && !TOS && !AMIGA && !OSK && !COHERENT && !VMS
# define MINIX 1
#else
# define MINIX 0
#endif
/* generic combination of Unices */
#if UNIXV || UNIX7 || BSD || MINIX || COHERENT
# define ANY_UNIX 1
#else
# define ANY_UNIX 0
#endif
#ifndef TINYSTACK
# define TINYSTACK 0
#endif
/*************************** compilers **************************************/
#ifndef AZTEC_C
# define AZTEC_C 0
#endif
#ifndef MICROSOFT
# define MICROSOFT 0
#endif
#ifndef TURBOC
# define TURBOC 0
#endif
/* Should we use "new style" ANSI C prototypes? */
#ifdef __STDC__
# define NEWSTYLE 1
#endif
#ifdef __cplusplus
# define NEWSTYLE 1
#endif
#ifndef NEWSTYLE
# define NEWSTYLE 0
#endif
#if NEWSTYLE
# define P_(s) s
#else
# define P_(s) ()
#endif
/******************************* Credit ************************************/
#if MSDOS
# define CREDIT "Ported to MS-DOS by Guntram Blohm & Martin Patzel"
# if RAINBOW
# define CREDIT2 "Rainbow support added by Willett Kempton"
# endif
#endif
#if AMIGA
# define CREDIT "Ported to AmigaDOS 2.04 by Mike Rieser & Dale Rahn"
#endif
#if TOS
# define CREDIT "Ported to Atari/TOS by Guntram Blohm & Martin Patzel"
#endif
#if OSK
# define CREDIT "Ported to Microware OS9/68k by Peter Reinig"
#endif
#if COHERENT
# define CREDIT "Ported to Coherent by Esa Ahola"
#endif
#if VMS
# define CREDIT "Ported to VAX/VMS by John Campbell"
#endif
/*************************** functions depending on OS *********************/
/* There are two terminal-related functions that we need: ttyread() and
* ttywrite(). The ttyread() function implements read-with-timeout and is
* a true function on all systems. The ttywrite() function is almost always
* just a macro...
*/
#if !TOS && !AMIGA
# define ttywrite(buf, len) write(1, buf, (unsigned)(len)) /* raw write */
#endif
/* The strchr() function is an official standard now, so everybody has it
* except Unix version 7 (which is old) and BSD Unix (which is academic).
* Those guys use something called index() to do the same thing.
*/
#if BSD || UNIX7 || OSK
# define strchr index
# define strrchr rindex
#endif
#if !NEWSTYLE
extern char *strchr();
#endif
/* BSD uses bcopy() instead of memcpy() */
#if BSD
# define memcpy(dest, src, siz) bcopy(src, dest, siz)
#endif
/* BSD uses getwd() instead of getcwd(). The arguments are a little different,
* but we'll ignore that and hope for the best; adding arguments to the macro
* would mess up an "extern" declaration of the function.
*
* Also, the Coherent-286 uses getwd(), but Coherent-386 uses getcwd()
*/
#if BSD
#ifndef _POSIX_VERSION
# define getcwd getwd
#endif
#endif
#if COH_286
# define getcwd getwd
#endif
extern char *getcwd();
/* text versa binary mode for read/write */
#if !TOS
#define tread(fd,buf,n) read(fd,buf,(unsigned)(n))
#define twrite(fd,buf,n) write(fd,buf,(unsigned)(n))
#endif
/**************************** Compiler quirks *********************************/
/* the UNIX version 7 and (some) TOS compilers, don't allow "void" */
#if UNIX7 || TOS
# define void int
#endif
/* as far as I know, all compilers except version 7 support unsigned char */
/* NEWFLASH: the Minix-ST compiler has subtle problems with unsigned char */
#if UNIX7 || MINIX
# define UCHAR(c) ((c) & 0xff)
# define uchar char
#else
# define UCHAR(c) ((unsigned char)(c))
# define uchar unsigned char
#endif
/* Some compilers prefer to have malloc declared as returning a (void *) */
/* ANSI, on the other hand, needs the arguments to free() to be cast */
#ifndef __STDC__
# if BSD || AMIGA || MINIX
extern void *malloc();
# define _free_(ptr) free((void *)ptr)
# else
extern char *malloc();
# define _free_(ptr) free((char *)ptr)
# endif
#else
# define _free_(ptr) free((void *)ptr)
#endif /* __STDC__ */
/* everybody but Amiga wants lseek declared here */
#if !AMIGA
extern long lseek();
#endif
/* ANSI C has getenv() declared in stdlib.h, which we've already included.
* Other compilers will need it declared here, though.
*/
#ifndef __STDC__
extern char *getenv();
#endif
/* Signal handler functions used to return an int value, which was ignored.
* On newer systems, signal handlers are void functions. Here, we try to
* guess the proper return type for this system.
*/
#ifdef __STDC__
# define SIGTYPE void
#else
# if MSDOS
# define SIGTYPE void
# else
# if UNIXV
# define SIGTYPE void /* Note: This is wrong for SCO Xenix. */
# endif
# endif
#endif
#ifndef SIGTYPE
# define SIGTYPE int
#endif
/******************* Names of files and environment vars **********************/
#if ANY_UNIX
# ifndef TMPDIR
# if MINIX
# define TMPDIR "/usr/tmp" /* Keep elvis' temp files off RAM disk! */
# else
# define TMPDIR "/var/tmp" /* directory where temp files live */
# endif
# endif
# ifndef PRSVDIR
# define PRSVDIR "/var/preserve" /* directory where preserved file live */
# endif
# ifndef PRSVINDEX
# define PRSVINDEX "/var/preserve/Index" /* index of files in PRSVDIR */
# endif
# ifndef EXRC
# define EXRC ".exrc" /* init file in current directory */
# endif
# define SCRATCHOUT "%s/soXXXXXX" /* temp file used as input to filter */
# ifndef SHELL
# define SHELL "/bin/sh" /* default shell */
# endif
# if COHERENT
# ifndef REDIRECT
# define REDIRECT ">" /* Coherent CC writes errors to stdout */
# endif
# endif
# define gethome(x) getenv("HOME")
#endif
#if AMIGA /* Specify AMIGA environment */
# ifndef CC_COMMAND
# define CC_COMMAND "cc" /* generic C compiler */
# endif
# ifndef COLON
# define COLON ':' /* Amiga files can also end in `:' */
# endif
# ifndef SYSEXRC
# define SYSEXRC "S:" EXRC /* name of ".exrc" file in system dir */
# endif
# ifndef MAXRCLEN
# define MAXRCLEN 2048 /* max size of a .exrc file */
# endif
# ifndef NBUFS
# define NBUFS 10 /* must be at least 3 -- more is better */
# endif
# ifndef NEEDSYNC
# define NEEDSYNC TRUE /* assume ":se sync" by default */
# endif
# ifndef PRSVDIR
# define PRSVDIR "Elvis:" /* directory where preserved file live */
# endif
# ifndef PRSVINDEX
# define PRSVINDEX "Elvis:Index" /* index of files in PRSVDIR */
# endif
# ifndef REDIRECT
# define REDIRECT ">" /* Amiga writes errors to stdout */
# endif
# ifndef SCRATCHIN
# define SCRATCHIN "%sSIXXXXXX"
# endif
# ifndef SCRATCHOUT
# define SCRATCHOUT "%sSOXXXXXX"
# endif
# ifndef SHELL
# define SHELL "newshell" /* default shell */
# endif
# ifndef TERMTYPE
# define TERMTYPE "amiga" /* default termtype */
# endif
# ifndef TMPDIR /* for AMIGA should end in `:' or `/' */
# define TMPDIR "T:" /* directory where temp files live */
# endif
# ifndef TMPNAME
# define TMPNAME "%selv_%x.%x" /* format of names for temp files */
# endif
# define gethome(x) getenv("HOME")
#endif
#if MSDOS || TOS
/* do not change TMPNAME and SCRATCH*: they MUST begin with '%s\\'! */
# ifndef TMPDIR
# define TMPDIR "C:\\tmp" /* directory where temp files live */
# endif
# ifndef PRSVDIR
# define PRSVDIR "C:\\preserve" /* directory where preserved file live */
# endif
# ifndef PRSVINDEX
# define PRSVINDEX "C:\\preserve\\Index" /* index of files in PRSVDIR */
# endif
# define TMPNAME "%s\\elv_%x.%x" /* temp file */
# if MSDOS
# if MICROSOFT
# define CC_COMMAND "cl -c" /* C compiler */
# else
# if __BORLANDC__ /* Borland C */
# define CC_COMMAND "bcc" /* C compiler */
# else
# if TURBOC /* Turbo C */
# define CC_COMMAND "tcc" /* C compiler */
# endif /* TURBOC */
# endif /* BORLANDC */
# endif /* MICROSOFT */
# endif /* MSDOS */
# define SCRATCHIN "%s\\siXXXXXX" /* DOS ONLY - output of filter program */
# define SCRATCHOUT "%s\\soXXXXXX" /* temp file used as input to filter */
# define SLASH '\\'
# ifndef SHELL
# if TOS
# define SHELL "shell.ttp" /* default shell */
# else
# define SHELL "command.com" /* default shell */
# endif
# endif
# define NEEDSYNC TRUE /* assume ":se sync" by default */
# if TOS && __GNUC__ /* probably on other systems, too */
# define REDIRECT "2>" /* GNUC reports on 2, others on 1 */
# define CC_COMMAND "gcc -c"
# else
# define REDIRECT ">" /* shell's redirection of stderr */
# endif
#endif
#if VMS
/* do not change TMPNAME, and SCRATCH*: they MUST begin with '%s\\'! */
# ifndef TMPDIR
# define TMPDIR "sys$scratch:" /* directory where temp files live */
# endif
# define TMPNAME "%selv_%x.%x;1" /* temp file */
# define SCRATCHIN "%ssiXXXXXX" /* DOS ONLY - output of filter program */
# define SCRATCHOUT "%ssoXXXXXX" /* temp file used as input to filter */
# define SLASH '\:' /* Worry point... jdc */
# ifndef SHELL
# define SHELL "" /* default shell */
# endif
# define REDIRECT ">" /* shell's redirection of stderr */
# define tread(fd,buf,n) vms_read(fd,buf,(unsigned)(n))
# define close vms_close
# define lseek vms_lseek
# define unlink vms_delete
# define delete __delete /* local routine conflicts w/VMS rtl routine. */
# define rpipe vms_rpipe
# define rpclose vms_rpclose
# define ttyread vms_ttyread
# define gethome(x) getenv("HOME")
/* There is no sync() on vms */
# define sync()
/* jdc -- seems VMS external symbols are case insensitive */
# define m_fWord m_fw_ord
# define m_bWord m_bw_ord
# define m_eWord m_ew_ord
# define m_Nsrch m_n_srch
# define m_Fch m_f_ch
# define m_Tch m_t_ch
# define v_Xchar v_x_char
/* jdc -- also, braindead vms curses always found by linker. */
# define LINES elvis_LINES
# define COLS elvis_COLS
# define curscr elvis_curscr
# define stdscr elvis_stdscr
# define initscr elvis_initscr
# define endwin elvis_endwin
# define wrefresh elvis_wrefresh
#endif
#if OSK
# ifndef TMPDIR
# define TMPDIR "/dd/tmp" /* directory where temp files live */
# endif
# ifndef PRSVDIR
# define PRSVDIR "/dd/usr/preserve" /* directory where preserved file live */
# endif
# ifndef PRSVINDEX
# define PRSVINDEX "/dd/usr/preserve/Index" /* index of files in PRSVDIR */
# endif
# ifndef CC_COMMAND
# define CC_COMMAND "cc -r" /* name of the compiler */
# endif
# ifndef EXRC
# define EXRC ".exrc" /* init file in current directory */
# endif
# define SCRATCHOUT "%s/soXXXXXX" /* temp file used as input to filter */
# ifndef SHELL
# define SHELL "shell" /* default shell */
# endif
# define FILEPERMS (S_IREAD|S_IWRITE) /* file permissions used for creat() */
# define REDIRECT ">>-" /* shell's redirection of stderr */
# define sync() /* OS9 doesn't need a sync() */
# define gethome(x) getenv("HOME")
#endif
#ifndef TAGS
# define TAGS "tags" /* name of the tags file */
#endif
#ifndef TMPNAME
# define TMPNAME "%s/elv_%x.%x" /* format of names for temp files */
#endif
#ifndef EXINIT
# define EXINIT "EXINIT" /* name of EXINIT environment variable */
#endif
#ifndef EXRC
# define EXRC "elvis.rc" /* name of ".exrc" file in current dir */
#endif
#ifndef HMEXRC
# define HMEXRC EXRC /* name of ".exrc" file in home dir */
#endif
#ifndef KEYWORDPRG
# define KEYWORDPRG "ref"
#endif
#ifndef SCRATCHOUT
# define SCRATCHIN "%s/SIXXXXXX"
# define SCRATCHOUT "%s/SOXXXXXX"
#endif
#ifndef ERRLIST
# define ERRLIST "errs"
#endif
#ifndef SLASH
# define SLASH '/'
#endif
#ifndef SHELL
# define SHELL "shell"
#endif
#ifndef REG
# define REG register
#endif
#ifndef NEEDSYNC
# define NEEDSYNC FALSE
#endif
#ifndef FILEPERMS
# define FILEPERMS 0666
#endif
#ifndef PRESERVE
# define PRESERVE "/usr/libexec/elvispreserve" /* name of the "preserve" program */
#endif
#ifndef CC_COMMAND
# define CC_COMMAND "cc -c"
#endif
#ifndef MAKE_COMMAND
# define MAKE_COMMAND "make"
#endif
#ifndef REDIRECT
# define REDIRECT "2>"
#endif
#ifndef BLKSIZE
# ifdef CRUNCH
# define BLKSIZE 1024
# else
# define BLKSIZE 2048
# endif
#endif
#ifndef KEYBUFSIZE
# define KEYBUFSIZE 1000
#endif
#ifndef MAILER
# define MAILER "mail"
#endif
#ifndef gethome
extern char *gethome();
#endif
#endif /* ndef _CONFIG_H */

View File

@ -1,81 +0,0 @@
/* ctype.c */
/* This file contains the tables and initialization function for elvis'
* version of <ctype.h>. It should be portable.
*/
#ifndef lint
static char rcsid[] = "$Id: ctype.c,v 1.3 1993/08/02 17:53:46 mycroft Exp $";
#endif /* not lint */
#include "config.h"
#include "ctype.h"
void _ct_init P_((uchar *));
uchar _ct_toupper[256];
uchar _ct_tolower[256];
uchar _ct_ctypes[256];
/* This function initializes the tables used by the ctype macros. It should
* be called at the start of the program. It can be called again anytime you
* wish to change the non-standard "flipcase" list. The "flipcase" list is
* a string of characters which are taken to be lowercase/uppercase pairs.
* If you don't want to use any special flipcase characters, then pass an
* empty string.
*/
void _ct_init(flipcase)
uchar *flipcase; /* list of non-standard lower/upper letter pairs */
{
int i;
uchar *scan;
/* reset all of the tables */
for (i = 0; i < 256; i++)
{
_ct_toupper[i] = _ct_tolower[i] = i;
_ct_ctypes[i] = 0;
}
/* add the digits */
for (scan = (uchar *)"0123456789"; *scan; scan++)
{
_ct_ctypes[*scan] |= _CT_DIGIT | _CT_ALNUM;
}
/* add the whitespace */
for (scan = (uchar *)" \t\n\r\f"; *scan; scan++)
{
_ct_ctypes[*scan] |= _CT_SPACE;
}
/* add the standard ASCII letters */
for (scan = (uchar *)"aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"; *scan; scan += 2)
{
_ct_ctypes[scan[0]] |= _CT_LOWER | _CT_ALNUM;
_ct_ctypes[scan[1]] |= _CT_UPPER | _CT_ALNUM;
_ct_toupper[scan[0]] = scan[1];
_ct_tolower[scan[1]] = scan[0];
}
/* add the flipcase letters */
for (scan = flipcase; scan[0] && scan[1]; scan += 2)
{
_ct_ctypes[scan[0]] |= _CT_LOWER | _CT_ALNUM;
_ct_ctypes[scan[1]] |= _CT_UPPER | _CT_ALNUM;
_ct_toupper[scan[0]] = scan[1];
_ct_tolower[scan[1]] = scan[0];
}
/* include '_' in the isalnum() list */
_ct_ctypes[UCHAR('_')] |= _CT_ALNUM;
/* !!! find the control characters in an ASCII-dependent way */
for (i = 0; i < ' '; i++)
{
_ct_ctypes[i] |= _CT_CNTRL;
}
_ct_ctypes[127] |= _CT_CNTRL;
_ct_ctypes[255] |= _CT_CNTRL;
}

View File

@ -1,88 +0,0 @@
# This is the Makefile for Elvis' "doc" directory. It makes use of a
# troff-like formatter called mroff. Since you probably don't have mroff,
# you'll need to edit this Makefile before you can fully use it. It can
# also use nroff, though, so you should be able to get something out of it.
#
# make Use nroff to create an ASCII version of the manual.
# make foo.doc Use nroff to create an ASCII version of foo.man or foo.ms
# make manual Use MROFF to print a typeset manual on a laser printer
# make foo.1200 Use MROFF to print a typeset version of foo.man or foo.ms
# make foo.100 Use MROFF to print a draft-quality version of foo.man or foo.ms
# make foo.more Use MROFF to preview foo.man or foo.more on your terminal
#
###############################################################################
# Definitions...
MAN= ctags.man elvis.man elvprsv.man elvrec.man fmt.man ref.man
MS= title.ms index.ms intro.ms visual.ms ex.ms regexp.ms options.ms\
cutbufs.ms differ.ms internal.ms cflags.ms termcap.ms environ.ms\
versions.ms question.ms
DOC= title.doc index.doc intro.doc visual.doc ex.doc regexp.doc options.doc\
cutbufs.doc differ.doc internal.doc cflags.doc termcap.doc environ.doc\
versions.doc question.doc\
ctags.doc elvis.doc elvprsv.doc elvrec.doc fmt.doc ref.doc
MANUAL= title.1200 index.1200 intro.1200 visual.1200 ex.1200 regexp.1200 options.1200\
cutbufs.1200 differ.1200 internal.1200 cflags.1200 termcap.1200 environ.1200\
versions.1200\
ctags.1200 elvis.1200 elvprsv.1200 elvrec.1200 fmt.1200 ref.1200
VER= ver.ms
TROFF= mroff
NROFF= nroff
###############################################################################
# Rules...
.SUFFIXES: .tmp .100 .1200 .more .doc .man .ms .vga .vgas
.ms.tmp:
$(TROFF) -ms $(VER) $< >tmp
.man.tmp:
$(TROFF) -man $< >tmp
.ms.more:
$(TROFF) -ms $(VER) $< | draft | more
.man.more:
$(TROFF) -man $< | draft | more
.ms.1200:
$(TROFF) -ms $(VER) $< | hp2 1200 | lp -og $(PRINTER)
.man.1200:
$(TROFF) -man $< | hp2 1200 | lp -og $(PRINTER)
.ms.100:
$(TROFF) -ms $(VER) $< | hp2 100 | lp -og $(PRINTER)
.man.100:
$(TROFF) -man $< | hp2 100 | lp -og $(PRINTER)
.ms.doc:
$(NROFF) -ms $(VER) $< >$@
.man.doc:
$(NROFF) -man $< >$@
.ms.vga:
$(TROFF) -ms $(VER) $< >/tmp/foo
-vga /tmp/foo
rm /tmp/foo
.ms.vgas:
$(TROFF) -ms $(VER) $< >/tmp/foo
-vgas /tmp/foo
rm /tmp/foo
#############################################################################
# Targets...
Elvisman.txt: $(DOC)
cat $(DOC) | col -b >Elvisman.txt
#cat $(DOC) | col -b -x | sed 's/^/ /' >Elvisman.txt
manual: $(MANUAL)
clean:
rm -f *.doc

View File

@ -1,48 +0,0 @@
# $Id: Makefile,v 1.2 1993/08/02 17:53:27 mycroft Exp $
NROFF= nroff
HPROFF= troff
HPDEST= >/dev/hp
PSROFF= troff -p
PSDEST= >/dev/lp
MS= title.ms index.ms intro.ms visual.ms ex.ms regexp.ms options.ms \
cutbufs.ms differ.ms internal.ms makefile.ms cflags.ms termcap.ms \
environ.ms versions.ms question.ms
MAN= ctags.man elvis.man elvprsv.man elvrec.man fmt.man ref.man
DOC= title.doc index.doc intro.doc visual.doc ex.doc regexp.doc options.doc \
cutbufs.doc differ.doc internal.doc makefile.doc cflags.doc termcap.doc \
environ.doc versions.doc question.doc ctags.doc elvis.doc elvprsv.doc \
elvrec.doc fmt.doc ref.doc
PS= title.ps index.ps intro.ps visual.ps ex.ps regexp.ps options.ps \
cutbufs.ps differ.ps internal.ps makefile.ps cflags.ps termcap.ps \
environ.ps versions.ps question.ps ctags.ps elvis.ps elvprsv.ps \
elvrec.ps fmt.ps ref.ps
HP= title.ps index.ps intro.hp visual.hp ex.hp regexp.hp options.hp \
cutbufs.hp differ.hp internal.hp makefile.hp cflags.hp termcap.hp \
environ.hp versions.hp question.hp ctags.hp elvis.hp elvprsv.hp \
elvrec.hp fmt.hp ref.hp
.SUFFIXES: .test .doc .ps .hp .ms .man
.ms.doc:
$(NROFF) -ms ver.ms $*.ms | col -bx >$*.doc
.man.doc:
$(NROFF) -man $*.man | col -bx >$*.doc
.ms.ps:
$(PSROFF) -ms ver.ms $*.ms $(PSDEST)
.man.ps:
$(PSROFF) -man $*.man $(PSDEST)
.ms.hp:
$(HPROFF) -ms ver.ms $*.ms $(HPDEST)
.man.hp:
$(HPROFF) -man $*.man $(HPDEST)
.ms.test:
$(PSROFF) -ms ver.ms $*.ms >/dev/null
.man.test:
$(PSROFF) -man $*.man >/dev/null
../Elvisman.txt: $(DOC)
cat $(DOC) >../Elvisman.txt
Elvisman.ps: $(PS)
Elvisman.hp: $(HP)
clean:
rm -f $(DOC) Elvisman.txt

View File

@ -1,286 +0,0 @@
.Go 10 "CFLAGS"
.PP
\*E uses many preprocessor symbols to control compilation.
Some of these control the sizes of buffers and such.
The "-DNO_XXXX" options remove small sets of related features.
.PP
Most \*E users will probably want to keep all features available.
Minix-PC users, though, will have to sacrifice some sets because otherwise
\*E would be too bulky to compile.
The "asld" phase of the compiler craps out.
.IP "-DM_SYSV, -Dbsd, -DTOS, -DCOHERENT, -Damiga"
These flags tell the compiler that \*E is being compiled for
System-V UNIX, BSD UNIX, Atari TOS, Coherent, or AmigaDos, respectively.
For other systems, the config.h file can generally figure it out automatically.
.IP -DRAINBOW
For MS-DOS systems, this causes support for the DEC Rainbow to be compiled
into \*E.
.IP -DNO_S5WINSIZE
Some versions of SysV UNIX don't support support the "winsize"
style of screen-size testing.
If you have a SysV system and can't compile "curses.c",
then try adding -DNO_S5WINSIZE to the CFLAGS.
.IP -DTERMIOS
POSIX is a SysV-derived specification which uses a terminal control
package called "termios", instead of "termio".
Some other SysV systems may also use termios.
You can make elvis uses termios instead of the more common termio
by adding -DTERMIOS to CFLAGS.
(Note: This hasn't been tested very well.)
.IP -DNBUFS=\fInumber\fP
\*E keeps most of your text in a temporary file;
only a small amount is actually stored in RAM.
This flag allows you to control how much of the file can be in RAM at any time.
The default is 5 blocks, and the minimum is 3 blocks.
(See the -DBLKSIZE flag, below.)
.IP
More RAM allows global changes to happen a little faster.
If you're just making many small changes in one section of a file, though,
extra RAM won't help much.
.IP -DBLKSIZE=\fInumber\fP
This controls the size of blocks that \*E uses internally.
The value of BLKSIZE must be a power of two.
Every time you double BLKSIZE, you quadruple the size of a text file that
\*E can handle, but you also cause the temporary file to grow faster.
For MS-DOS, Coherent, and Minix-PC, the default value is 1024, which allows
you to edit files up to almost 512K bytes long.
For all other systems, the default value is 2048, which allows you to edit
files that are nearly 2 megabytes long.
.IP
The BLKSIZE also determines the maximum line length, and a few other limits.
BLKSIZE should be either 256, 512, 1024, or 2048.
Values other than these can lead to strange behaviour.
.IP -DTMPDIR=\fIstring\fP
This sets the default value of the "directory" option, which specifies where
the temporary files should reside.
The value of TMPDIR must be a string, so be sure your value includes the
quote characters on each end.
.IP "-DEXRC=\fIstr\fP, -DHMEXRC=\fIstr\fP, -DSYSEXRC=\fIstr\fP, -DEXINIT=\fIstr\fP"
This lets you control the names of the initialization files.
Their values must be strings, so be careful about quoting.
.IP
EXRC is the name of the initialization file in the current directory.
Its default value is ".exrc" on UNIX systems -- the same as the real vi.
Since that isn't a legal DOS filename, under DOS the default is "elvis.rc".
For other systems, check the config.h file.
.IP
HMEXRC is the name of the initialization file in your home directory.
By default, it is the same as EXRC.
\*E will automatically prepend the name of your home directory to HMEXRC
at run time, so don't give a full path name.
.IP
SYSEXRC is the name of a system-wide initialization file.
It has no default value;
if you don't define a value for it, then
the code that supports SYSEXRC just isn't compiled.
The value of SYSEXRC should be a full pathname, in quotes.
.IP
EXINIT is the name of an environment variable that can contain initialization
commands.
Normally, its value is "EXINIT".
.IP -DKEYWORDPRG=\fIstring\fP
This flag determines the default value of the "keywordprg" option.
Its value must be a string, so be careful about quoting.
The default value of this flag is "ref", which is a C reference program.
.IP "-DCC_COMMAND=\fIstring\fP -DMAKE_COMMAND=\fIstring\fP -DERRLIST=\fIstring\fP"
These control the names of the C compiler, the "make" utility, and the
error output file, respectively.
They are only used if -DNO_ERRLIST is not given.
.IP
The default value of CC_COMMAND depends on the Operating System and compiler
that you use to compile elvis;
for UNIX, the default is "cc".
The default values of MAKE_COMMAND and ERRLIST are "make" and "errlist",
respectively.
.IP -DMAXRCLEN=\fInumber\fP
This determines how large a :@ macro command can be (measured in bytes).
The default is 1000 bytes.
If you increase this value significantly,
then you may need to allocate extra memory for the stack.
See the "CHMEM" setting in the Makefile.
.IP -DSHELL=\fIstring\fP
This is the default value of the "shell" option, and hence
the default shell used from within \*E.
This only controls the default;
the value you give here may be overridden at run-time by setting
an environment variable named SHELL (or COMSPEC for MS-DOS).
Its value must be a string constant, so be careful about quoting.
.IP -DMAILER=\fIstring\fP
This is the name of the program that \*E uses to send mail to a user whose
text has just been preserved.
(See the manual page for the \fIelvprsv\fR program.)
If your system doesn't use electronic mail, then this option is irrelevent.
For UNIX and OS-9 systems, though, the value should be a quoted string.
The default value is "mail", but
SysV users may prefer to use "mailx", and BSD users may prefer "Mail".
.IP -DTAGS=\fIstring\fP
This sets the name of the "tags" file,
which is used by the :tag command.
Its value must be a string constant, so be careful about quoting.
.IP "-DCS_IBMPC -DCS_LATIN1 -DCS_SPECIAL"
The digraph table and flipcase option will normally start out empty.
However, if you add -DCS_IBMPC or -DCS_LATIN1 to your CFLAGS,
then they will start out filled with values that are appropriate for the
IBM PC character set or the ISO Latin-1 character set, respectively.
.IP
You can also use -DCS_IBMPC and -DCS_SPECIAL together to get digraphs
that produce the PC's graphic characters.
.IP "-DDEBUG -DEBUG2"
-DDEBUG adds the ":debug" and ":validate" commands,
and also adds many internal consistency checks.
It increases the size of the ".text" segment by about 6K.
.IP
-DDEBUG2 causes a line to be appended to a file called "debug.out"
everytime any change is made to the edit buffer.
.IP -DCRUNCH
This flag removes some non-critical code, so that \*E is smaller.
For example, it removes a short-cut from the regexp package, so that
text searches are slower.
Also, screen updates are not as efficient.
A couple of obscure features are disabled by this, too.
.IP -DNO_MKEXRC
This removes the ":mkexrc" command,
so you have to create any .exrc files manually.
The size of the .text segment will be reduced by about 1500 bytes.
.IP -DNO_CHARATTR
Permanently disables the charattr option.
This reduces the size of your ".text" segment by about 850 bytes.
.IP -DNO_RECYCLE
Normally, \*E will recycle space (from the temporary file) which contains
totally obsolete text.
This flag disables this recycling.
Without recycling, the ".text" segment is about 1K smaller
than it would otherwise be,
but the tmp file grows much faster.
If you have a lot of free space on your hard disk,
but \*E is too bulky to run with recycling,
then try it without recycling.
.IP
When using a version of \*E that has been compiled with -DNO_RECYCLE,
you should be careful to avoid making many small changes to a file
because each individual change will cause the tmp file to grow by at least 1k.
Hitting "x" thirty times counts as thirty changes,
but typing "30x" counts as one change.
Also, you should occasionally do a ":w" followed by a ":e" to start with a
fresh tmp file.
.IP
Interestingly, the real vi never recycles space from its temporary file.
.IP -DNO_SENTENCE
Leaves out the "(" and ")" visual mode commands.
Also, the "[[", "]]", "{", and "}" commands will not recognize *roff macros.
The sections and paragraphs options go away.
This saves about 650 bytes in the ".text" segment.
.IP -DNO_CHARSEARCH
Leaves out the visual commands which locate a given character
in the current line:
"f", "t", "F", "T", "," and ";".
This saves about 900 bytes.
.IP -DNO_EXTENSIONS
Leaves out the "K" and "#" visual commands.
Also, the arrow keys will no longer work in input mode.
Regular expressions will no longer recognize the \\{\\} operator.
(Other extensions are either inherent in the design of \*E,
or are controlled by more specific flags,
or are too tiny to be worth removing.)
This saves about 250 bytes.
.IP -DNO_MAGIC
Permanently disables the "magic" option, so that most meta-characters
in a regular expression are *NOT* recognized.
This saves about 3k of space in the ".text" segment, because
the complex regular expression code can be replaced by much simpler code.
.IP -DNO_SHOWMODE
Permanently disables the "showmode" option, saving about 250 bytes.
.IP -DNO_CURSORSHAPE
Normally, \*E tries to adjust the shape of the cursor as a reminder
of which mode you're in.
The -DNO_CURSORSHAPE flag disables this, saving about 150 bytes.
.IP -DNO_DIGRAPH
To allow entry of non-ASCII characters, \*E supports digraphs.
A digraph is a single (non-ASCII) character which is entered as a
combination of two other (ASCII) characters.
If you don't need to input non-ASCII characters,
or if your keyboard supports a better way of entering non-ASCII characters,
then you can disable the digraph code and save about 450 bytes.
.IP -DNO_ERRLIST
\*E adds a ":errlist" command, which is useful to programmers.
If you don't need this feature, you can disable it via the -DNO_ERRLIST flag.
This will reduce the .text segment by about 900 bytes, and the .bss segment
by about 300 bytes.
.IP -DNO_ABBR
The -DNO_ABBR flag disables the ":abbr" command,
and reduces the size of \*E by about 250 bytes.
.IP -DNO_OPTCOLS
When \*E displays the current options settings via the ":set" command,
the options are normally sorted into columns.
The -DNO_OPTCOLS flag causes the options to be sorted across the rows,
which is much simpler for the computer.
The -DNO_OPTCOLS flag will reduce the size of your .text segment by about
500 bytes.
.IP -DNO_MODELINES
This removes all support for modelines.
.IP -DNO_TAG
This disables tag lookup.
It reduces the size of the .text segment by about 750 bytes.
.IP -DNO_TAGSTACK
This disables the tagstack.
The ^T and :pop commands will no longer be available.
.IP "-DNO_ALT_FKEY, -DNO_CTRL_FKEY, -DNO_SHIFT_FKEY, -DNO_FKEY"
These remove explicit support of function keys.
-DNO_ALT_FKEY removes support for the <alternate> versions function keys.
-DNO_CTRL_FKEY removes support for the <control> and <alternate> versions function keys.
-DNO_SHIFT_FKEY removes support for the <shift>, <control>, and <alternate> versions function keys.
-DNO_FKEY removes all support of function keys.
.IP
\*E's ":map" command normally allows you to use the special sequence "#<n>"
to map function key <n>.
For example, ":map #1 {!}fmt^M" will cause the <F1> key to reformat a paragraph.
\*E checks the :k1=: field in the termcap description of your terminal
to figure out what code is sent by the <F1> key.
This is handy because it allows you to create a .exrc file which maps function
keys the same way regardless of what type of terminal you use.
.IP
That behaviour is standard; most implementations of the real vi supports it too.
\*E extends this to allow you to use "#1s" to refer to <shift>+<F1>,
"#1c" to refer to <control>+<F1>, and
"#1a" to refer to <alt>+<F1>.
The termcap description for the terminal should have fields named
:s1=:c1=:a1=: respectively, to define the code sent by these key conbinations.
(You should also have :k2=:s2=:c2=:a2=: for the <F2> key, and so on.)
.IP
But there may be problems.
The terminfo database doesn't support :s1=:c1=:a1=:, so no terminfo terminal
description could ever support shift/control/alt function keys;
so you might as well add -DNO_SHIFT_FKEY to CFLAGS if you're using terminfo.
.IP
Note that, even if you have -DNO_FKEYS, you can still configure \*E to use
your function keys my mapping the literal character codes sent by the key.
You just couldn't do it in a terminal-independent way.
.IP "-DTERM_925, -DTERM_AMIGA, -DTERM_VT100, -DTERM_VT52, etc."
The tinytcap.c file contains descriptions of several terminal types.
For each system that uses tinytcap, a reasonable subset of the available
descriptions is actually compiled into \*E.
If you wish to enlarge this subset, then you can add the appropriate -DTERM_XXX
flag to your CFLAGS settings.
.IP
For a list of the available terminal types, check the tinytcap.c file.
.IP -DINTERNAL_TAGS
Normally, \*E uses the "ref" program to perform tag lookup.
This is more powerful than the real vi's tag lookup,
but it can be much slower.
.IP
If you add -DINTERNAL_TAGS to your CFLAGS setting,
then \*E will use its own internal tag lookup code, which is faster.
.IP -DPRSVDIR=\fIdirectory\fR
This controls where preserved files will be placed.
An appropriate default has been chosen for each Operating System,
so you probably don't need to worry about it.
.IP -DFILEPERMS=\fInumber\fR
This affects the attributes of files that are created by \*E;
it is used as the second argument to the creat() function.
The default is 0666 which (on UNIX systems at least) means that
anybody can read or write the new file, but nobody can execute it.
On UNIX systems, the creat() call modifies this via the umask setting.
.IP -DKEYBUFSIZE=\fInumber\fR
This determines the size of the type-ahead buffer that elvis uses.
It also limits the size of keymaps that it can handle.
The default is 1000 characters, which should be plenty.

View File

@ -1,4 +0,0 @@
case $1 in
-*) shift;;
esac
sed 's/.//g' $*

View File

@ -1,84 +0,0 @@
.TH CTAGS 1
.SH NAME
ctags - Generates "tags" and (optionally) "refs" files
.SH SYNOPSIS
\fBctags\fP [\fB-stvra\fP] \fIfilesnames\fP...
.SH DESCRIPTION
\fIctags\fP generates the "tags" and "refs" files
from a group of C source files.
The "tags" file is used by Elvis' ":tag" command,
control-] command,
and -t option.
The "refs" file is sometimes used by the \fIref(1)\fP program.
.PP
Each C source file is scanned for #define statements and
global function definitions.
The name of the macro or function becomes the name of a tag.
For each tag, a line is added to the "tags" file which contains:
.RS
.nf
- the name of the tag
- a tab character
- the name of the file containing the tag
- a tab character
- a way to find the particular line within the file.
.RE
.fi
.PP
The filenames list will typically be the names of all C source
files in the current directory, like this:
.RS
.nf
$ ctags -stv *.[ch]
.RE
.fi
.SH OPTIONS
.IP \fB-t\fR
Include typedefs.
A tag will be generated for each user-defined type.
Also tags will be generated for struct and enum names.
Types are considered to be global if they are defined in a header file,
and static if they are defined in a C source file.
.IP \fB-v\fR
Include variable declarations.
A tag will be generated for each variable, except for those that are declared
inside the body of a function.
.IP \fB-s\fR
Include static tags.
\fICtags\fR will normally put global tags in the "tags" file, and silently ignore
the static tags.
This flag causes both global and static tags to be added.
The name of a static tag is generated by prefixing the name of the declared
item with the name of the file where it is defined, with a colon in between.
For example, "static foo(){}" in "bar.c" results in a tag named "bar.c:foo".
.IP \fB-r\fP
This causes \fIctags\fP to generate both "tags" and "refs".
Without \fB-r\fP, it would only generate "tags".
.IP \fB-a\fR
Append to "tags", and maybe "refs".
Normally, \fIctags\fR overwrites these files each time it is invoked.
This flag is useful when you have to many files in the current directory
for you to list them on a single command-line;
it allows you to split the arguments among several invocations.
.SH FILES
.IP tags
A cross-reference that lists each tag name, the name of the source file that
contains it, and a way to locate a particular line in the source file.
.IP refs
The "refs" file contains the definitions for each tag in the "tags" file,
and very little else.
This file can be useful, for example, when licensing restrictions prevent
you from making the source code to the standard C library readable by everybody,
but you still everybody to know what arguments the library functions need.
.SH BUGS
.PP
\fIctags\fR is sensitive to indenting and line breaks.
Consequently, it might not discover all of the tags in a file that
is formatted in an unusual way.
.SH "SEE ALSO"
elvis(1), refs(1)
.SH AUTHOR
.nf
Steve Kirkendall
kirkenda@cs.pdx.edu
.fi

View File

@ -1,130 +0,0 @@
.Go 6 "CUT BUFFERS"
.PP
When \*E deletes text, it stores that text in a cut buffer.
This happens in both visual mode and EX mode.
There is no practical limit to how much text a cut buffer can hold.
.PP
There are 36 cut buffers:
26 named buffers ("a through "z),
9 anonymous buffers ("1 through "9),
and 1 extra cut buffer (".).
.PP
In EX mode, the :move and :copy commands use a cut buffer to temporarily
hold the text to be moved/copied.
.NH 2
Putting text into a Cut Buffer
.PP
In visual mode, text is copied into a cut buffer when you use the
d, y, c, C, s, or x commands.
There are also a few others.
.PP
By default, the text goes into the "1 buffer.
The text that used to be in "1 gets shifted into "2,
"2 gets shifted into "3, and so on.
The text that used to be in "9 is lost.
This way, the last 9 things you deleted are still accessible.
.PP
You can also put the text into a named buffer -- "a through "z.
To do this, you should type the buffer's name
(two keystrokes: a double-quote and a lowercase letter)
before the command that will cut the text.
When you do this, "1 through "9 are not affected by the cut.
.PP
You can append text to one of the named buffers.
To do this, type the buffer's name in uppercase
(a double-quote and an uppercase letter)
before the d/y/c/C/s/x command.
.PP
The ". buffer is special.
It isn't affected by the d/y/c/C/s/x command.
Instead, it stores the text that you typed in
the last time you were in input mode.
It is used to implement the . visual command,
and ^A in input mode.
.PP
In EX mode (also known as colon mode),
the :delete, :change, and :yank commands all copy text into a cut buffer.
Like the visual commands, these EX commands normally use the "1 buffer,
but you can use one of the named buffers by giving its name after the command.
For example,
.sp 1
.ti +0.5i
:20,30y a
.sp
.LP
will copy lines 20 through 30 into cut buffer "a.
.PP
You can't directly put text into the ". buffer, or the "2 through "9 buffers.
.NH 2
Pasting from a Cut Buffer
.PP
There are two styles of pasting:
line-mode and character-mode.
If a cut buffer contains whole lines (from a command like "dd")
then line-mode pasting is used;
if it contains partial lines (from a command like "dw")
then character-mode pasting is used.
The EX commands always cut whole lines.
.PP
Character-mode pasting causes the text to be inserted into the line that
the cursor is on.
.PP
Line-mode pasting inserts the text on a new line above or below the line
that the cursor is on.
It doesn't affect the cursor's line at all.
.PP
In visual mode, the p and P commands insert text from a cut buffer.
Uppercase P will insert it before the cursor,
and lowercase p will insert it after the cursor.
Normally, these commands will paste from the "1 buffer, but you can
specify any other buffer to paste from.
Just type its name (a double-quote and another character)
before you type the P or p.
.PP
In EX mode, the (pu)t command pastes text after a given line.
To paste from a buffer other that "1,
enter its name after the command.
.NH 2
Macros
.PP
The contents of a named cut buffer can be executed as a series of
ex/vi commands.
.PP
To put the instructions into the cut buffer, you must first insert
them into the file, and then delete them into a named cut buffer.
.PP
To execute a cut buffer's contents as EX commands,
you should give the EX command "@" and the name of the buffer.
For example, :@z will execute "z as a series of EX commands.
.PP
To execute a cut buffer's contents as visual commands,
you should give the visual command "@" and the letter of the buffer's name.
The visual "@" command is different from the EX "@" command.
They interpret the cut buffer's contents differently.
.PP
The visual @ command can be rather finicky.
Each character in the buffer is interpretted as a keystroke.
If you load the instructions into the cut buffer via a "zdd command,
then the newline character at the end of the line will be executed just
like any other character, so the cursor would be moved down 1 line.
If you don't want the cursor to move down 1 line at the end of each
@z command, then you should load the cut buffer by saying 0"zD instead.
.PP
Although cut buffers can hold any amount of text,
\*E can only \fIexecute\fR small buffers.
The size limit is roughly 1000 characters, for either EX macros or VI macros.
If a buffer is too large to execute, an error message is displayed.
.PP
You can't nest :@ commands.
You can't run :@ commands from your .exrc file,
or any other :source file either.
Similarly, you can't run a :source command from within an @ command.
Hopefully, these restrictions will be lifted in a later version.
.NH 2
The Effect of Switching Files
.PP
When \*E first starts up, all cut buffers are empty.
When you switch to a different file
(via the :n or :e commands perhaps)
the 9 anonymous cut buffers are emptied again,
but the other 27 buffers ("a through "z, and ".) retain their text.

View File

@ -1,166 +0,0 @@
.Go 7 "DIFFERENCES BETWEEN \*E & BSD VI/EX"
.PP
\*E is not 100% compatible with the real vi/ex.
\*E has many small extensions, some omissions, and a few features which
are implemented in a slightly different manner.
.NH 2
Extensions
.IP "Save Configuration" 1i
The :mkexrc command saves the current :set, :map, :ab, :color, and :digraph
configurations in the ".exrc" file in your current directory.
.IP "Previous File" 1i
The :N or :prev command moves backwards through the args list.
.IP "Center Current Row" 1i
In visual command mode, the (lowercase) "zz" command will center the current
line on the screen, like "z=".
.IP "Changing Repeat Count" 1i
The default count value for . is the same as the previous command
which . is meant to repeat.
However, you can supply a new count if you wish.
For example, after "3dw", "." will delete 3 words,
but "5." will delete 5 words.
.IP "Previous Text" 1i
The text which was most recently input
(via a "cw" command, or something similar)
is saved in a cut buffer called ". (which
is a pretty hard name to write in an English sentence).
.IP "Keyword Lookup" 1i
In visual command mode, you can move the cursor onto a word and press
shift-K to have \*E run a reference program to look that word up.
This command alone is worth the price of admission!
See the ctags and ref programs.
.IP "Increment/Decrement" 1i
In visual command mode, you can move the cursor onto a number and
then hit ## or #+ to increment that number by 1.
To increment it by a larger amount,
type in the increment value before hitting the initial #.
The number can also be decremented or set by hitting #- or #=, respectively.
.IP "Input Mode" 1i
You can backspace past the beginning of the line.
.IP "" 1i
The arrow keys work in input mode.
.IP "" 1i
If you type control-A, then the text that you input last time is inserted.
You will remain in input mode, so you can backspace over part of it,
or add more to it.
(This is sort of like control-@ on the real vi,
except that control-A really works.)
.IP "" 1i
Control-P will insert the contents of the cut buffer.
.IP "" 1i
Real vi can only remember up to 128 characters of input,
but \*E can remember any amount.
.IP "" 1i
The ^T and ^D keys can adjust the indent of a line no matter where
the cursor happens to be in that line.
.IP "" 1i
You can save your file and exit \*E directly from input mode by hitting
control-Z twice.
.IP "" 1i
\*E supports digraphs as a way to enter non-ASCII characters.
.IP "Start in Input Mode" 1i
If you ":set inputmode" in your .exrc file, then \*E will start up in
input mode instead of visual command mode.
.IP "Visible Fonts" 1i
With ":set charattr", \*E can display "backslash-f" style character attributes on the
screen as you edit.
The following example shows the recognized atributes:
.sp
.ti +0.5i
normal \\fBboldface\\fR \\fIitalics\\fR \\fUunderlined\\fR normal
.sp
NOTE: you must compile \*E without the -DNO_CHARATTR flag for
this to work.
.IP "File Syncing" 1i
After a crash, you can usually recover the altered form of the file
from the temporary file that \*E uses -- unless the temporary file was
corrupted.
.IP "" 1i
UNIX systems use a delayed-write cache, which means that when \*E tries to
write to the temporary file, the information might still be in RAM instead
of on the disk.
A power failure at that time would cause the in-RAM information to be lost.
UNIX's sync() call will force all such information to disk.
.IP "" 1i
MS-DOS and Atari TOS don't write a file's length to disk until that file
is closed.
Consequently, the temporary file would appear to be 0 bytes long if power
failed when we were editing.
To avoid this problem, a sync() function has been written which will close
the temporary file and then immediately reopen it.
.IP "Cursor Shape" 1i
\*E changes the shape of the cursor to indicate which mode you're in,
if your terminal's termcap entry includes the necessary capabilities.
.IP "Hide nroff Lines" 1i
The ":set hideformat" option hides nroff format control lines.
(They are displayed on the screen as blank lines.)
.ne 7
.IP "Compiler Interface" 1i
\*E is clever enough to parse the error messages emitted by many compilers.
To use this feature,
you should collect your compiler's error messages into a file called "errlist";
\*E will read this file,
determine which source file caused the error messages,
start editing that file,
move the cursor to the line where the error was detected,
and display the error message on the status line.
Nifty!
.IP "Visible Text Selection" 1i
In visual command mode, 'v' starts visibly selecting characters and
\&'V' starts visibly selecting whole lines.
The character or line where the cursor is located becomes one
endpoint of the selection.
You can then use the standard cursor movement commands to move the cursor
to the other endpoint, and then press one of the operator commands
(c/d/y/</>/!/=/\\).
The operator will then immediately be applied to the selected text.
.IP "Pop-up Menu Operator" 1i
The '\\' key is a new operator,
similar in operation to the c/d/y/</>/! operators.
It conjures up a menu, from which you can select any of the other
operators plus a few other common commands.
.IP "Preset Filter Operator" 1i
The '=' key is another new operator.
It is similar to the '!' operator, except that while
\&'!' asks you to type in a filter command each time,
\&'=' assumes it should always run the command stored in the \fIequalprg\fR option.
.IP "Move to a Given Percentage" 1i
The '%' movement key can now accept an optional count.
Without a count, the '%' key still moves to a matching parenthesis
like it always did.
With a count somewhere between 1 and 100, though, it moves the cursor to
approximately a given percentage of the way through the file.
For example, typing "50%" will move the cursor to the middle of the file.
.IP "Regular Expressions"
In regular expressions, several new forms of closure operators are supported:
\\{\fIn\fR}, \\{\fIn\fR,\fIm\fR}, \\+, and \\?.
.NH 2
Omissions
.PP
The replace mode is a hack.
It doesn't save the text that it overwrites.
.PP
Long lines are displayed differently -- where the real vi would
wrap a long line onto several rows of the screen, \*E simply
displays part of the line, and allows you to scroll the screen
sideways to see the rest of it.
.PP
The ":preserve" and ":recover" commands are missing.
So is the -r flag.
I've never had a good reason to use ":preserve",
and since ":recover" is used so rarely
I decided to implement it as a separate program.
There's no need to load the recovery code into memory every
time you edit a file, I figured.
.PP
LISP support is missing.
However, the = key is still an operator that reformats lines of text.
By default, it reformats lines by sending them through the \fIfmt\fP filter,
but you could write your own LISP beautifier and configure elvis to use it.
Key mappings could take care of most other differences.
Auto-indent is the only thing that is irrecoverably lost.
.PP
Autoindent mode acts a little different from the real vi, anyway.
It doesn't handle ^^D or 0^D correctly.
On the other hand, it \fIdoes\fP allow ^D and ^T to be used anywhere in the
line, to adjust the indentation for the whole line.

View File

@ -1,7 +0,0 @@
# $Id: Makefile,v 1.3 1993/08/02 17:54:19 mycroft Exp $
PROG= elvisrecover
CFLAGS+=-I${.CURDIR}/../elvis
.include <bsd.prog.mk>
.PATH: ${.CURDIR}/../elvis

View File

@ -1,31 +0,0 @@
Elvis is a clone of vi/ex, the standard UNIX editor. Elvis supports
nearly all of the vi/ex commands, in both visual mode and colon mode.
Elvis runs under BSD UNIX, AT&T SysV UNIX, SCO Xenix, Minix, MS-DOS
(Turbo-C or MSC 5.1), Atari TOS, OS9/68000, Coherent, VMS, and AmigaDos.
Ports to other operating systems are in progress; contact me before you
start porting it to some other OS, because somebody else may have
already done it for you.
Elvis is freely redistributable, in either source form or executable
form. There are no restrictions on how you may use it.
The file "elvisman.txt" contains the manual for elvis. It is a plain
ASCII file with nothing more exotic than a newline character. It is
formatted for 66-line, 80-column pages. There may also be an archive of
"*.ms" and "*.man" files, which contain the TROFF source text used to
generate that manual.
The file named "Makefile.mix" is used to compile elvis for all systems
except VMS and possibly MS-DOS. You should copy "Makefile.mix" to
"Makefile", and then edit "Makefile" to select the appropriate group of
settings for your system.
Author: Steve Kirkendall
14407 SW Teal Blvd. #C
Beaverton, OR 97005
E-mail: kirkenda@cs.pdx.edu
Phone: (503) 643-6980

View File

@ -1,48 +0,0 @@
.\" $Id: elvisrecover.1,v 1.4 1993/08/02 17:54:20 mycroft Exp $ -*- nroff -*-
.TH ELVREC 1
.SH NAME
elvrec - Recover the modified version of a file after a crash
.SH SYNOPSIS
.nf
\fBelvrec\fP [\fIpreservedfile\fP [\fInewfile\fR]]
.fi
.SH DESCRIPTION
.PP
If you're editing a file when \fIelvis\fP dies, the system crashes, or power fails,
the most recent version of your text will be preserved.
The preserved text is stored in a special directory; it does NOT overwrite
your text file automatically.
.PP
The \fIelvrec\fP program locates the preserved version of a given file,
and writes it over the top of your text file -- or to a new file, if you prefer.
The recovered file will have nearly all of your changes.
.PP
To see a list of all recoverable files, run \fIelvrec\fP with no arguments.
.SH FILES
.IP /usr/preserve/p*
The text that was preserved when \fIelvis\fP died.
.IP /usr/preserve/Index
A text file which lists the names of all preserved files, and the names
of the /usr/preserve/p* files which contain their preserved text.
.SH BUGS
.PP
\fIelvrec\fP is very picky about filenames.
You must tell it to recover the file using exactly the same pathname as
when you were editing it.
The simplest way to do this is to go into the same directory that you were
editing, and invoke \fIelvrec\fP with the same filename as \fIelvis\fP.
If that doesn't work, then try running \fIelvrec\fP with no arguments,
to see exactly which pathname it is using for the desired file.
.PP
Due to the permissions on the /usr/preserve directory, on UNIX systems
\fIelvrec\fP must be run as superuser.
This is accomplished by making the \fIelvrec\fP executable be owned by "root"
and setting its "set user id" bit.
.PP
If you're editing a nameless buffer when \fIelvis\fP dies, then \fIelvrec\fP
will pretend that the file was named "foo".
.SH AUTHOR
.nf
Steve Kirkendall
kirkenda@cs.pdx.edu
.fi

View File

@ -1,206 +0,0 @@
/* elvrec.c */
/* This file contains the file recovery program */
/* Author:
* Steve Kirkendall
* 14407 SW Teal Blvd. #C
* Beaverton, OR 97005
* kirkenda@cs.pdx.edu
*/
#ifndef lint
static char rcsid[] = "$Id: elvisrecover.c,v 1.3 1993/08/02 17:54:21 mycroft Exp $";
#endif /* not lint */
#include <stdio.h>
#include "config.h"
#include "vi.h"
void recover P_((char *, char *));
void main P_((int, char **));
void recover(basename, outname)
char *basename; /* the name of the file to recover */
char *outname; /* the name of the file to write to */
{
char pathname[500]; /* full pathname of the file to recover */
char line[600]; /* a line from the /usr/preserve/Index file */
int ch; /* a character from the text being recovered */
FILE *from; /* the /usr/preserve file, or /usr/preserve/Index */
FILE *to; /* the user's text file */
char *ptr;
#if OSK
int uid;
#endif
/* convert basename to a full pathname */
if (basename)
{
#ifndef CRUNCH
# if MSDOS || TOS
if (!basename[0] || basename[1] != ':')
# else
if (basename[0] != SLASH)
# endif
{
ptr = getcwd(pathname, sizeof pathname);
if (ptr != pathname)
{
strcpy(pathname, ptr);
}
ptr = pathname + strlen(pathname);
*ptr++ = SLASH;
strcpy(ptr, basename);
}
else
#endif
{
strcpy(pathname, basename);
}
}
#if OSK
uid = getuid();
if(setuid(0))
exit(_errmsg(errno, "Can't set uid\n"));
#endif
/* scan the /usr/preserve/Index file, for the *oldest* unrecovered
* version of this file.
*/
from = fopen(PRSVINDEX, "r");
while (from && fgets(line, sizeof line, from))
{
/* strip off the newline from the end of the string */
line[strlen(line) - 1] = '\0';
/* parse the line into a "preserve" name and a "text" name */
for (ptr = line; *ptr != ' '; ptr++)
{
}
*ptr++ = '\0';
/* If the "preserve" file is missing, then ignore this line
* because it describes a file that has already been recovered.
*/
if (access(line, 0) < 0)
{
continue;
}
/* are we looking for a specific file? */
if (basename)
{
/* quit if we found it */
if (!strcmp(ptr, pathname))
{
break;
}
}
else
{
/* list this file as "available for recovery" */
puts(ptr);
}
}
/* file not found? */
if (!basename || !from || feof(from))
{
if (from != NULL) fclose(from);
if (basename)
{
fprintf(stderr, "%s: no recovered file has that exact name\n", pathname);
}
return;
}
if (from != NULL) fclose(from);
/* copy the recovered text back into the user's file... */
/* open the /usr/preserve file for reading */
from = fopen(line, "r");
if (!from)
{
perror(line);
exit(2);
}
#if ANY_UNIX
/* Be careful about user-id. We want to be running under the user's
* real id when we open/create the user's text file... but we want
* to be superuser when we delete the /usr/preserve file. For UNIX,
* we accomplish this by deleting the /usr/preserve file *now*,
* when it is open but before we've read it. Then we revert to the
* user's real id.
*/
unlink(line);
setuid(getuid());
#endif
#if OSK
setuid(uid);
#endif
if (outname == NULL) return;
/* open the user's file for writing */
to = fopen(outname, "w");
if (!to)
{
perror(ptr);
exit(2);
}
/* copy the text */
while ((ch = getc(from)) != EOF)
{
putc(ch, to);
}
#if !ANY_UNIX
#if OSK
fclose(from);
setuid(0);
#endif
/* delete the /usr/preserve file */
unlink(line);
#if OSK
setuid(uid);
#endif
#endif
}
void
main(argc, argv)
int argc;
char **argv;
{
/* check arguments */
if (argc > 3)
{
fprintf(stderr, "usage: %s [preserved_file [recovery_file]]\n", argv[0]);
exit(2);
}
/* recover the requested file, or list recoverable files */
if (argc == 3)
{
/* recover the file, but write it to a different filename */
recover (argv[1], argv[2]);
}
else if (argc == 2)
{
/* recover the file */
recover(argv[1], argv[1]);
}
else
{
/* list the recoverable files */
recover((char *)0, (char *)0);
}
/* success! */
exit(0);
}