AUSAM/source/S/em.h

Compare this file to the similar file:
Show the results in this format:

/*
 * Unix 6
 * Editor
 *
 */

/* Mods: George Coulouris (QMC)
 *	March, 76
 *
 *	prompts (suppress with `-p' flag)
 *	", %, &, to display a screen full of context
 *	`x' - as `s' but interactive
 *	`n' flag when appended to `s' or `x' commands
 *		prints number of replacements
 *	% == current file name in ! commands
 *	!! == repeat the last ! command you executed
 *	-e flag == "elfic" mode :-
 *		no "w", "r\n" commands, auto w before q
 *	`o' command for text input with local editing via control keys
 *	`b' to set a threshold for automatic line breaks in `o' mode.
 *	`h' displays a screen full of help with editor commands
 *		(the help is in /usr/lib/emhelp)
 */

/* Mods: Ian Johnstone (AGSM)
 *	September, 77
 *
 *	When receive terminate (14) signal, output current file
 *	to "saved.file" and tell user about this - then exit.
 */

/* Mods: Greg Rose
 *	77/09/12
 */

#define	AUTOW

/*	A new command, ti to set the time between automatic writes of the file.
 *	Syntax: tin (where n is an integer) will write the file
 *	every n minutes to the current file.
 *	A pair of bells are output to warn the user,
 *	and rubouts are trapped.
 *
 *	Also the pattern matching routines have been improved.
 *	If a new pattern match includes `&', the `&' is
 *	replaced with the old pattern.
 */

/* Mods: Craig McGregor (CSU)
 *	77/12/23
 *
 *	Make numerous fixes and modifications.
 *	1. Allow the % in a shell command line to be
 *	escaped with `\'.
 *	2. Perform % evaluation in a shell command line
 *	when the line is actually executed rather than
 *	the first time it is typed in.  This will allow
 *	it to reflect the current file name all of the time.
 *	3. The `o' command has some slight corrections.
 *	When the command is aborted with a rubout
 *	character it no longer loses the next line.
 *	It no longer fouls up when a null character is
 *	received; it is now ignored.  The error message
 *	has been changed from some obscure character used
 *	on ITT terminals to simply a bell.
 *	4. Always redirect the confirmation input for the
 *	`x' command so that will work even as part of the
 *	`g' command.
 *	5. Allow new lines to be substituted into lines
 *	even when the `g' command is in use.
 *	6. The use of `s', `x' and `o' commands does not
 *	remove labels from lines.  When a line is changed
 *	to more than one, the label is left attached to
 *	the first.  This is also relevent to the `c' command
 *	however only the first line of the change preserves
 *	its tag.
 *	Also it is now possible to place tags on line #1
 *	and use them there.
 *	7. The `o' command modified to use the UCASE bit
 *	before converting "\b" to upper-case B.
 *	8. Make `xl' command correctly handle tabs etc.
 *	9. A switch (-l) to select a default mode of `l'
 *	instead of `p' when a line number or newline is
 *	given without a command.
 *	11. Two new subcommands have been added to the
 *	`o' command's repertoire: ^P to skip to the end
 *	of the line; ^T to backup a single character.
 *	12. Handle long-line errors correctly.
 *	13. Allow the '.' to finish off an append, insert
 *	or change input to be escaped.  This will allow
 *	users to create lines consisting of a single dot.
 */

/* Mods: Kevin Hill
 *	April - May, 78
 */

#define JOIN

/*	1.  Added a new command for joining lines together :
 *
 *		(.,.+1)j
 *
 *	The given lines are joined, with the new line characters
 *	replaced by blanks.  If the total line exceeds the allowed
 *	linelength, the command is aborted without changing the file.
 *	May also type 'jc', for join-and-compress; that is, join the two
 *	(or more) lines together, removing all blanks and tabs at the join
 *	except for one blank.  Any label on the first line is maintained.
 *	Note for future modifiers :  ALL reading operations MUST
 *	be completed before a write is attempted.
 *
 *	2.  Removed modification 13 above, which caused more trouble
 *	than it was worth.  Suggested method of entering '.' :  enter
 *	'..' and later on do 's/.//p'.
 *
 *	3.  Stylistic improvements were made to make the program readable!
 *
 *	4.  '"l', '%l', and '&l' now working.
 */

#define SEARCH_STRING

/*	5.  Incredibly small change made so that the search string is
 *	not forgotten if accidently enter '/' instead of '//', or '?'
 *	instead of '??'.  Another change was made so that filename
 *	is not forgotten if enter 'f ' (or something similar).
 */

