[comp.sources.amiga] v89i135: stevie - vi editor clone v3.6, Part06/06

page%swap@Sun.COM (Bob Page) (05/12/89)

Submitted-by: grwalter@watmath.waterloo.edu (Fred Walter)
Posting-number: Volume 89, Issue 135
Archive-name: editors/stevie36.6

# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
#	source.doc
#	stevie.doc
#	stevie.h
#	tags
#	term.h
#	tos.c
#	tos.h
#	unix.c
#	unix.h
#	version.c
# This is archive 6 of a 6-part kit.
# This archive created: Thu May 11 19:41:29 1989
echo "extracting source.doc"
sed 's/^X//' << \SHAR_EOF > source.doc
X
X		 Release Notes for STEVIE - Version 3.10a
X
X			      Source Notes
X
X		      Tony Andrews - March 6, 1988
X
XOverview
X--------
X
X	This file provides a brief description of the source code for
XStevie. The data structures are described later as well. For information
Xspecific to porting the editor, see the file 'porting.doc'. This document
Xis more relevant to people who want to hack on the editor apart from doing
Xa simple port.
X
X	Most of this document was written some time ago so a lot of the
Xdiscussion centers on problems related to the Atari ST environment and
Xcompilers. Most of this can be ignored for other systems.
X
XThings You Need - ATARI
X-----------------------
X
X	Stevie has been compiled with both the Alcyon (4.14A) and the
XMegamax C compilers. For the posted binary, Megamax was used because
Xit's less buggy and provides a reasonable malloc(). Ports to other
Xcompilers should be pretty simple. The current ifdef's for ALCYON and
XMEGAMAX should point to the potential trouble areas. (See 'porting.doc'
Xfor more information.)
X
X	The search code depends on Henry Spencer's regular expression
Xcode. I used a version I got from the net recently (as part of a 'grep'
Xposting) and had absolutely no trouble compiling it on the ST. Thanks,
XHenry!
X
X	The file 'getenv.c' contains a getenv routine that may or may
Xnot be needed with your compiler. My version works with Alcyon and
XMegamax, under either the Beckemeyer or Gulam shells.
X
X	Lastly, you need a decent malloc. Lots of stuff in stevie is
Xallocated dynamically. The malloc with Alcyon is problematic because
Xit allocates from the heap between the end of data and the top of stack.
XIf you make the stack big enough to edit large files, you wind up
Xwasting space when working with small files. Mallocs that get their memory
Xfrom GEMDOS (in fairly large chunks) are much better.
X
XThings You Need - AMIGA
X-----------------------
X
X	Lattice C version 5.0 or later.
X
XData Structures
X---------------
X
X	A brief discussion of the evolution of the data structures will
Xdo much to clarify the code, and explain some of the strangeness you may
Xsee.
X
X	In the original version, the file was maintained in memory as a
Xsimple contiguous buffer. References to positions in the file were simply
Xcharacter pointers. Due to the obvious performance problems inherent in
Xthis approach, the following changes were made.
X
X	The file is now represented by a doubly linked list of 'line'
Xstructures defined as follows:
X
Xstruct	line {
X	struct	line   *next;	/* next line */
X	struct	line   *prev;	/* previous line */
X	char	       *s;	/* text for this line */
X	int	        size;	/* actual size of space at 's' */
X	unsigned long   num;	/* line "number" */
X};
X
XThe members of the line structure are described more completely here:
X
Xprev	- pointer to the structure for the prior line, or NULL for the
X	  first line of the file
X
Xnext	- like 'prev' but points to the next line
X
Xs	- points to the contents of the line (null terminated)
X
Xsize	- contains the size of the chunk of space pointed to by s. This
X	  is used so we know when we can add text to a line without getting
X	  more space. When we DO need more space, we always get a little
X	  extra so we don't make so many calls to malloc.
X
Xnum	- This is a pseudo line number that makes it easy to compare
X	  positions within the file. Otherwise, we'd have to traverse
X	  all the links to tell which line came first.
X
X	Since character pointers served to mark file positions in the
Xoriginal, a similar data object was needed for the new data structures.
XThis purpose is served by the 'lptr' structure which is defined as:
X
Xstruct	lptr {
X	struct	line   *linep;	/* line we're referencing */
X	int         	index;	/* position within that line */
X};
X
XThe member 'linep' points to the 'line' structure for the line containing
Xthe location of interest. The integer 'index' is the offset into the line
Xdata (member 's') of the character to be referenced.
X
XThe following typedef's are more commonly used:
X
Xtypedef	struct line	LINE;
Xtypedef	struct lptr	LPtr;
X
XMany operations that were trivial with character pointers had to be
Ximplemented by functions or macros to manipulate LPtr's. Most of these are in
Xthe files 'ptrfunc.c' and 'macros.h'. There you'll find functions to increment,
Xdecrement, and compare LPtr's.
SHAR_EOF
echo "extracting stevie.doc"
sed 's/^X//' << \SHAR_EOF > stevie.doc
X
X	    STEVIE - Simply Try this Editor for VI Enthusiasts
X
X			 Quick Reference Card
X
X				  by
X
X	          Tony Andrews And G. R. (Fred) Walter
X
XSTEVIE may be freely distributed. The source isn't copyrighted or
Xrestricted in any way. If you pass the program along, please include all
Xthe documentation and, if practical, the source as well.
X
XSTEVIE used to stand for 'ST Editor for VI Enthusiasts', however since this
Xeditor is used on more machines than just ST's the acronym was changed.
X
XStarting the Editor
X-------------------
X
XThe following command line forms are supported:
X
X	vi [file ...]		Edit the specified file(s)
X
X	vi -t tag		Start at location of the given tag
X
X	vi + file		Edit file starting at end
X
X	vi +n file		Edit file starting a line number 'n'
X
X	vi +/pat file		Edit file starting at pattern 'pat'
X
XIf multiple files are given on the command line (using the first form),
Xthe ":n" command goes to the next file, ":p" goes backward in the list,
Xand ":rew" can be used to rewind back to the start of the file list.
X
XSet Command Options
X-------------------
X
XThe ":set" command works as usual to set parameters. Each parameter has
Xa long and an abbreviated name, either of which may be used. Boolean
Xparameters are set as in:
X
X	set showmatch
X
Xor cleared by:
X
X	set noshowmatch
X
XNumeric parameters are set as in:
X
X	set scroll=5
X
XSeveral parameters may be set with a single command:
X
X	set novb sm report=1
X
XTo see the status of all parameters use ":set all". Typing ":set" with
Xno arguments will show only those parameters that have been changed.
XThe supported parameters, their names, defaults, and descriptions are
Xshown below:
X
XFull Name	Short	Default		Description
X------------------------------------------------------------------------------
Xvbell		vb	vb		Use visual bell (novb for audible bell)
Xshowmatch	sm	nosm		Showmatch mode
Xwrapscan	ws	ws		Wrapscan (searches cross file start/end)
Xerrorbells	eb	noeb		Ring bell when error messages are shown
Xshowmode	mo	nomo		Show on status line when in insert mode
Xbackup		bk	nobk		Leave backup in *.bak on file writes
Xreturn		cr	cr		End lines with cr-lf when writing
Xlist		list	nolist		Show tabs and newlines graphically
Xautoindent      ai      noai            Start new line at same col as prior line
Xignorecase      ic      noic            Ignore case in search strings
Xnumber          nu      nonu            Display lines with their line numbers
X
Xscroll		scroll	12		Number of lines to scroll for ^D and ^U
Xtabstop		ts	8		Number of spaces in a tab
Xreport		report	5		Min # of lines to report operations on
Xlines		lines	25		Number of lines on the screen
X
XThe EXINIT environment variable can be used to modify the default values
Xon startup as in:
X
X		setenv EXINIT="set sm ts=4"
X
XThe 'backup' parameter, if set, causes the editor to retain a backup of any
Xfiles that are written. During file writes, a backup is always kept for
Xsafety until the write is completed. At that point, the 'backup' parameter
Xdetermines whether the backup file is deleted.
X
XIn environments (e.g. OS/2 or TOS) where lines are normally terminated by
XCR-LF, the 'return' parameter allows files to be written with only a LF
Xterminator (if the parameter is cleared).
X
XThe 'lines' parameter tells the editor how many lines there are on the screen.
XThis is useful on systems like the ST where various screen resolutions may be
Xused. By using the 'lines' parameter, different screen sizes can be easily
Xhandled. On the Amiga system window resizes are atomatically detected and
Xacted upon. It is suggested that one's window be larger than 2 rows and 5
Xcolumns.
X
XColon Commands
X--------------
X
XSeveral of the normal 'vi' colon commands are supported by STEVIE. Some commands
Xmay be preceded by a line range specification. For commands that accept a range
Xof lines, the following address forms are supported:
X
Xaddr
Xaddr + number
Xaddr - number
X
Xwhere 'addr' may be one of the following:
X    a line number
X    a mark (as in 'a or 'b)
X    % (entire file)
X    . (the current line)
X    $ (the last line)
X
XThe Global Command
X------------------
X
XA limited form of the global command is supported, accepting the following
Xcommand form:
X
Xg/pattern/X
X
Xwhere X may be either 'd' or 'p' to delete or print lines that match the given
Xpattern. If a line range is given, only those lines are checked for a match
Xwith the pattern. If no range is given, all lines are checked.
X
XIf the trailing command character is omitted, 'p' is assumed. In this case, the
Xtrailing slash is also optional. The current version of the editor does not
Xsupport the undo operation following the deletion of lines with the global
Xcommand.
X
XThe Substitute Command
X----------------------
X
XThe substitute command provides a powerful mechanism for making more complex
Xsubstitutions than can be done directly from visual mode. The general form of
Xthe command is:
X
Xs/pattern/replacement/g
X
XEach line in the given range (or the current line, if no range was given) is
Xscanned for the given regular expression. When found, the string that matched
Xthe pattern is replaced with the given replacement string. If the replacement
Xstring is null, each matching pattern string is deleted.
X
XThe trailing 'g' is optional and, if present, indicates that multiple
Xoccurrences of 'pattern' on a line should all be replaced.
X
XSome special sequences are recognized in the replacement string. The
Xampersand character is replaced by the entire pattern that was matched.
XFor example, the following command could be used to put all occurrences
Xof 'foo' or 'bar' within double quotes:
X
X1,$s/foo|bar/&/g
X
XThe special sequence "\n" where 'n' is a digit from 1 to 9, is replaced
Xby the string the matched the corresponding parenthesized expression in
Xthe pattern. The following command could be used to swap the first two
Xparameters in calls to the C function "foo":
X
X1,$s/foo\\(([^,]*),([^,]*),/foo(\\2,\\1,/g
X
XLike the global command, substitutions can't be undone with this version of
Xthe editor.
X
XThe Delete Command
X------------------
X
X:[range]d will delete the range of lines.
X
XFile Manipulation Commands
X--------------------------
X
X:w		write the current file
X:wq		write and quit
X:x		write (if necessary) and quit
XZZ		same as ":x"
X
X:e file		edit the named file
X:e!		re-edit the current file, discarding any changes
X:e #		edit the alternate file
X
X:w file		write the buffer to the named file
X:x,y w file	write lines x through y to the named file
X:r file		read the named file into the buffer
X
X:n		edit the next file
X:p		edit the previous file
X:rew		rewind the file list
X
X:f		show the current file name
X:f name		change the current file name
X
X:ta tag		go to the named tag
X^]		like ":ta" using the current word as the tag
X
X:help		display a command summary
X
XThe ":help" command can also be invoke with the <HELP> key on the Atari ST
Xor the Amiga. This actually displays a pretty complete summary of the real vi
Xwith unsupported features indicated appropriately.
X
XThe commands above work pretty much like they do in 'vi'. Most of the
Xcommands support a '!' suffix (if appropriate) to discard any pending
Xchanges.
X
XString Searches
X---------------
X
XString searches are supported, as in vi, accepting the usual regular
Xexpression syntax. This was done using Henry Spencer's regular expression
Xlibrary without modification. Tony Andrews added code outside the library to
Xsupport the '\<' and '\>' extensions and code inside the library to support
Xthe ignorecase option.
X
XOperators
X---------
X
XThe vi operators (d, c, y, <, and >) work as true operators.
X
XTags
X----
X
XTags are implemented.
X
XSystem-Specific Comments
X------------------------
X
XThe following sections provide additional relevant information for the
Xsystems to which STEVIE has been ported.
X
XAtari ST
X--------
X
XThe editor has been tested in all three resolutions, although low and
Xhigh res. are less tested than medium. The 50-line high res. mode can
Xbe used by setting the 'lines' parameter to 50. Alternatively, the
Xenvironment variable 'LINES' can be set. The editor doesn't actively
Xset the number of lines on the screen. It just operates using the number
Xof lines it was told.
X
XThe arrow keys, as well as the <INSERT>, <HELP>, and <UNDO> keys are
Xall mapped appropriately.
X
XUNIX
X----
X
XThe editor has been ported to UNIX System V release 3. It's hard-coded for
Xansi-style escape sequences and doesn't use the termcap/terminfo routines at
Xall.
X
XOS/2
X----
X
XMake sure 'ansi' mode is on (using the 'ansi' command).
XThe OS/2 console driver doesn't support insert/delete line, so STEVIE
Xbypasses the driver and makes the appropriate system calls directly.
XThis is all done in the system-specific part of the editor so the kludge
Xis at least localized.
X
XThe arrow keys, page up/down and home/end all do what you'd expect. The function
Xkeys are hard-coded to some useful macros until I can get true support for
Xmacros into the editor. The current mappings are:
X
XF1	:p <RETURN>
XF2	:n <RETURN>
XF3	:e # <RETURN>
XF4	:rew <RETURN>
XF5	[[
XF6	]]
XF7	<<
XF8	>>
XF9	:x <RETURN>
XF10	:help <RETURN>
X
XS-F1	:p! <RETURN>
XS-F2	:n! <RETURN>
X
XMSDOS
X-----
X
XSTEVIE has been ported to MSDOS 3.3 on an AT using the Microsoft C compiler,
Xversion 5.10.  The keyboard mappings are the same as for OS/2.
XThe only problem with the PC version is that the inefficiency of
Xthe screen update code becomes painfully apparent on slower machines.
X
XBSD 4.3
X-------
X
XThis port was done so it could be worked on in a main-frame enviroment.
X
XAmiga
X-----
X
XThe arrow keys and the help key are supported, as is window re-sizing.
XIt is strongly suggested that you not try to type in console commands
X(alt-esc in some keymaps, plus the appropriate other keys) since STEVIE
Xcaptures all console input. If you do type alt-esc then typing '|' will
Xreturn you to STEVIE.
X
XMissing Features
X----------------
X
X1. Macros with support for function keys.
X
X2. More "set" options.
X
X3. Many others...
X
XKnown Bugs and Problems
X-----------------------
X
X1. The yank buffer uses statically allocated memory, so yanks of more than
X   5K of text will fail. If a delete spans more than 5K, the program asks
X   for confirmation before proceeding. That way, if you were moving text,
X   you don't get screwed by the limited yank buffer. You just have to move
X   smaller chunks at a time. All the internal buffers (yank, redo, etc.)
X   need to be reworked to allocate memory dynamically.
X
X2. If you stay in insert mode for a long time (around 5K's worth of
X   characters, including newlines) the insert buffer can overflow.
X   When this happens you lose your ability to automatically undo the text just
X   inserted and the redo/undo/(undo of undo) buffers are reset to the
X   current position.
X
X3. Several other less bothersome glitches...
X
XCharacter Function Summary
X--------------------------
X
XThe following list describes the meaning of each character that's used
Xby the editor. In some cases characters have meaning in both command and
Xinsert mode; these are all described.
X
X^@	The null character. Not used in any mode. This character may not
X	be present in the file, as is the case with vi.
X
X^B	Backward one screen.
X
X^D	Scroll the window down one half screen.
X
X^E	Scroll the screen up one line.
X
X^F	Forward one screen.
X
X^G	Same as ":f" command. Displays file information.
X
X^H (BS)	Moves cursor left one space in command mode. In insert mode, erases
X	the last character typed.
X
X^J	Move the cursor down one line.
X
X^L	Clear and redraw the screen.
X
X^M (CR)	Move to the first non-white character in the next line. In insert
X	mode, a carriage return opens a new line for input.
X
X^N	Move the cursor down a line.
X
X^P	Move the cursor up a line.
X
X^U	Scroll the window up one half screen.
X
X^V	Indicates that the next character is should be treated as entered
X	and not modified (used to enter control characters, etc.).
X
X^Y	Scroll the screen down one line.
X
X^[	Escape cancels a pending command in command mode, and is used to
X	terminate insert mode.
X
X^]	Moves to the tag whose name is given by the word in which the cursor
X	resides.
X
X^`	Same as ":e #" if supported (system-dependent).
X
XSPACE	Move the cursor right on column.
X
X$	Move to the end of the current line.
X
X%	If the cursor rests on a paren '()', brace '{}', or bracket '[]',
X	move to the matching one.
X
X'	Used to move the cursor to a previously marked position, as in
X	'a or 'b. The cursor moves to the start of the marked line. The
X	special mark '' refers to the "previous context".
X
X+	Same as carriage return, in command mode.
X
X,	Reverse of the last t, T, f, or F command.
X
X-	Move to the first non-white character in the previous line.
X
X.	Repeat the last edit command.
X
X/	Start of a forward string search command. String searches may be
X	optionally terminated with a closing slash. To search for a slash
X	use '\/' in the search string.
X
X0	Move to the start of the current line. Also used within counts.
X
X1-9	Used to add 'count' prefixes to commands.
X
X:	Prefix character for "ex" commands.
X
X;	Repeat last t, T, f, or F command.
X
X<	The 'left shift' operator.
X
X>	The 'right shift' operator.
X
X?	Same as '/', but search backward.
X
XA	Append at the end of the current line.
X
XB	Backward one blank-delimited word.
X
XC	Change the rest of the current line.
X
XD	Delete the rest of the current line.
X
XE	End of the end of a blank-delimited word.
X
XF	Find a character backward on the current line.
X
XG	Go to the given line number (end of file, by default).
X
XH	Move to the first non-white char. on the top screen line.
X
XI	Insert before the first non-white char. on the current line.
X
XJ	Join two lines.
X
XL	Move to the first non-white char. on the bottom screen line.
X
XM	Move to the first non-white char. on the middle screen line.
X
XN	Reverse the last string search.
X
XO	Open a new line above the current line, and start inserting.
X
XP	Put the yank/delete buffer before the current cursor position.
X
XT	Reverse search 'upto' the given character.
X
XW	Move forward one blank-delimited word.
X
XX	Delete one character before the cursor.
X
XY	Yank the current line. Same as 'yy'.
X
XZZ	Exit from the editor, saving changes if necessary.
X
X[[	Move backward one C function.
X
X]]	Move forward one C function.
X
X^	Move to the first non-white on the current line.
X
X`	Move to the given mark, as with '. The distinction between the two
X	commands is important when used with operators. I support the
X	difference correctly. If you don't know what I'm talking about,
X	don't worry, it won't matter to you.
X
X~       Switch case of character under cursor.
X
Xa	Append text after the cursor.
X
Xb	Back one word.
X
Xc	The change operator.
X
Xd	The delete operator.
X
Xe	Move to the end of a word.
X
Xf	Find a character on the current line.
X
Xh	Move left one column.
X
Xi	Insert text before the cursor.
X
Xj	Move down one line.
X
Xk	Move up one line.
X
Xl	Move right one column.
X
Xm	Set a mark at the current position (e.g. ma or mb).
X
Xn	Repeat the last string search.
X
Xo	Open a new line and start inserting text.
X
Xp	Put the yank/delete buffer after the cursor.
X
Xr	Replace a character.
X
Xs	Replace characters.
X
Xt	Move forward 'upto' the given character on the current line.
X
Xu	Undo the last edit.
X
Xw	Move forward one word.
X
Xx	Delete the character under the cursor.
X
Xy	The yank operator.
X
Xz	Redraw the screen with the current line at the top (zRETURN),
X	the middle (z.), or the bottom (z-).
X
X|	Move to the column given by the preceding count.
SHAR_EOF
echo "extracting stevie.h"
sed 's/^X//' << \SHAR_EOF > stevie.h
X/*
X * STEVIE - Simply Try this Editor for VI Enthusiasts
X *
X * Code Contributions By : Tim Thompson           twitch!tjt
X *                         Tony Andrews           onecom!wldrdg!tony 
X *                         G. R. (Fred) Walter    watmath!watcgl!grwalter 
X */
X
X#include "env.h"
X
X#include <stdio.h>
X#ifndef ATARI
X# ifndef UNIX
X#   include <stdlib.h>
X# endif
X#endif
X#include <ctype.h>
X#ifndef MWC
X# include <string.h>
X#endif
X#include "ascii.h"
X#include "keymap.h"
X#include "param.h"
X#include "term.h"
X#include "macros.h"
X
X#ifdef AMIGA
X/*
X * This is used to disable break signal handling.
X */
X#include <signal.h>
X#endif
X
Xextern char    *strchr();
X
X#define NORMAL			 0
X#define CMDLINE			 1
X#define INSERT			 2
X#define APPEND			 3
X#define UNDO			 4
X#define REDO			 5
X#define PUT			 6
X#define FORWARD			 7
X#define BACKWARD		 8
X#define VALID			 9
X#define NOT_VALID		10
X#define VALID_TO_CURSCHAR	11
X#define UPDATE_CURSOR           12
X#define UPDATE_ALL              13
X
X/*
X * Boolean type definition and constants 
X */
Xtypedef int     bool_t;
X
X#ifndef	TRUE
X# define	FALSE	(0)
X# define	TRUE	(1)
X#endif
X#define	SORTOF	(2)
X#define YES      TRUE
X#define NO       FALSE
X#define MAYBE    SORTOF
X
X/*
X * Maximum screen dimensions
X */
X#define MAX_COLUMNS 140L
X
X/*
X * Buffer sizes
X */
X#define CMDBUFFSIZE MAX_COLUMNS	/* size of the command processing buffer */
X
X#define LSIZE        512	/* max. size of a line in the tags file */
X
X#define IOSIZE     (1024+1)	/* file i/o and sprintf buffer size */
X
X#define YANKSIZE    5200	/* yank buffer size */
X#define INSERT_SIZE 5300	/* insert, redo and undo buffer size must be
X				 * bigger than YANKSIZE */
X#define REDO_UNDO_SIZE 5400	/* redo, undo and (undo an undo) buffer size
X				 * must be bigger than INSERT_SIZE */
X#define READSIZE    5500	/* read buffer size must be bigger than
X				 * YANKSIZE and REDO_UNDO_SIZE */
X
X/*
X * SLOP is the amount of extra space we get for text on a line during editing
X * operations that need more space. This keeps us from calling alloc every
X * time we get a character during insert mode. No extra space is allocated
X * when the file is initially read. 
X */
X#define	SLOP	10
X
X/*
X * LINEINC is the gap we leave between the artificial line numbers. This
X * helps to avoid renumbering all the lines every time a new line is
X * inserted. 
X *
X * Since line numbers are stored in longs (32 bits), a LINEINC of 10000
X * lets us have > 200,000 lines and we won't have to renumber very often.
X */
X#define	LINEINC	10000
X
X#define CHANGED    Changed = TRUE
X#define UNCHANGED  Changed = FALSE
X
X#define S_NOT_VALID NumLineSizes = -1
X
X#define S_LINE_NOT_VALID LineNotValid = TRUE
X
X#define S_CHECK_TOPCHAR_AND_BOTCHAR CheckTopcharAndBotchar = TRUE
X
X#define S_MUST_UPDATE_BOTCHAR MustUpdateBotchar = TRUE
X
X#define S_VALID_TO_CURSCHAR ValidToCurschar = TRUE
X
Xstruct line {
X    struct line    *next;	/* next line */
X    struct line    *prev;	/* previous line */
X    char           *s;		/* text for this line */
X    int             size;	/* actual size of space at 's' */
X    unsigned long   num;	/* line "number" */
X};
X
X#define	LINEOF(x)	((x)->linep->num)
X
Xstruct lptr {
X    struct line    *linep;	/* line we're referencing */
X    int             index;	/* position within that line */
X};
X
Xtypedef struct line LINE;
Xtypedef struct lptr LPtr;
X
Xstruct charinfo {
X    char            ch_size;
X    char           *ch_str;
X};
X
Xextern struct charinfo chars[];
X
Xextern int      State;
Xextern int      Rows;
Xextern int      Columns;
Xextern int      CheckTopcharAndBotchar;
Xextern int      MustUpdateBotchar;
Xextern int      ValidToCurschar;
Xextern int      LineNotValid;
Xextern int      NumLineSizes;
Xextern LINE   **LinePointers;
Xextern char    *LineSizes;
Xextern char    *Filename;
Xextern LPtr    *Filemem;
Xextern LPtr    *Filetop;
Xextern LPtr    *Fileend;
Xextern LPtr    *Topchar;
Xextern LPtr    *Botchar;
Xextern LPtr    *Curschar;
Xextern LPtr    *Insstart;
Xextern int      Cursrow, Curscol, Cursvcol, Curswant;
Xextern bool_t   set_want_col;
Xextern int      Prenum;
Xextern bool_t   Changed;
Xextern bool_t   RedrawingDisabled;
Xextern bool_t   UndoInProgress;
Xextern bool_t   Binary;
Xextern char    *IObuff;
Xextern char    *Insbuffptr;
Xextern char    *Insbuff;
Xextern char    *Readbuffptr;
Xextern char    *Readbuff;
Xextern char    *Redobuffptr;
Xextern char    *Redobuff;
Xextern char    *Undobuffptr;
Xextern char    *Undobuff;
Xextern char    *UndoUndobuffptr;
Xextern char    *UndoUndobuff;
Xextern char    *Yankbuffptr;
Xextern char    *Yankbuff;
Xextern char     last_command;
Xextern char     last_command_char;
X
Xextern char    *strcpy();
X
X/* alloc.c */
Xchar  *alloc();
Xchar  *strsave();
Xvoid   screenalloc();
Xvoid   filealloc();
Xvoid   freeall();
XLINE  *newline();
Xbool_t canincrease();
X
X/* cmdline.c */
Xvoid   readcmdline();
Xvoid   dotag();
Xvoid   msg();
Xvoid   emsg();
Xvoid   smsg();
Xvoid   gotocmdline();
Xvoid   wait_return();
X
X/* dec.c */
Xint    dec();
X
X/* edit.c */
Xvoid   edit();
Xvoid   insertchar();
Xvoid   getout();
Xvoid   scrollup();
Xvoid   scrolldown();
Xvoid   beginline();
Xbool_t oneright();
Xbool_t oneleft();
Xbool_t oneup();
Xbool_t onedown();
X
X/* fileio.c */
Xvoid   filemess();
Xvoid   renum();
Xbool_t readfile();
Xbool_t writeit();
X
X/* s_io.c */
Xvoid   s_clear();
Xvoid   s_refresh();
Xvoid   NotValidFromCurschar();
Xvoid   Update_Botchar();
X
X/* help.c */
Xbool_t help();
X
X/* inc.c */
Xint    inc();
X
X/* linefunc.c */
XLPtr  *nextline();
XLPtr  *prevline();
Xvoid   coladvance();
X
X/* main.c */
Xvoid   stuffReadbuff();
Xvoid   stuffnumReadbuff();
Xchar   vgetc();
Xchar   vpeekc();
X
X/* mark.c */
Xvoid   setpcmark();
Xvoid   clrall();
Xvoid   clrmark();
Xbool_t setmark();
XLPtr  *getmark();
X
X/* misccmds.c */
Xbool_t OpenForward();
Xbool_t OpenBackward();
Xvoid   fileinfo();
Xvoid   inschar();
Xvoid   insstr();
Xvoid   delline();
Xbool_t delchar();
Xint    cntllines();
Xint    plines();
XLPtr  *gotoline();
X
X/* normal.c */
Xvoid   normal();
Xvoid   ResetBuffers();
Xvoid   AppendToInsbuff();
Xvoid   AppendToRedobuff();
Xvoid   AppendNumberToRedobuff();
Xvoid   AppendToUndobuff();
Xvoid   AppendNumberToUndobuff();
Xvoid   AppendPositionToUndobuff();
Xvoid   AppendToUndoUndobuff();
Xvoid   AppendNumberToUndoUndobuff();
Xvoid   AppendPositionToUndoUndobuff();
Xbool_t linewhite();
X
X/* mk.c */
Xchar  *mkstr();
Xchar  *mkline();
X
X/* param.c */
Xvoid   doset();
X
X/* screen.c */
Xvoid   cursupdate();
X
X/* search.c */
Xvoid   doglob();
Xvoid   dosub();
Xvoid   searchagain();
Xbool_t dosearch();
Xbool_t repsearch();
Xbool_t searchc();
Xbool_t crepsearch();
Xbool_t findfunc();
XLPtr  *showmatch();
XLPtr  *fwd_word();
XLPtr  *bck_word();
XLPtr  *end_word();
X
X/* format_l.c */
Xchar *format_line();
X
X/*
X * Machine-dependent routines. 
X */
X#ifdef AMIGA
X# include "amiga.h"
X#endif
X#ifdef BSD
X# include "bsd.h"
X#endif
X#ifdef UNIX
X# include "unix.h"
X#endif
X#ifdef TOS
X# include "tos.h"
X#endif
X#ifdef OS2
X# include "os2.h"
X#endif
X#ifdef DOS
X# include "dos.h"
X#endif
SHAR_EOF
echo "extracting tags"
sed 's/^X//' << \SHAR_EOF > tags
XISSPECIAL	edit.c	/^#define ISSPECIAL(c)    ((c) == BS || (c) == NL ||/
Xalloc	alloc.c	/^alloc(size)$/
Xbadcmd	cmdline.c	/^badcmd()$/
Xbeginline	edit.c	/^beginline(flag)$/
Xcanincrease	alloc.c	/^canincrease(n)$/
Xdec	dec.c	/^dec(lp)$/
Xdoecmd	cmdline.c	/^doecmd(arg)$/
Xdoshell	cmdline.c	/^doshell()$/
Xdotag	cmdline.c	/^dotag(tag, force)$/
Xedit	edit.c	/^edit()$/
Xemsg	cmdline.c	/^emsg(s)$/
Xfilealloc	alloc.c	/^filealloc()$/
Xfreeall	alloc.c	/^freeall()$/
Xget_line	cmdline.c	/^get_line(cp)$/
Xget_range	cmdline.c	/^get_range(cp)$/
Xgetout	edit.c	/^getout(r)$/
Xgotocmdline	cmdline.c	/^gotocmdline(clr, firstc)$/
Xinsertchar	edit.c	/^insertchar(c)$/
Xmsg	cmdline.c	/^msg(s)$/
Xnewline	alloc.c	/^newline(nchars)$/
Xonedown	edit.c	/^onedown(n)$/
Xoneleft	edit.c	/^oneleft()$/
Xoneright	edit.c	/^oneright()$/
Xoneup	edit.c	/^oneup(n)$/
Xreadcmdline	cmdline.c	/^readcmdline(firstc, cmdline)$/
Xscreenalloc	alloc.c	/^screenalloc()$/
Xscrolldown	edit.c	/^scrolldown(nlines)$/
Xscrollup	edit.c	/^scrollup(nlines)$/
Xsmsg	cmdline.c	/^smsg(s, a1, a2, a3, a4, a5, a6, a7, a8, a9)$/
Xstrsave	alloc.c	/^strsave(string)$/
Xwait_return	cmdline.c	/^wait_return()$/
XMmain	main.c	/^main(argc, argv)$/
Xclrall	mark.c	/^clrall()$/
Xclrmark	mark.c	/^clrmark(line)$/
Xcoladvance	linefunc.c	/^coladvance(p, want_col)$/
Xfilemess	fileio.c	/^filemess(s)$/
Xgetmark	mark.c	/^getmark(c)$/
Xhelp	help.c	/^help()$/
Xinc	inc.c	/^inc(lp)$/
Xlongline	help.c	/^longline(p)$/
Xnextline	linefunc.c	/^nextline(curr)$/
Xprevline	linefunc.c	/^prevline(curr)$/
Xreadfile	fileio.c	/^readfile(fname, fromp, nochangename)$/
Xrenum	fileio.c	/^renum()$/
Xsetmark	mark.c	/^setmark(c)$/
Xsetpcmark	mark.c	/^setpcmark()$/
XstuffReadbuff	main.c	/^stuffReadbuff(s)$/
XstuffnumReadbuff	main.c	/^stuffnumReadbuff(n)$/
Xusage	main.c	/^usage()$/
Xvgetc	main.c	/^vgetc()$/
Xvpeekc	main.c	/^vpeekc()$/
Xwriteit	fileio.c	/^writeit(fname, start, end)$/
XAppendNumberToRedobuff	normal.c	/^AppendNumberToRedobuff(n)$/
XAppendNumberToUndoUndobuff	normal.c	/^AppendNumberToUndoUndobuff(n)$/
XAppendNumberToUndobuff	normal.c	/^AppendNumberToUndobuff(n)$/
XAppendPositionToUndoUndobuff	normal.c	/^AppendPositionToUndoUndobuff(column, row)$/
XAppendPositionToUndobuff	normal.c	/^AppendPositionToUndobuff(column, row)$/
XAppendToInsbuff	normal.c	/^AppendToInsbuff(s)$/
XAppendToRedobuff	normal.c	/^AppendToRedobuff(s)$/
XAppendToUndoUndobuff	normal.c	/^AppendToUndoUndobuff(s)$/
XAppendToUndobuff	normal.c	/^AppendToUndobuff(s)$/
XDEFAULT1	normal.c	/^#define DEFAULT1(x)     (((x) == 0) ? 1 : (x))$/
XIDCHAR	normal.c	/^#define IDCHAR(c)       (isalpha(c) || isdigit(c) /
XOpenBackward	misccmds.c	/^OpenBackward(can_ai)$/
XOpenForward	misccmds.c	/^OpenForward(can_ai)$/
XResetBuffers	normal.c	/^ResetBuffers()$/
Xcntllines	misccmds.c	/^cntllines(pbegin, pend)$/
Xcursupdate	screen.c	/^cursupdate(type)$/
Xdelchar	misccmds.c	/^delchar(fixpos, undo)$/
Xdelline	misccmds.c	/^delline(nlines)$/
Xdochange	normal.c	/^dochange()$/
Xdodelete	normal.c	/^dodelete(redraw, setup_for_undo, try_to_yank)$/
Xdojoin	normal.c	/^dojoin(leading_space, strip_leading_spaces)$/
Xdoput	normal.c	/^doput(dir)$/
Xdoset	param.c	/^doset(arg, inter)$/
Xdoshift	normal.c	/^doshift(op)$/
Xdoyank	normal.c	/^doyank()$/
Xfileinfo	misccmds.c	/^fileinfo()$/
Xgotoline	misccmds.c	/^gotoline(n)$/
Xinschar	misccmds.c	/^inschar(c)$/
Xinsstr	misccmds.c	/^insstr(s)$/
Xlinewhite	normal.c	/^linewhite(p)$/
Xnormal	normal.c	/^normal(c)$/
Xplines	misccmds.c	/^plines(s)$/
Xshowparms	param.c	/^showparms(all)$/
Xstartinsert	normal.c	/^startinsert(startln)$/
Xtabinout	normal.c	/^tabinout(shift_type, num)$/
Xupdateline	screen.c	/^updateline()$/
XC0	search.c	/^#define C0(c)   (((c) == ' ') || ((c) == '\\t') || /
XC1	search.c	/^#define C1(c)   (isalpha(c) || isdigit(c) || ((c) /
XOTHERDIR	search.c	/^#define OTHERDIR(x)     (((x) == FORWARD) ? BACKWA/
Xbck_word	search.c	/^bck_word(p, type)$/
Xbcksearch	search.c	/^bcksearch(str)$/
Xcls	search.c	/^cls(c)$/
Xcrepsearch	search.c	/^crepsearch(flag)$/
Xdoglob	search.c	/^doglob(lp, up, cmd)$/
Xdosearch	search.c	/^dosearch(dir, str)$/
Xdosub	search.c	/^dosub(lp, up, cmd)$/
Xend_word	search.c	/^end_word(p, type)$/
Xfindfunc	search.c	/^findfunc(dir)$/
Xformat_line	format_l.c	/^format_line(ptr, len)$/
Xfwd_word	search.c	/^fwd_word(p, type)$/
Xfwdsearch	search.c	/^fwdsearch(str)$/
Xmapstring	search.c	/^mapstring(s)$/
Xregerror	search.c	/^regerror(s)$/
Xrepsearch	search.c	/^repsearch(flag)$/
Xsearchagain	search.c	/^searchagain(dir)$/
Xsearchc	search.c	/^searchc(c, dir, type)$/
Xshowmatch	search.c	/^showmatch()$/
Xssearch	search.c	/^ssearch(dir, str)$/
XCTRL	ascii.h	/^#define	CTRL(x)	((x) & 0x1f)$/
XNotValidFromCurschar	s_io.c	/^NotValidFromCurschar()$/
XUpdate_Botchar	s_io.c	/^Update_Botchar()$/
Xs_clear	s_io.c	/^s_clear()$/
Xs_refresh	s_io.c	/^s_refresh(type)$/
Xscreen_del	s_io.c	/^screen_del(row, nlines, total_rows)$/
Xscreen_ins	s_io.c	/^screen_ins(row, nlines, total_rows)$/
Xscreen_refresh	s_io.c	/^screen_refresh(type)$/
XLINE	stevie.h	131
XLINEOF	stevie.h	/^#define	LINEOF(x)	((x)->linep->num)$/
XLPtr	stevie.h	132
XP	param.h	/^#define	P(n)	(params[n].value)$/
XRowNumber	macros.h	/^#define RowNumber(p) (UndoInProgress ? 0 : cntllin/
Xanyinput	macros.h	/^#define anyinput() (Readbuffptr != NULL)$/
Xbool_t	stevie.h	54
Xbuf1line	macros.h	/^#define buf1line() (Filemem->linep->next == Fileen/
Xbufempty	macros.h	/^#define bufempty() (buf1line() && Filemem->linep->/
Xendofline	macros.h	/^#define endofline(p) \\$/
Xequal	macros.h	/^#define equal(a, b) (((a)->linep == (b)->linep) &&/
Xgchar	macros.h	/^#define gchar(lp) ((lp)->linep->s[(lp)->index])$/
Xgt	macros.h	/^#define gt(a, b) ((LINEOF(a) != LINEOF(b)) \\$/
Xgtoreq	macros.h	/^#define gtoreq(a, b) ((LINEOF(a) != LINEOF(b)) \\$/
Xlineempty	macros.h	/^#define lineempty(p) ((p)->linep->s[0] == NUL)$/
Xlt	macros.h	/^#define lt(a, b) ((LINEOF(a) != LINEOF(b)) \\$/
Xltoreq	macros.h	/^#define ltoreq(a, b) ((LINEOF(a) != LINEOF(b)) \\$/
Xmkline	mk.c	/^mkline(n)$/
Xmkstr	mk.c	/^mkstr(c)$/
Xpchar	macros.h	/^#define pchar(lp, c) ((lp)->linep->s[(lp)->index] /
Xpswap	macros.h	/^#define pswap(a, b) { LPtr pswaptmp; pswaptmp = a;/
Xstartofline	macros.h	/^#define startofline(p) ((p)->index == 0)$/
XGetCharacter	amiga.c	/^GetCharacter()$/
XSendPacket	amiga.c	/^SendPacket(pid, action, args, nargs)$/
Xbeep	amiga.c	/^beep()$/
Xcooked	amiga.c	/^cooked(afh)$/
Xdelay	amiga.c	/^delay()$/
Xflushbuf	amiga.c	/^flushbuf()$/
Xfopenb	amiga.c	/^fopenb(fname, mode)$/
XgetCSIsequence	amiga.c	/^getCSIsequence()$/
Xget_ConUnit	amiga.c	/^get_ConUnit(afh)$/
Xinchar	amiga.c	/^inchar()$/
Xoutchar	amiga.c	/^outchar(c)$/
Xoutstr	amiga.c	/^outstr(s)$/
Xraw	amiga.c	/^raw(afh)$/
Xsleep	amiga.c	/^sleep(n)$/
Xwindexit	amiga.c	/^windexit(r)$/
Xwindgoto	amiga.c	/^windgoto(r, c)$/
Xwindinit	amiga.c	/^windinit()$/
SHAR_EOF
echo "extracting term.h"
sed 's/^X//' << \SHAR_EOF > term.h
X/*
X * STEVIE - Simply Try this Editor for VI Enthusiasts
X *
X * Code Contributions By : Tim Thompson           twitch!tjt
X *                         Tony Andrews           onecom!wldrdg!tony 
X *                         G. R. (Fred) Walter    watmath!watcgl!grwalter 
X */
X
X/*
X * This file contains the machine dependent escape sequences that the editor
X * needs to perform various operations. Some of the sequences here are
X * optional. Anything not available should be indicated by a null string.
X *
X * Insert/delete line sequences are necessary.
X */
X
X/*
X * The macro names here correspond (more or less) to the actual ANSI names 
X */
X
X#ifdef	ATARI
X#define	T_ED	"\033E"		/* erase display (may optionally home cursor) */
X#define	T_EL	"\033l"		/* erase the entire current line */
X#define	T_IL	"\033L"		/* insert one line */
X#define	T_DL	"\033M"		/* delete one line */
X#define	T_CI	"\033f"		/* invisible cursor (very optional) */
X#define	T_CV	"\033e"		/* visible cursor (very optional) */
X#define T_TP    ""		/* plain text */
X#define T_TI    ""		/* inverse-video text */
X#endif
X
X#ifdef	UNIX
X/* The UNIX sequences are hard-wired for ansi-like terminals. */
X#define	T_ED	"\033[2J"	/* erase display (may optionally home cursor) */
X#define	T_END_D	"\033[J"	/* erase to end of display */
X#define	T_EL	"\033[2K"	/* erase the entire current line */
X#define	T_END_L	"\033[K"	/* erase to the end of the current line */
X#define	T_IL	"\033[L"	/* insert one line */
X#define	T_DL	"\033[M"	/* delete one line */
X#define	T_CI	""		/* invisible cursor (very optional) */
X#define	T_CV	""		/* visible cursor (very optional) */
X#define T_TP    ""		/* plain text */
X#define T_TI    ""		/* inverse-video text */
X#endif
X
X#ifdef	BSD
X/* The BSD 4.3 sequences are hard-wired for ansi-like terminals. */
X#define	T_ED	"\033[2J"	/* erase display (may optionally home cursor) */
X#define	T_END_D	"\033[J"	/* erase to end of display */
X#define	T_EL	"\033[2K"	/* erase the entire current line */
X#define	T_END_L	"\033[K"	/* erase to the end of the current line */
X#define	T_IL	"\033[L"	/* insert line */
X#define	T_DL	"\033[M"	/* delete line */
X#define	T_CI	""		/* invisible cursor */
X#define	T_CV	""		/* visible cursor */
X#define T_TP    "\033[m"	/* plain text */
X#define T_TI    "\033[7m"	/* inverse-video text */
X#endif
X
X#ifdef	OS2
X/*
X * The OS/2 ansi console driver is pretty deficient. No insert or delete line
X * sequences. The erase line sequence only erases from the cursor to the end
X * of the line. For our purposes that works out okay, since the only time
X * T_EL is used is when the cursor is in column 0.
X *
X * The insert/delete line sequences marked here are actually implemented in
X * the file os2.c using direct OS/2 system calls. This makes the capability
X * available for the rest of the editor via appropriate escape sequences
X * passed to outstr().
X */
X#define	T_ED	"\033[2J"	/* erase display (may optionally home cursor) */
X#define	T_EL	"\033[K"	/* erase the entire current line */
X#define	T_END_L	"\033[K"	/* erase to the end of the current line */
X#define	T_IL	"\033[L"	/* insert one line - fake (see os2.c) */
X#define	T_DL	"\033[M"	/* delete one line - fake (see os2.c) */
X#define	T_CI	""		/* invisible cursor (very optional) */
X#define	T_CV	""		/* visible cursor (very optional) */
X#define T_TP    ""		/* plain text */
X#define T_TI    ""		/* inverse-video text */
X#endif
X
X#ifdef AMIGA
X/*
X * The erase line sequence only erases from the cursor to the end of the
X * line. For our purposes that works out okay, since the only time T_EL is
X * used is when the cursor is in column 0. 
X */
X#define	T_ED	"\014"		/* erase display (may optionally home cursor) */
X#define	T_END_D	"\033[J"	/* erase to end of display */
X#define	T_EL	"\033[K"	/* erase the entire current line */
X#define	T_END_L	"\033[K"	/* erase to the end of the current line */
X#define	T_IL	"\033["		/* insert line */
X#define	T_IL_B	"L"
X#define	T_DL	"\033["		/* delete line */
X#define	T_DL_B	"M"
X#define	T_CI	"\033[0 p"	/* invisible cursor (very optional) */
X#define	T_CV	"\033[1 p"	/* visible cursor (very optional) */
X#define T_TP    "\033[0m"	/* plain text */
X#define T_TI    "\033[7m"	/* inverse-video text */
X#endif
X
X#ifdef	DOS
X/*
X * DOS sequences
X *
X * Some of the following sequences require the use of the "nansi.sys"
X * console driver. The standard "ansi.sys" driver doesn't support
X * sequences for insert/delete line.
X */
X#define	T_ED	"\033[2J"	/* erase display (may optionally home cursor) */
X#define	T_EL	"\033[K"	/* erase the entire current line */
X#define	T_IL	"\033[L"	/* insert line (requires nansi.sys driver) */
X#define	T_DL	"\033[M"	/* delete line (requires nansi.sys driver) */
X#define	T_CI	""		/* invisible cursor (very optional) */
X#define	T_CV	""		/* visible cursor (very optional) */
X#define T_TP    ""		/* plain text */
X#define T_TI    ""		/* inverse-video text */
X#endif
SHAR_EOF
echo "extracting tos.c"
sed 's/^X//' << \SHAR_EOF > tos.c
X/*
X * System-dependent routines for the Atari ST. 
X */
X
X#include "stevie.h"
X
X#include <osbind.h>
X
X/*
X * The following buffer is used to work around a bug in TOS. It appears that
X * unread console input can cause a crash, but only if console output is
X * going on. The solution is to always grab any unread input before putting
X * out a character. The following buffer holds any characters read in this
X * fashion. The problem can be easily produced because STEVIE can't yet keep
X * up with the normal auto-repeat rate in insert mode. 
X */
X#define IBUFSZ  128
X
Xstatic long     inbuf[IBUFSZ];	/* buffer for unread input */
Xstatic long    *inptr = inbuf;	/* where to put next character */
X
X/*
X * inchar() - get a character from the keyboard 
X *
X * Certain special keys are mapped to values above 0x80. These mappings are
X * defined in keymap.h. If the key has a non-zero ascii value, it is simply
X * returned. Otherwise it may be a special key we want to map. 
X *
X * The ST has a bug involving keyboard input that seems to occur when typing
X * quickly, especially typing capital letters. Sometimes a value of
X * 0x02540000 is read. This doesn't correspond to anything on the keyboard,
X * according to my documentation. My solution is to loop when any unknown key
X * is seen. Normally, the bell is rung to indicate the error. If the "bug"
X * value is seen, we ignore it completely. 
X */
Xint
Xinchar()
X{
X    for (;;) {
X	long            c, *p;
X
X	/*
X	 * Get the next input character, either from the input buffer or
X	 * directly from TOS. 
X	 */
X	if (inptr != inbuf) {	/* input in the buffer, use it */
X	    c = inbuf[0];
X	    /*
X	     * Shift everything else in the buffer down. This would be
X	     * cleaner if we used a circular buffer, but it really isn't
X	     * worth it. 
X	     */
X	    inptr--;
X	    for (p = inbuf; p < inptr; p++)
X		*p = *(p + 1);
X	} else
X	    c = Crawcin();
X
X	if ((c & 0xff) != 0)
X	    return ((int) c);
X
X	switch ((int) (c >> 16) & 0xff) {
X
X	  case 0x62:
X	    return K_HELP;
X	  case 0x61:
X	    return K_UNDO;
X	  case 0x52:
X	    return K_INSERT;
X	  case 0x47:
X	    return K_HOME;
X	  case 0x48:
X	    return K_UARROW;
X	  case 0x50:
X	    return K_DARROW;
X	  case 0x4b:
X	    return K_LARROW;
X	  case 0x4d:
X	    return K_RARROW;
X	  case 0x29:
X	    return K_CGRAVE;	/* control grave accent */
X	    /*
X	     * Occurs due to a bug in TOS. 
X	     */
X	  case 0x54:
X	    break;
X	    /*
X	     * Add the function keys here later if we put in support for
X	     * macros. 
X	     */
X	  default:
X	    beep();
X	    break;
X	}
X    }
X}
X/*
X * get_inchars - snarf away any pending console input 
X *
X * If the buffer overflows, we discard what's left and ring the bell. 
X */
Xstatic void
Xget_inchars()
X{
X    while (Cconis()) {
X	if (inptr >= &inbuf[IBUFSZ]) {	/* no room in buffer? */
X	    Crawcin();		/* discard the input */
X	    beep();		/* and sound the alarm */
X	} else
X	    *inptr++ = Crawcin();
X    }
X}
X
Xvoid
Xoutchar(c)
X    char            c;
X{
X    get_inchars();
X    Cconout(c);
X}
X
Xvoid
Xoutstr(s)
X    char           *s;
X{
X    get_inchars();
X    Cconws(s);
X}
X
X#define BGND    0
X#define TEXT    3
X
X/*
X * vbeep() - visual bell 
X */
Xstatic void
Xvbeep()
X{
X    int             text, bgnd;	/* text and background colors */
X    long            l;
X
X    text = Setcolor(TEXT, -1);
X    bgnd = Setcolor(BGND, -1);
X
X    Setcolor(TEXT, bgnd);	/* swap colors */
X    Setcolor(BGND, text);
X
X    for (l = 0; l < 5000; l++);	/* short pause */
X
X    Setcolor(TEXT, text);	/* restore colors */
X    Setcolor(BGND, bgnd);
X}
X
Xvoid
Xbeep()
X{
X    if (RedrawingDisabled)
X	return;
X
X    if (P(P_VB))
X	vbeep();
X    else
X	outchar('\007');
X}
X
X/*
X * remove(file) - remove a file 
X */
Xvoid
Xremove(file)
X    char           *file;
X{
X    Fdelete(file);
X}
X
X/*
X * rename(of, nf) - rename existing file 'of' to 'nf' 
X */
Xvoid
Xrename(of, nf)
X    char           *of, *nf;
X{
X    Fdelete(nf);		/* if 'nf' exists, remove it */
X    Frename(0, of, nf);
X}
X
Xvoid
Xwindinit()
X{
X    if (Getrez() == 0)
X	Columns = 40;		/* low resolution */
X    else
X	Columns = 80;		/* medium or high */
X
X    P(P_LI) = Rows = 25;
X
X    Cursconf(1, NULL);
X}
X
Xvoid
Xwindexit(r)
X    int             r;
X{
X    exit(r);
X}
X
Xvoid
Xwindgoto(r, c)
X    int             r, c;
X{
X    outstr("\033Y");
X    outchar(r + 040);
X    outchar(c + 040);
X}
X
X#ifndef MWC
X/*
X * System calls or library routines missing in TOS. 
X */
X
Xvoid
Xsleep(n)
X    int             n;
X{
X    int             k;
X
X    k = Tgettime();
X    while (Tgettime() <= k + n);
X}
X#endif
X
Xvoid
Xdelay()
X{
X    long            n;
X
X    for (n = 0; n < 8000; n++);
X}
X
X#ifndef MWC
Xint
Xsystem(cmd)
X    char           *cmd;
X{
X    char            arg[1];
X
X    arg[0] = (char) 0;		/* no arguments passed to the shell */
X
X    if (Pexec(0, cmd, arg, 0L) < 0)
X	return -1;
X    else
X	return 0;
X}
X#endif
X
X#ifdef  MEGAMAX
Xchar           *
Xstrchr(s, c)
X    char           *s;
X    int             c;
X{
X    do {
X	if (*s == c)
X	    return (s);
X    } while (*s++);
X    return (NULL);
X}
X#endif
X
X#ifdef  FOPENB
X
XFILE           *
Xfopenb(fname, mode)
X    char           *fname;
X    char           *mode;
X{
X    char            modestr[10];
X
X    sprintf(modestr, "b%s", mode);
X
X    return fopen(fname, modestr);
X}
X
X#endif
X
X#ifndef MWC
X/*
X * getenv() - get a string from the environment 
X *
X * Both Alcyon and Megamax are missing getenv(). This routine works for both
X * compilers and with the Beckemeyer and Gulam shells. With gulam, the
X * env_style variable should be set to either "mw" or "gu". 
X */
Xchar           *
Xgetenv(name)
X    char           *name;
X{
X    extern long     _base;
X    char           *envp, *p;
X
X    envp = *((char **) (_base + 0x2c));
X
X    for (; *envp; envp += strlen(envp) + 1) {
X	if (strncmp(envp, name, strlen(name)) == 0) {
X	    p = envp + strlen(name);
X	    if (*p++ == '=')
X		return p;
X	}
X    }
X    return (char *) 0;
X}
X#endif
SHAR_EOF
echo "extracting tos.h"
sed 's/^X//' << \SHAR_EOF > tos.h
X/*
X * Atari Machine-dependent routines. 
X */
X
Xint  inchar();
Xvoid outchar();
Xvoid outstr(), beep();
Xvoid remove(), rename();
Xvoid windinit(), windexit(), windgoto();
Xvoid delay();
Xvoid sleep();
SHAR_EOF
echo "extracting unix.c"
sed 's/^X//' << \SHAR_EOF > unix.c
X/*
X * System-dependent routines for UNIX System V Release 3. 
X */
X
X#include "stevie.h"
X/* #include <termio.h> /* System V */
X#include <curses.h>		/* BSD */
X
X/*
X * inchar() - get a character from the keyboard 
X */
Xint
Xinchar()
X{
X    char            c;
X
X    flushbuf();			/* flush any pending output */
X
X    while (read(0, &c, 1) != 1);
X
X    return (int) c;
X}
X
X#define BSIZE   2048
Xstatic char     outbuf[BSIZE];
Xstatic int      bpos = 0;
X
Xflushbuf()
X{
X    if (bpos != 0)
X	write(1, outbuf, bpos);
X    bpos = 0;
X}
X
X/*
X * Macro to output a character. Used within this file for speed. 
X */
X#define outone(c)       outbuf[bpos++] = c; if (bpos >= BSIZE) flushbuf()
X
X/*
X * Function version for use outside this file. 
X */
Xvoid
Xoutchar(c)
X    char            c;
X{
X    outbuf[bpos++] = c;
X    if (bpos >= BSIZE)
X	flushbuf();
X}
X
Xvoid
Xoutstr(s)
X    char           *s;
X{
X    while (*s) {
X	outone(*s++);
X    }
X}
X
Xvoid
Xbeep()
X{
X    if (RedrawingDisabled)
X	return;
X
X    outone('\007');
X}
X
X/*
X * remove(file) - remove a file 
X */
Xvoid
Xremove(file)
X    char           *file;
X{
X    unlink(file);
X}
X
X/*
X * rename(of, nf) - rename existing file 'of' to 'nf' 
X */
Xvoid
Xrename(of, nf)
X    char           *of, *nf;
X{
X    unlink(nf);
X    link(of, nf);
X    unlink(of);
X}
X
Xvoid
Xdelay()
X{
X    /* not implemented */
X}
X
Xstatic struct termio ostate;
X
Xvoid
Xwindinit()
X{
X    char           *getenv();
X    char           *term;
X    struct termio   nstate;
X
X    if ((term = getenv("TERM")) == NULL || strcmp(term, "vt100") != 0) {
X	fprintf(stderr, "Invalid terminal type '%s'\n", term);
X	exit(1);
X    }
X    Columns = 80;
X    P(P_LI) = Rows = 24;
X
X    /*
X     * Go into cbreak mode 
X     */
X    ioctl(0, TCGETA, &ostate);
X    nstate = ostate;
X    nstate.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL);
X    nstate.c_cc[VMIN] = 1;
X    nstate.c_cc[VTIME] = 0;
X    ioctl(0, TCSETAW, &nstate);
X}
X
Xvoid
Xwindexit(r)
X    int             r;
X{
X    /*
X     * Restore terminal modes 
X     */
X    ioctl(0, TCSETAW, &ostate);
X
X    exit(r);
X}
X
X#define outone(c)       outbuf[bpos++] = c; if (bpos >= BSIZE) flushbuf()
X
Xvoid
Xwindgoto(r, c)
X    int             r, c;
X{
X    r += 1;
X    c += 1;
X
X    /*
X     * Check for overflow once, to save time. 
X     */
X    if (bpos + 8 >= BSIZE)
X	flushbuf();
X
X    outbuf[bpos++] = '\033';
X    outbuf[bpos++] = '[';
X    if (r >= 10)
X	outbuf[bpos++] = r / 10 + '0';
X    outbuf[bpos++] = r % 10 + '0';
X    outbuf[bpos++] = ';';
X    if (c >= 10)
X	outbuf[bpos++] = c / 10 + '0';
X    outbuf[bpos++] = c % 10 + '0';
X    outbuf[bpos++] = 'H';
X}
X
XFILE           *
Xfopenb(fname, mode)
X    char           *fname;
X    char           *mode;
X{
X    return fopen(fname, mode);
X}
SHAR_EOF
echo "extracting unix.h"
sed 's/^X//' << \SHAR_EOF > unix.h
X/*
X * Unix Machine-dependent routines. 
X */
X
Xint  inchar();
Xvoid outchar();
Xvoid outstr(), beep();
Xvoid remove(), rename();
Xvoid windinit(), windexit(), windgoto();
Xvoid delay();
SHAR_EOF
echo "extracting version.c"
sed 's/^X//' << \SHAR_EOF > version.c
X/*
X * STEVIE - Simply Try this Editor for VI Enthusiasts
X *
X * Code Contributions By : Tim Thompson           twitch!tjt
X *                         Tony Andrews           onecom!wldrdg!tony 
X *                         G. R. (Fred) Walter    watmath!watcgl!grwalter 
X */
X
X/*
X * Version  Changes (and person who did them)
X * -------  ---------------------------------
X * 3.10     - version that started it all. Found on comp.sources.unix
X *            Jun88 Volume 15 i037, i038, i039, i040, i042, and INF3
X *          - Tim Thompson and Tony Andrews
X * 
X * 3.10A    - took version of STEVIE posted to usenet and added Amiga
X *            and BSD support; added undo and redo commands; sped up
X *            output to screen; sped up on-screen activities (such as
X *            cursoring); fixed miscellaneous small bugs and changed some
X *            commands so that they more closely resembled vi.
X *          - GRWalter (Fred)
X * 
X * 3.11B    - added the ability to be run in the background (STEVIE will
X *            attempt to use the current window, but if it can't then it
X *            will open its own window). Fixed some other miscellaneous
X *            bugs (some to do with re-sizing the screen, one to do with
X *            undo'ing changes on lines that start with whitespace).
X *          - GRWalter (Fred)
X * 
X * 3.11C    - fixed a bug that was causing the entire screen to be refreshed
X *            at the wrong times sometimes. Input mode was sped up as well
X *            as a bug involving lines that wrapped was fixed. Changed :ta
X *            a bit. Fixed bug triggered when files are > 6000 lines.
X *          - GRWalter (Fred)
X *
X * 3.31A    - Tony Andrews put out a divergent version of STEVIE (version 3.31).
X *            I moved the important stuff over into my version.
X *
X *            Here is a list of what was moved over :
X * 
X *************************************************************************
X * Revision 3.29  88/06/26  14:53:19  tony
X * Added support for a simple form of the "global" command. It supports
X * commands of the form "g/pat/d" or "g/pat/p", to delete or print lines
X * that match the given pattern. A range spec may be used to limit the
X * lines to be searched.
X * 
X * Revision 3.28  88/06/25  21:44:22  tony
X * Fixed a problem in the processing of colon commands that caused
X * substitutions of patterns containing white space to fail.
X * 
X * Revision 3.26  88/06/10  13:44:06  tony
X * Fixed a bug involving writing out files with long pathnames. A small
X * fixed size buffer was being used. The space for the backup file name
X * is now allocated dynamically.
X * 
X * Revision 1.12  88/05/03  14:39:52  tony
X * Also merged in support for DOS.
X * 
X * Revision 1.11  88/05/02  21:38:21  tony
X * The code that reads files now handles boundary/error conditions much
X * better, and generates status/error messages that are compatible with
X * the real vi. Also fixed a bug in repeated reverse searches that got
X * inserted in the recent changes to search.c.
X * 
X * Revision 1.10  88/05/02  07:35:41  tony
X * Fixed a bug in the routine plines() that was introduced during changes
X * made for the last version.
X * 
X * Revision 1.9  88/05/01  20:10:19  tony
X * Fixed some problems with auto-indent, and added support for the "number"
X * parameter.
X * 
X * Revision 1.8  88/04/30  20:00:49  tony
X * Added support for the auto-indent feature.
X * 
X * Revision 1.6  88/04/28  08:19:35  tony
X * Modified Henry Spencer's regular expression library to support new
X * features that couldn't be done easily with the existing interface.
X * This code is now a direct part of the editor source code. The editor
X * now supports the "ignorecase" parameter, and multiple substitutions
X * per line, as in "1,$s/foo/bar/g".
X * 
X * Revision 1.5  88/04/24  21:38:00  tony
X * Added preliminary support for the substitute command. Full range specs.
X * are supported, but only a single substitution is allowed on each line.
X * 
X * Revision 1.4  88/04/23  20:41:01  tony
X * Worked around a problem with adding lines to the end of the buffer when
X * the cursor is at the bottom of the screen (in misccmds.c). Also fixed a
X * bug that caused reverse searches from the start of the file to bomb.
X * 
X * Revision 1.3  88/03/24  08:57:00  tony
X * Fixed a bug in cmdline() that had to do with backspacing out of colon
X * commands or searches. Searches were okay, but colon commands backed out
X * one backspace too early.
X * 
X * Revision 1.2  88/03/21  16:47:55  tony
X * Fixed a bug in renum() causing problems with large files (>6400 lines).
X *************************************************************************
X *          - GRWalter (Fred)
X *
X * 3.32A    - added the :[range]d command. Played with 'p' and 'P'.
X *            Added undo capability to :s and :g//d commands.
X *            Added '%' as a line range specifier (entire file).
X *            Fixed search so that tags file from real ctags could be used.
X *            Fixed undo after delete everything operation.
X *            Made prt_line work in nu mode (so :g//p works right).
X *            Fixed ai mode (when there was text after the cursor it didn't ai).
X *            Fixed 'J' (didn't handle next line just having whitespace).
X *            Fixed :[range] so it behaves like the real vi (goes to highest
X *            line number in the given range).
X *            Made it so that the cursor is on the last char inserted instead
X *            the one right after when there is exactly 1 char right after.
X *            Made change operator work properly when it ended on the
X *            end of the line.
X *          - GRWalter (Fred)
X *
X * 3.33A    - no longer s_refresh when putting or undoing or
X *            redoing until I am done. 'p', 'u' and '.' thus sped up.
X *          - no longer recalculate line lengths when cursupdate() called,
X *            which speeds up lots'a things (like on-screen cursoring).
X *          - avoid redrawing (in s_refresh) as much as possible, which
X *            speeds up (among other things) cursoring (off screen), put, undo,
X *            redo, etc.
X *          - GRWalter (Fred)
X *
X * 3.34A    - rewrote s_refresh and updatenextline so they won't do as
X *            much work. Sped up cursoring off-screen. Fixed bug in cursupdate
X *            (could index through NULL pointer).
X *          - GRWalter (Fred)
X *
X * 3.35A    - Compiles with Lattice 5.0 now - needed miscellaneous changes.
X *          - Environment variables (EXINIT) finally used.
X *          - Stevie is now compiled so it's residentable.
X *          - Fixed bug in insstr() (caused problems with redo of inserts).
X *          - Fixed buffer overflow/corrupt messages.
X *          - Tweaked s_refresh routine some more.
X *          - Added __DATE__ and __TIME__ of compilation to help screen.
X *          - GRWalter (Fred)
X *
X * 3.35F    - Removed Nextscreen, Realscreen, updateRealscreen and
X *          - redrawline. Re-wrote all screen I/O to directly update the
X *          - screen when necessary, with a resulting memory and speed savings.
X *          - Fixed bug in amiga.c that caused Stevie to (occasionlly) lock-up
X *            upon startup until the window was resized.
X *          - Removed T_SC and T_RC from term.h file (no longer used).
X *          - Miscellaneous little changes.
X *          - GRWalter (Fred)
X *
X * 3.35H    - Fixed all routines to check memory allocation return status
X *            (except for strsave() function).
X *          - Fixed bug with macro outone() in amiga.c and bsd.c.
X *          - GRWalter (Fred)
X *
X * 3.6      - Big jump in revision number to do last version on a Fish Disk
X *            being descibed as version 3.5 (thus people will know this is
X *            a later version).
X *          - Miscellaneous little changes.
X *          - GRWalter (Fred)
X */
X
Xchar           *Version = "STEVIE - Version 3.6";
SHAR_EOF
echo "End of archive 6 (of 6)"
# if you want to concatenate archives, remove anything after this line
exit