#define GLOBAL

/*	6.  Print out '??' if no match in a global command pattern
 *	in the entire file.  Note :  do NOT seek!
 */

#define ERRORS

/*	7.  Improved error recovery for command files.  The line number
 *	at which the error occurred is printed.  Assisted by Ian J, who wrote
 *	the verbose error messages as well as catching 'init' errors, and
 *	initially requesting core for INITLINES lines to speed up init.
 *	When invoked as 'e -s file', the verbose error messages are suppressed
 *	in favour of '?' and '??'.  When invoked as 'e - file', match-fail and
 *	empty-file error messages are suppressed (useful for command files).
 */

#define	N_LINES

/*	8.   Added feature to `"', `%', and `&' commands :
 *
 *			`"n'	or	`%n'	or	`&n'
 *
 *	where `n' specifies the screen size, which is remembered until reset.
 *	May be followed by `l' or `p', as before.  The default values is LINES.
 *	The minimum value allowed is 4.
 */

#define	NULLS

/*	9.  Tell the user how many nulls have been thrown away when the file
 *	is read in.  Also, add a '\n' onto the last line, if none present,
 *	and inform the user (previously, such a line was discarded).
 */

#define	ADDRESS

/*	10.  Address-reading routine improved to reject rubbish, such as
 *	1,2,3,4,5,6,7p etc. etc. (result same as before for valid addresses).
 *	Added defaults: if no address before `,' - assume `1'; if no address
 *	after `,' - assume `$'.  Thus, for example, `,p' is identical to
 *	`1,$p', and prints the whole file.  Also added `/^/' default
 *	to the global command - thus, for example, `gp' prints all
 *	lines in the file.  The drawback is that the search-string
 *	delimiters may not be alphabetics (as they are then interpreted
 *	as commands).
 */

#define	CHDIR

/*	11.  Added 'cd' to the command list.  Form :  'cd pathname', where
 *	the pathname cannot contain the short-cuts '%' or '\@'.  This is
 *	because /etc/glob could not be used, for obvious (?) reasons.
 */

#define	PRINT_STRING

/*	12.  Added new command 'z' to print out the current search-string.
 *	Added '-' facility to the search string: [a-d] = [abcd].
 *	The '-' may be escaped: [abc\-f] = [abcf] + [-].
 */

#define	NICE_EXIT

/*	13.  Fixed up 'o' mode so that, if have typed '\n', and then hit
 *	DEL to exit unchanged, will not lose rest of current line.
 */

#define	BETTER_SWAP

/*	14.  Improved the 's' and 'x' algorithm - it was incredibly inefficient
 *	for 'x' and 's/../../g' commands before this change, copying the
 *	linebuffer backwards and forwards numerous times.
 */

#define	UNIXCMD

/*	15.  Altered unix command line so that `!' is replaced by the last
 *	unix command.  This means `!!' works as before, but you may now
 *	type such things as `!!&' or `!! > junk', etc.
 *	(Improved the code while I was at it - what a mess!)
 */

#define	MISC

/*	16.  Numerous fixes/mods.  Fixed `elfic' mode so can exit with
 *	null file name and null file, can enter `f' with no arguments, and
 *	can enter `f' with an argument if there is no file name.  Change `w'
 *	to flush core buffers into temporary file (less lost if system
 *	crashes).  Corrected sloshing to make it consistent: absorb unnecessary
 *	sloshes, and treat `\\x' as distinct from `\x'.  Made open-mode
 *	smarter about its kill and erase characters.  Improved `getchar' so
 *	ignores `control-d' from a terminal (doesn't kill append, etc.)
 *	(left this change ifdef'ed under AUTOW).  Changed `count' to a long.
 *	Corrected test for tty (use `gtty' instead of `fstat').  Added `wx'
 *	option to `w' command - write with execute permission (mode 0700).
 *	Some corrections to AUTOW: catch create-error; object if there is
 *	no file name.  Fix `compsub' so `g/../s/../p' is caught
 *	(used to hang waiting for input).  Check first word of file to
 *	object to packed files, objects, etc.
 */

/* Mods: David Milway
 *	May, 78
 */

#define	DRM

/*	Added a new option to 'w' command :  'wa' to write onto the end
 *	of the named file.  If the file is not present, it is created.
 */

#define	NOSPELL

/*	Temporary measure until `spell' works correctly!
 *
 *				Kevin Hill
 */

#define	SIGHUP	1
#define	SIGINTR	2
#define	SIGQUIT	3
#define	SIGTERM	14
#ifdef	AUTOW
#define	SIGCLOK	15
#endif	AUTOW
#define	FNSIZE	64
#define	LBSIZE	512
#ifdef	ERRORS
#define	INITLINES	200	/* initial number of lines */
#endif	ERRORS
#define	ESIZE	128
#define	GBSIZE	256
#define	NBRA	8
#define	EOF	-1
#define	UNIXBUFL 100		/* must be < LBSIZE */

#define	CBRA	1
#define	CCHR	2
#define	CDOT	4
#define	CCL	6
#define	NCCL	8
#define	CDOL	10
#define	CEOF	11
#define	CKET	12

#define	STAR	01

#define	READ	0
#define	WRITE	1

/* screen dimensions */
#define	LINES	24
#define	LENGTH	80
#define	PROMPT	'>'
#define	CONFIRM	'.'
#define	TABSET	7	/* this should be determined dynamically */

#define	RAW	040
#define	ECHO	010
#define	UCASE	04

#define	OPEN	'/'
#define	BELL	'\007'
#define	ESCAPE	'\033'
#define	SPACE	' '
#define	BACKSL	'\\'
#define	RUBOUT	'\177'
#define	CTRLA	'\01'
#define	CTRLB	'\02'
#define	CTRLC	'\03'
#define	CTRLD	'\04'
#define	CTRLE	'\05'
#define	CTRLF	'\06'
#define	CTRLG	'\07'		/* == bell */
#define	CTRLH	'\010'		/* == backspace */
#define	CTRLI	'\011'		/* == TAB */
#define	CTRLL	'\014'		/* == form-feed */
#define	CTRLP	'\020'
#define	CTRLQ	'\021'
#define	CTRLR	'\022'
#define	CTRLS	'\023'
#define	CTRLT	'\024'
#define	CTRLV	'\026'
#define	CTRLW	'\027'
#define	CTRLX	'\030'
#define	CTRLZ	'\032'


struct { int integer; };

int	peekc;
int	lastc;
char	savedfile[FNSIZE];
char	file[FNSIZE];
char	linebuf[LBSIZE];
char	rhsbuf[LBSIZE/2];
char	expbuf[ESIZE+4];
int	circfl;
int	*zero;
int	*dot;
int	*dol;
int	*endcore;
int	*fendcore;
int	*addr1;
int	*addr2;
char	genbuf[LBSIZE];
long	count;
char	*nextip;
char	*linebp;
int	ninbuf;
int	nline;
int	io;
int	pflag;
int	onhup;
int	onquit;
int	vflag;
int	listf;
int	col;
char	*globp;
int	tfile;
int	tline;
char	*tfname;
char	*loc1;
char	*loc2;
char	*locs;
char	ibuff[512];
int	iblock;
char	obuff[512];
int	oblock;
int	ichanged;
int	nleft;
int	names[26];
char	*braslist[NBRA];
char	*braelist[NBRA];

int	margin;			/* used to set threshold in 'open' */

int	elfic;			/* true if "elfic" (-e) flag */
int	firstime;		/* ugh - used to frigg initial "read" for elfic mode */
char	unixbuffer[UNIXBUFL];
int	xflag;			/* used in 'xchange' command */

int	oflag;
char	*threshold, *savethresh;
char	*lnp, *gnp, *brp;
int	savetty, tty[3];

char	lflag;

#ifdef	AUTOW
int	writetime;
int	justwrit;	/* for the auto-write */
int	delaywrite;
int	writewaiting;	/* kludge for 'o' mode, since it flogs a buffer */
#endif	AUTOW

#ifdef	JOIN
int	nocmpress;	/* for join-and-compress option */
#endif	JOIN

#ifdef	ERRORS
int	istty;		/* set when input commands are from a tty */
int	linenr;		/* line number of each command as taken from a file */
int	currlnnr;	/* for the current command line number */
int	sflag;		/* for '-s' option */
#endif	ERRORS

#ifdef	N_LINES
int	lines;			/* number of lines on screen for ", %, and & */
#endif	N_LINES

#ifdef	NICE_EXIT
int	oldline, *thestart;
#endif	NICE_EXIT

#ifdef	BETTER_SWAP
char	*ssp, *slp;	/* pointers to genbuf and linebuf */
#endif	BETTER_SWAP

#ifdef	MISC
int	nbra;		/* number of subexpressions */
int	chkflg;		/* flag for reading funny files */
#endif	MISC