[comp.sources.misc] memacs 3.8i 7 of 11

davidsen@steinmetz.UUCP (William E. Davidsen Jr) (06/15/87)

:
#!/bin/sh
# shar+ created from directory /usr2/davidsen/emacs38i
# 13:42 on Thu Jun 11, 1987 by davidsen
echo 'x - main.c (text)'
sed << 'E!O!F' 's/^X//' > main.c
X/*
X *	MicroEMACS 3.8
X * 			written by Dave G. Conroy.
X *			greatly modified by Daniel M. Lawrence
X *
X *	(C)opyright 1987 by Daniel M. Lawrence
X *	MicroEMACS 3.8 can be copied and distributed freely for any
X *	non-commercial purposes. MicroEMACS 3.8 can only be incorporated
X *	into commercial software with the permission of the current author.
X *
X * This file contains the main driving routine, and some keyboard processing
X * code, for the MicroEMACS screen editor.
X *
X * REVISION HISTORY:
X *
X * 1.0  Steve Wilhite, 30-Nov-85
X *      - Removed the old LK201 and VT100 logic. Added code to support the
X *        DEC Rainbow keyboard (which is a LK201 layout) using the the Level
X *        1 Console In ROM INT. See "rainbow.h" for the function key defs
X *      Steve Wilhite, 1-Dec-85
X *      - massive cleanup on code in display.c and search.c
X *
X * 2.0  George Jones, 12-Dec-85
X *      - Ported to Amiga.
X *
X * 3.0  Daniel Lawrence, 29-Dec-85
X *      - rebound keys/added new fast buffered I/O for AMIGA
X *	- added META- repeat commands
X *	- added reposition default to center screen (yeah!)
X *	- changed exit with modified buffers message
X *	- made filesave tell us what it is doing
X *	- changed search string entry to terminate with <ESC>
X *	  so we can use <NL> in search/replace strings
X *	- updated version number in mode line to 3.0
X *	12-Jan-86
X *	- Added code to reconize the search/replace functions
X *	- Added code to perform search/replace & query functions
X *	14-Jan-86
X *	- moved search logic to separate function in search.c
X *	- added replace and query replace functions
X *	- separated out control key expansions to be used by others in search.c
X *	15-Jan-86
X *	- changed "visiting" to finding
X *	- changed yes/no responses to not need return
X *	- cleaned up various messages
X *	16-jan-86
X *	- fixed spurious spawn message in MSDOS
X *	- added ^X-S synonym to save command
X *	- moved escape to shell to ^X-C
X *	21-jan-86
X *	- added code to suspend shell under BSD
X *	22-jan-86
X *	- added function key support (SPEC) under MSDOS
X *	- Abort now prints [Aborted] on message line
X *	23-jan-86
X *	- Added modes and commands to set/unset them
X *	24-jan-86
X *	- Added Goto Line command
X *	- added Rename Buffer command
X *	28-jan-86
X *	- added goto beginning and end of paragraph commands (META-P/META-N)
X *	- re-wrote kdelete to use realloc. Gained MUCH speed here when
X *	  doing large wipes on both UNIX and MSDOS. Changed kill buffer
X *	  allocation block size from 256 bytes to 1 k
X *	29-jan-86
X *	- moved extern function declarations to efunc.h
X *	- made name[] name binding table
X *	30-jan-86
X *	- fixed Previous/Next paragraph command not to wrap around EOF
X *	- added Fill Paragraph command (META-Q)
X *	4-feb-86
X *	- added code to properly display long lines, scrolling them right
X *	  to left
X *	5-feb-85
X *	- rewrote code to right/left scroll...much better
X *	- added shifted arrow keys on IBMPC
X *	6-feb-85
X *	- add option to allow forward-word to jump to beginning of
X *	  next word instead of end of current one. This is different from
X *	  other emacs' but can be configured off in estruct.h
X *	- added VIEW mode to allow a buffer to be read only
X *	   (-v switch on command line will activate this)
X *	- changed quick exit to write out ALL changed buffers!!!
X *	  MAKE SURE YOU KNOW THIS WHEN META-Zing
X *	10-feb-86
X *	- added handling of lines longer than allowed on file read in
X *	  (they wrap on additional lines)
X *	- made having space clear the message line and NOT insert itself
X *	  a configuration option in ed.h
X *	11-feb-86
X *	- added Describe-command and Help commands.
X *	13-feb-86
X *	- added View file command (^X ^V) and finished HELP command
X *	14-feb-86
X *	- added option to let main loop skip update if type ahead commands
X *	   are queued up
X *	16-feb-86
X *	- added Insert File command
X *	17-feb-86
X *	- added scroll next window up/down commands
X *	18-feb-86
X *	- added CMODE indentation
X *	- re-arranged header files to standardize extern and global
X *	  definitions
X *	- changed version number to 3.2
X *	- added numeric arguments to search, reverse search and
X *	  search and replace
X *	24-feb-86
X *	- added Bind To Key function (^C for now) to allow the user
X *	  to change his command keys
X *	- added Unbind key function (M-^C for now)
X *	- added execute named command to execute unbound commands (M-X)
X *	- added describe bindings command (not bound)
X *	- changed version number to 3.3
X *	25-feb-86
X *	- scrapped CERROR mode (too many compilers)
X *	- added EXACT mode for case sensitive searchers
X *	26-feb-86
X *	- added command completion on execute named command and
X *	  all routined grabbing a command name
X *	- adding execute-command-line command and its support functions
X *	  (in preparation for sourcing files)
X *	- added Execute Buffer command
X *	27-feb-86
X *	- added execute(source) file command and added code to automatically
X *	  execute emacs.rc (or .emacsrc on UNIX) before initial read in
X *	- changed version number to 3.4
X *	4-mar-86
X *	- changed word delete to be consistant with word move (it gets
X *	  rid of the inter word space now) This is configurable with the
X *	  NFWORD symbol in estruct.h
X *	- added B_ACTIVE entry to the buffer table. Let emacs read multiple
X *	  file names from the command line and only read them in as needed
X *	5-mar-85
X *	- rewrote command line parser to get rid of my patchy code
X *	- changed version number to 3.5
X *	1-apr-86
X *	- added support for Aztec C 3.20e under MSDOS
X *	- fixed bug in mlwrite on ADM3's and their ilk under V7
X *	- added insertion of pounds in column one under CMODE
X *	- changed version number to 3.6
X *	3-apr-86
X *	- added next-buffer command (^X-X)
X *	5-apr-86
X *	- added kill paragraph command (M-^W)
X *	- changed fill-paragraph to leave 2 spaces after a period at the
X *	  end of a word.
X *	- added OVERWRITE mode
X *	7-apr-86
X *	- fixed overwrite mode to handle tabs
X *	8-apr-86
X *	- added add/delete global mode (<ESC>M & <ESC> ^M) commands
X *	9-apr-86
X *	- added insert space command
X *	- moved bindings around		^C	insert space
X *					M-K	bind-to-key
X *					INSERT	insert space
X *					DELETE	forwdel
X *	- added hunt forward and hunt reverse commands
X *	10-apr-86
X *	- fixed bug in DOBUF with non-terminated command string
X *	15-apr-86
X *	- fixed tab expansion bug in DISPLAY which hung the AMIGA
X *	  (sent in by Dawn Banks)
X *	- fixed curcol problen if forwline/backline during keyboard
X *	  macro execution (sent in by Ernst Christen)
X *	- added AMIGA function/cursor key support
X *	- fixed nonterminating <NL> replacement bug
X *	- fixed word wrapping problems
X *	16-apr-86
X *	- updated documentation and froze development for 3.6 net release
X *	23-apr-86	version 3.6a
X *	- added foreground and background colors. Setable with the
X *	  add mode commands for the moment
X *	24-apr-86
X *	- added command to pipe CLI output to a buffer
X *	25-apr-86
X *	- added Dana Hoggatt's code to replace Lattice's sick system()
X *	  function. Now we no longer care what the switchar is.
X *	- cleaned up the positioning on several of the spawing commands
X *	26-apr-86
X *	- added an output flush in vttidy(). Unix really appreciates this.
X *	- added filter-buffer (^X#) command to send a buffer through
X *	  a DOS filter
X *	- made automatic CMODE on .c and .h file compilation dependant
X *	  in estruct.h
X *	1-may-86
X *	- optimized some code in update(). It certainly need a lot more.
X *	- added Aztec profiling capabilities. These are conditional on
X *	  the APROF symbol in estruct.h
X *	2-may-86
X *	- added (u)ndo command in query-replace. undoes last repalce.
X *	6-may-86
X *	- re-organized and wrote the update() function in display.c
X *	  Now my color hacks are in the right places and the code can be
X *	  understood.
X *	[Released version 3.6f for BETA test sites]
X *	8-may-86
X *	- fixed bug in new display routine to wrap cursor on extended
X *	  lines at the right time
X *	- modified the buffer-position command to give reasonable info
X *	9-may-86
X *	- improved the word wrap algorithm as not to discard non-space
X *	  delimiters. The backscan now looks for white space rather than
X *	  !inword().
X *	[Released version 3.6g to Krannert]
X *	10-may-86
X *	- Added IBMPC.C an IBM-PC specific display driver. This makes paging
X *	  4-6 times faster. Also made some conditional changes to DISPLAY.C
X *	  to eliminate the pscreen[] if using the PC driver.
X *	[changed version number to 3.6i]
X *	12-may-86
X *	- added delete-window (^X 0) command to dispose of a single window
X *	- fixed problem with multiple prefixes from a command line which
X *	  was reported by John Gamble
X *	14-may-86
X *	- Added Aztec support for the IBMPC display driver. Had to
X *	  readjust some includes and defines for this.
X *	- fixed bug in delete-window.
X *	- fixed some bizarre behavior with the cursor after coming back
X *	  from spawn calls.
X *	[changed version number to 3.7 freezing development for net release]
X *	15-may-86
X *	- (that didn't last long...) Added execute-macro-(1 thru 20) commands
X *	  to execute macro buffers (named "[Macro nn]")
X *	- changed BFTEMP to BFINVS and cleaned up treatment of invisible
X *	  buffers.
X *	16-may-86
X *	- added store-macro (unbound) to store any executed command lines to
X *	  macro buffer.
X *	- added clear-message-line (unbound) command to do just that
X *	- added resize-window command to change a window's size to the
X *	  specified argument
X *	- improved help's logic not to re-read the file if it was already
X *	  in a buffer
X *	- added MAGIC mode to all structures and command tables, but the
X *	  regular expression code that John Gamble is writing is not ready.
X *	18-may-86
X *	- added interactive prompt requests in command line execution (i.e.
X *	  while executing a macro, a parameter starting with an at sign (@)
X *	  causes emacs to prompt with the rest of the parameter and return
X *	  the resulting input as the value of the parameter).
X *	- added arguments to split-current-window to force the cursor into
X *	  the upper or lower window.
X *	20-may-86
X *	- added support for the Microsoft C compiler as per the changes
X *	  sent in by Oliver Sharp
X *	- made some upgrades and fixes for VMS sent in by Guy Streeter
X *	21-may-86
X *	- fixed an Aztec bug in ttgetc by clearing the upper byte
X *	- fixed buf in CMODE with #preprocesser input (bug fix submitted by
X *	  Willis of unknown path)
X *	- added support of alternative startup file ( @<filename> ) in
X *	  the command line
X *	- added ^Q quoting in interactive input (mlreplyt()).
X *	- added re-binding of meta-prefix and ctlx-prefix
X *	22-may-86
X *	- reorganized getkey routines to make more sense and let prefix
X *	  binding work properly.
X *	23-may-86
X *	- checked new code on BSD4.2 and made a few fixes
X *	- added optional fence matching while in CMODE
X *	- added goto and search command line arguments by Mike Spitzer
X *	26-may-86
X *	- added parameter fetching from buffers
X *	27-may-86
X *	- fixed some HP150 bugs......
X *	31-may-86
X *	- Added Wang PC keyboard support from modifications by
X *	  Sid Shapiro @ Wang Institute
X *	- Fixed some reverse video bugs with code submitted by Peter Chubb
X *	- Fixed bug in nextbuffer reported by Dave Forslund
X *	- added system V support (USG) from Linwood Varney
X *	2-jun-86
X *	- changed defines to just define one Unix define (for example,
X *	  just define BSD for Unix BSD 4.2)
X *	- Added Incremental search functions written by D. R. Banks
X *	  in file ISEARCH.C
X *	- added insert-string (unbound) command to help the macro
X *	  language out.
X *	- added unmark-buffer (M-~) command to turn off the current buffers
X *	  change flag
X *	- fixed nxtarg to truncate strings longer than asked for max length
X *	4-jun-86
X *	- added special characters in command line tokens. Tilde (~) is
X *	  the special lead-in character for "nrtb".
X *	- Fixed bad ifdef in Aztec code so it could look at HOME dir
X *	  for startup, help, and emacs.rc files
X *	6-jun-86
X *	- make delete word commands clear the kill buffer if not after another
X *	  kill command
X *	11-jun-86
X *	- made ~@ in string arguments pass as char(192) to nxtarg() so one can
X *	  quote @ at the beginning of string arguments
X *	- changed buffer size vars in listbuffers() to long (for big files)
X *	- re-wrote buffer-position command to be much faster
X *	12-jun-86
X *	- added count-words (M-^C) command to count the words/chars and
X *	  lines in a region
X *	- changed regions so they could be larger than 65535 (short ->
X *	  long in the REGION structure)
X *	- changed ldelete() and all callers to use a long size. The kill
X *	  buffer will still have a problem >65535 that can not be solved
X *	  until I restructure it.
X *	- grouped paragraph commands and word count together under symbol
X *	  WORDPRO to allow them to be conditionally made (or not)
X *	13-jun-86
X *	- re-wrote kill buffer routines again. Now they support an unlimited
X *	  size kill buffer, and are (in theory) faster.
X *	- changed delete-next-word (M-D) to not eat the newline after a word,
X *	  instead it checks and eats a newline at the cursor.
X *	17-jun-86
X *	- added numeric argument to next/previous-window to access the nth
X *	  window from the top/bottom
X *	- added support for the Data General 10 MSDOS machine
X *	- added save-window (unbound) and restore-window (unbound) commands
X *	  for the use of the menu script. Save-window remembers which window
X *	  is current, and restore-window returns the cursor to that window.
X *	20-jun-86
X *	- fixed a bug with the fence matching locking up near the beginning
X *	  of a buffer
X *	- added argument to update to selectively force a complete update
X *	- added update-screen (unbound) command so macros can force a
X *	  screen update
X *	21-jun-86
X *	- rearranged token() and nxtarg() calls so that command names and
X *	  repeat counts could also be prompted and fetched from buffers
X *	  [this broke later with the exec re-write....]
X *	- added write-message (unbound) command to write out a message
X *	  on the message line (for macros)
X *	- changed ifdef's so that color modes are recognized as legal in
X *	  b/w version, and simply do nothing (allowing us to use the same
X *	  script files)
X *	[Released version 3.7 on July 1 to the net and elswhere]
X *	2-jul-86
X *	- Changed search string terminator to always be the meta character
X *	  even if it is rebound.
X *	3-jul-86
X *	- removed extra calls to set color in startup code. This caused the
X *	  original current window to always be the global colors.
X *	7-jul-86
X *	- Fixed bugs in mlreplyt() to work properly with all terminators
X *	  including control and spec characters
X *	22-jul-86
X *	- fixed replaces() so that it will return FALSE properly on the
X *	  input of the replacement string.
X *	- added a definition for FAILED as a return type.....
X *	- changed version number to 3.7b
X *	23-jul-86
X *	- fixed o -> 0 problem in TERMIO.C
X *	- made ^U universal-argument re-bindable
X *	- wrote atoi() for systems (like Aztec) where it acts strangely
X *	- changed version number to 3.7c
X *	25-jul-86
X *	- make ^G abort-command rebindable
X *	29-jul-86
X *	- added HP110 Portable Computer support
X *	- changed version number to 3.7d
X *	30-jul-86
X *	- Fixed a couple of errors in the new VMS code as pointer
X *	  out by Ken Shacklford
X *	- split terminal open/close routines into screen and keyboard
X *	  open/close routines
X *	- closed the keyboard during all disk I/O so that OS errors
X *	  can be respoded to correctly (especially on the HP150)
X *	- changed version number to 3.7e
X *	31-jul-86
X *	- added label-function-key (unbound) command under symbol FLABEL
X *	  (primarily for the HP150)
X *	4-aug-86
X *	- added fixes for Microsoft C as suggested by ihnp4!ihuxm!gmd1
X *		<<remember to fix [list] deletion bug as reported
X *		  by craig@hp-pcd>>
X *	8-aug-86
X *	- fixed beginning misspelling error everywhere
X *	- fixed some more MSC errors
X *	- changed version number to 3.7g
X *	20-aug-86
X *	- fixed CMODE .h scanning bug
X *	- changed version number to 3.7h
X *	30-aug-86
X *	- fixed killing renamed [list] buffer (it can't) as submitted
X *	  by James Aldridge
X *	- Added code to allow multiple lines to display during
X *	  vertical retrace
X *	  [total disaster....yanked it back out]
X *	9-sep-86
X *	- added M-A (apropos) command to list commands containing a substring.
X *	- fixed an inefficiency in the display update code submitted
X *	  by William W. Carlson (wwc@pur-ee)
X *	10-sep-86
X *	- added Dana Hoggatt's code for encryption and spliced it into the
X *	  proper commands. CRYPT mode now triggers encryption.
X *	- added -k flag to allow encryption key (no spaces) in command line
X *	14-sep-86
X *	- added missing lastflag/thisflag processing to docmd()
X *	- changed version to 3.7i and froze for partial release via mail
X *	  and BBS
X *	05-oct-86
X *	- changed some strcpys in MAIN.C to strncpys as suggested by John
X *	  Gamble
X *	- replaces SEARCH.C and ISEARCH.C with versions modified by
X *	  John Gamble
X *	10-oct-86
X *	- removed references to lflick....it just won't work that way.
X *	- removed defines LAT2 and LAT3...the code no longer is Lattice
X *	  version dependant.
X *	14-oct-86
X *	- changed spawn so that it will not not pause if executed from
X *	  a command line
X *	15-oct-86
X *	- added argument concatination (+) to the macro parsing
X *	- added [] as fence pairs
X *	16-oct-86
X *	- rewrote all macro line parsing routines and rearranged the
X *	  mlreply code. Saved 6K!!! Have blazed the path for expanding
X *	  the command language.
X *	17-oct-86
X *	- added new keyboard macro routines (plus a new level to the
X *	  input character function)
X *	22-oct-86
X *	- improved EGA cursor problems
X *	- added -r (restricted) switch to command line for BBS use
X *	06-nov-86
X *	- fixed terminator declarations from char to int in getarg() and
X *	  nxtarg() in EXEC.C as pointed out by John Gamble
X *	07-nov-86
X *	- made wordrap() user callable as wrap-word (M-FNW) and changed
X *	  the getckey() routine so that illegal keystrokes (too many
X *	  prefixes set) could be used for internal bindings. When word
X *	  wrap conditions are met, the keystroke M-FNW is executed. Added
X *	  word wrap check/call to newline().
X *	11-nov-86
X *	- added and checked support for Mark Williams C 86
X *	12-nov-86
X *	- added goto-matching-fence (M-^F) command to jump to a matching
X *	  fence "({[]})" or beep if there is none. This can reframe the
X *	  screen.
X *	- added code and structure elements to support change-screen-size
X *	  command (M-^S) to change the number of lines being used by
X *	  MicroEMACS.
X *	15-nov-86
X *	- finished debugging change-screen-size
X *	17-nov-86
X *	- Incorporated in James Turner's modifications for the Atari ST
X *		23-sep-86
X *		- added support for the Atari ST line of computers (jmt)
X *		  - added a '\r' to the end of each line on output and strip
X *		    it on input for the SHOW function from the desktop
X *		  - added 3 new mode functions (HIREZ, MEDREZ, and LOREZ);
X *		    chgrez routine in TERM structure; and MULTREZ define in
X *		    ESTRUCT.H to handle multiple screen resolutions
X *	[note....ST still not running under Lattice yet...]
X *	25-nov-86
X *	- Made the filter-buffer (^X-#) command not work on VIEW mode
X *	  buffers
X *	- Made the quick-exit (M-Z) command throw out a newline after
X *	  each message so they could be seen.
X *	26-nov-86
X *	- fixed a couple of bugs in change-screen-size (M-^S) command
X *	- changed file read behavior on long lines and last lines
X *	  with no newline (it no longer throws the partial line out)
X *	- [as suggested by Dave Tweten] Made adding a ^Z to the end
X *	  of an output file under MSDOS configurable under the
X *	  CTRL-Z symbol in ESTRUCT.H
X *	- [Dave Tweten] Spawn will look up the "TMP" environment variable
X *	  for use during various pipeing commands.
X *	- [Dave Tweten] changed pipe command under MSDOS to use '>>'
X *	  instead of '>'
X *	04-dec-86
X *	- moved processing of '@' and '#' so that they can be outside
X *	  the quotes in an argument, and added hooks to process '%' for
X *	  environment and user variables.
X *	- modified IBMPC.C to sense the graphics adapter (CGA and MONO)
X *	  at runtime to cut down on the number of versions.
X *	05-dec-86
X *	- changed macro directive character to "!" instead of "$" (see
X *	  below) and fixed the standard .rc file to comply.
X *	- added code to interpret environment variables ($vars). Added
X *	  hooks for built in functions (&func). So, to recap:
X *
X *		@<string>	prompt and return a string from the user
X *		#<buffer name>	get the next line from a buffer and advance
X *		%<var>		get user variable <var>
X *		$<evar>		get environment variable <evar>
X *		&<func>		evaluate function <func>
X *
X *	- allowed repeat counts to be any of the above
X *	- added code to allow insert-string (unbound) to use its
X *	  repeat count properly
X *	- added set (^X-A) command to set variables. Only works on
X *	  environmental vars yet.
X *	9-dec-86
X *	- added some code for user defined variables...more to come
X *	- added options for malloc() memory pool tracking
X *	- preliminary user variables (%) working
X *	- changed terminal calls to macro's (to prepare for the new
X *	  terminal drivers)
X *	15-dec-86
X *	- changed previous-line (^P) and next-line (^N) to return a
X *	  FALSE at the end or beginning of the file so repeated
X *	  macros involving them terminate properly!
X *	- added code for $CURCOL and $CURLINE
X *	20-dec-86
X *	- set (^X-A) now works with all vars
X *	- added some new functions
X *	  	&ADD &SUB &TIMES &DIV &MOD &NEG &CAT
X *	- once again rearranged functions to control macro execution. Did
X *	  away with getarg()
X *	23-dec-86
X *	- added string functions
X *	  	&LEFt &RIGht &MID
X *	31-dec-86
X *	- added many logical functions
X *	  	&NOT &EQUal &LESs &GREater
X *	- added string functions
X *	  	&SEQual &SLEss &SGReater
X *	- added variable indirection with &INDirect
X *	- made fixes to allow recursive macro executions
X *	  (improved speed during macro execution as well)
X *	3-jan-87
X *	- added $FLICKER to control flicker supression
X *	- made spawn commands restricted
X *	- cleaned up lots of unintentional int<->char problems
X *	4-jan-87
X *	- Fixed broken pipe-command (^X-@) command under MSDOS
X *	- added !IF  !ELSE  !ENDIF  directives and changed the
X *	  name of !END to !ENDM....real slick stuff
X *	5-jan-87
X *	- quick-exit (M-Z) aborts on any filewrite errors
X *	8-jan-87
X *	- debugged a lot of the new directive and evaluation code.
X *	  BEWARE of stack space overflows! (increasing stack to
X *	  16K under MSDOS)
X *	- removed non-standard DEC Rainbow keyboard support...let someone
X *	  PLEASE implement this in the standard manner using key bindings
X *	  and send the results to me.
X *	- added change-screen-width () command and $CURWIDTH variable
X *	11-jan-87
X *	- fixed an incredibly deeply buried bug in vtputc and combined
X *	  it with vtpute (saving about 200 bytes!)
X *	16-jan-87
X *	- added code to handle controlling multiple screen resolutions...
X *	  allowed the IBM-PC driver to force Mono or CGA modes.
X *	- added current buffer name and filename variables
X *	  $cbufname and $cfname
X *	18-jan-87
X *	- added $sres variable to control screen resolution
X *	- added $debug variable to control macro debugging code (no longer
X *	  is this activated by GLOBAL spell mode)
X *	- fixed bug in -g command line option
X *	- Released Version 3.8 to BBSNET
X *	21-jan-87
X *	- added $status variable to record return status of last command
X *	2-feb-87
X *	- added ATARI 1040 support...runs in all three modes right now
X *	- added $palette var with palette value in it
X *	- undefined "register" in BIND.C and INPUT.C for ST520 & LATTICE
X *	  to get around a nasty Lattice bug
X *	4-feb-87
X *	- added, debugged code for switching all 1040ST color modes, added
X *	  code for HIGH monochrome mode as well, DENSE still pending
X *	5-feb-87
X *	- with John Gamble, found and corrected the infamous bad matching
X *	  fence problems.
X *	- added error return check in various add/delete mode commands
X *	10-feb-87
X *	- re-arrange code in docmd() so that labels are stored in
X *	  macro buffers
X *	- fixed !RETURN to only return if (execlevel == 0) [If we are
X *	  currently executing]
X *	14-feb-87
X *	- added to outp() calls in the EGA driver to fix a bug in the BIOS
X *	- adding code for 1040ST 40 line DENSE mode (not complete)
X *	25-feb-87
X *	- added auto-save "ASAVE" mode....variables $asave and $acount
X *	  control the frequency of saving and count until next save
X *	- added &and and &or as functions for logical anding and oring
X *	- added string length &LEN, upper and lower case string funtions
X *	  &LOWER and &UPPER
X *	27-feb-87
X *	- added $lastkey   last keystroke struck and
X *	        $curchar    character under cursor
X *	28-feb-87
X *	- added code for trim-line (^X^T) command and table entries
X *	  for the entab-line (^X^E) and detab-line (^X^D) commands.
X *	  These are conditional on AEDIT (Advanced editing) in estruct.h
X *	18-mar-87
X *	- finished above three commands
X *	- added $version environment variable to return the current
X *	  MicroEMACS version number
X *	- added $discmd emvironment variable. This is a logical flag that
X *	  indicates if emacs should be echoing commands on the command line.
X *	  real useful in order to stop flashing macros and .rc files
X *	- added $progname environment variable. this always returns the
X *	  string "MicroEMACS". OEM's should change this so that macros can
X *	  tell if they are running on an unmodified emacs or not.
X *	- fixed a minor bug in the CGA/MONO detection routine in IBMPC.C
X *	20-mar-87
X *	- integrated EGAPC.C into IBMPC.C and eliminated the file. Now an
X *	  EGA user can switch from EGA to CGA modes at will
X *	- A LOT of little fixes and corrections sent in by John Ruply
X *	25-mar-87
X *	- Fixed buffer variables so they will work when referencing the
X *	  current buffer
X *	26-mar-87
X *	- Fixed atoi() to be more reasonable. trailing whitespace ignored,
X *	  only one leading sign, no non-digits allowed after the sign.
X *	- fixed buffer variables to go from the point to the end of
X *	  line.
X *	28-mar-87
X *	- fixed bugs with 8 bit chars as submited by Jari Salminen
X *	- replace AZTEC/MSDOS agetc() with a1getc() which won't strip
X *	  the high order bit
X *	30-mar-87
X *	- changed list-buffers (^X^B) so that with any argument, it will
X *	  also list the normally invisable buffers
X *	- added store-procedure and execute-procedure/run (M-^E)
X *	  commands to store and execute named procedures.
X *	31-mar-87
X *	- Fixed infinite loop in ^X-X command (when [LIST] is the
X *	  only buffer left) as pointed out by John Maline
X *	- made filenames in getfile() always lower case as pointed
X *	  out by John Maline
X *	2-apr-87
X *	- Fixed buffer variables so they would work on non-current displayed
X *	  buffers. They should now work with ALL buffers....
X *	3-apr-87
X *	- Yanked AZTEC profiling code....not very useful
X *	- Modified IBMPC driver so it will not start in EGA mode
X *	- allow the next-buffer (^X-X) command to have a preceding
X *	  non-negative argument.
X *	14-apr-87
X *	- added John Gamble's modified search.c. The code has cut apx
X *	  200-300 bytes off the executable.
X *	- added the &RND function to generate a random integer between
X *	  1 and its arguments value. Also $SEED is availible as the
X *	  random number seed.
X *	- changed the -k command line switch so if there is no argument,
X *	  it will prompt for one when the file is read
X *	15-apr-87
X *	- added 20 bytes of buffer in getval()'s local argument alloc so
X *	  when it returns a value, it has enough stack space to do at least
X *	  one strcpy() before stomping on the returned value. ALWAYS call
X *	  getval() ONLY from within a strcpy() call.
X *	- made $curcol return a 1 based value instead of a zero based one.
X *	16-apr-87
X *	- re-wrote strncpy() for AZTEC & MSDOS so it null terminates the
X *	  string.
X *	- changed pipe() to pipecmd() to avoid conflicts with various
X *	  UNIX systems
X *	24-apr-87
X *	- changed open parameters on AMIGA window open to 0/0/640/200
X */
X
X#include        <stdio.h>
X
X/* for MSDOS, increase the default stack space */
X
X#if	MSDOS & LATTICE
Xunsigned _stack = 32767;
X#endif
X
X#if	ATARI & LATTICE
Xint _mneed = 256000;		/* reset memory pool size */
X#endif
X
X#if	MSDOS & AZTEC
Xint _STKSIZ = 32767/16;		/* stack size in paragraphs */
Xint _STKRED = 1024;		/* stack checking limit */
Xint _HEAPSIZ = 4096/16;		/* (in paragraphs) */
Xint _STKLOW = 0;		/* default is stack above heap (small only) */
X#endif
X
X/* make global definitions not external */
X#define	maindef
X
X#include        "estruct.h"	/* global structures and defines */
X#include	"efunc.h"	/* function declarations and name table	*/
X#include	"edef.h"	/* global definitions */
X#include	"ebind.h"	/* default key bindings */
X
X#if     VMS
X#include        <ssdef.h>
X#define GOOD    (SS$_NORMAL)
X#endif
X
X#ifndef GOOD
X#define GOOD    0
X#endif
X
Xmain(argc, argv)
Xchar    *argv[];
X{
X        register int    c;
X        register int    f;
X        register int    n;
X        register int    mflag;
X	register BUFFER *bp;
X	register int	ffile;		/* first file flag */
X	register int	carg;		/* current arg to scan */
X	register int	startf;		/* startup executed flag */
X	int basec;			/* c stripped of meta character */
X	int viewflag;			/* are we starting in view mode? */
X        int gotoflag;                   /* do we need to goto a line at start? */
X        int gline;                      /* if so, what line? */
X        int searchflag;                 /* Do we need to search at start? */
X        char bname[NBUFN];		/* buffer name of file to read */
X#if	CRYPT
X	int eflag;			/* encrypting on the way in? */
X	char ekey[NPAT];		/* startup encryption key */
X#endif
X	char *strncpy();
X
X	/* initialize the editor and process the command line arguments */
X        strcpy(bname, "main");	/* default buffer name */
X        vtinit();		/* Displays.            */
X        edinit(bname);		/* Buffers, windows.    */
X	varinit();		/* user variables */
X	viewflag = FALSE;	/* view mode defaults off in command line */
X	gotoflag = FALSE;	/* set to off to begin with */
X	searchflag = FALSE;	/* set to off to begin with */
X	ffile = TRUE;		/* no file to edit yet */
X	startf = FALSE;		/* startup file not executed yet */
X#if	CRYPT
X	eflag = FALSE;		/* no encryption by default */
X#endif
X#if	COLOR
X	curwp->w_fcolor = gfcolor;		/* and set colors	*/
X	curwp->w_bcolor = gbcolor;
X#endif
X
X	/* scan through the command line and get the files to edit */
X	for (carg = 1; carg < argc; ++carg) {
X		/* if its a switch, process it */
X		if (argv[carg][0] == '-') {
X			switch (argv[carg][1]) {
X				case 'v':	/* -v for View File */
X				case 'V':
X					viewflag = TRUE;
X					break;
X				case 'e':	/* -e for Edit file */
X				case 'E':
X					viewflag = FALSE;
X					break;
X				case 's':	/* -s for initial search string */
X				case 'S':
X					searchflag = TRUE;
X					strncpy(pat,&argv[carg][2],NPAT);
X					break;
X				case 'g':	/* -g for initial goto */
X				case 'G':
X					gotoflag = TRUE;
X					gline = atoi(&argv[carg][2]);
X					break;
X				case 'r':	/* -r restrictive use */
X				case 'R':
X					restflag = TRUE;
X					break;
X#if	CRYPT
X				case 'k':	/* -k<key> for code key */
X				case 'K':
X					eflag = TRUE;
X					strcpy(ekey, &argv[carg][2]);
X					break;
X#endif
X				default:	/* unknown switch */
X					/* ignore this for now */
X					break;
X			}
X		} else 	/* check for a macro file */
X			if (argv[carg][0]== '@') {
X
X			if (startup(&argv[carg][1]) == TRUE)
X				startf = TRUE;	/* don't execute emacs.rc */
X
X		} else {	/* process a file name */
X			/* if we haven't run emacs.rc, do it now */
X			if (startf == FALSE) {
X				startup("");
X				startf = TRUE;
X#if	COLOR
X				curwp->w_fcolor = gfcolor;
X				curwp->w_bcolor = gbcolor;
X#endif
X			}
X
X			/* set up a buffer for this file */
X	                makename(bname, argv[carg]);
X			unqname(bname);
X
X#if	CRYPT
X			/* set up for de-cryption if needed */
X			if (eflag) {
X				curbp->b_mode |= MDCRYPT;
X				strncpy(curbp->b_key, ekey, NPAT);
X				crypt((char *)NULL, 0);
X				crypt(curbp->b_key, strlen(curbp->b_key));
X			}
X#endif
X
X			/* if this is the first file, read it in */
X			if (ffile) {
X				bp = curbp;
X				strcpy(bp->b_bname, bname);
X				strcpy(bp->b_fname, argv[carg]);
X				if (readin(argv[carg], (viewflag==FALSE))
X								== ABORT) {
X					strcpy(bp->b_bname, "main");
X					strcpy(bp->b_fname, "");
X				}
X				bp->b_dotp = bp->b_linep;
X				bp->b_doto = 0;
X				ffile = FALSE;
X			} else {
X				/* set this to inactive */
X				bp = bfind(bname, TRUE, 0);
X				strcpy(bp->b_fname, argv[carg]);
X				bp->b_active = FALSE;
X			}
X
X			/* set the view mode appropriatly */
X			if (viewflag)
X				bp->b_mode |= MDVIEW;
X		}
X	}
X
X	/* if invoked with nothing, run the startup file here */
X	if (startf == FALSE) {
X		startup("");
X		startf = TRUE;
X#if	COLOR
X		curwp->w_fcolor = gfcolor;
X		curwp->w_bcolor = gbcolor;
X#endif
X	}
X
X        /* Deal with startup gotos and searches */
X
X        if (gotoflag && searchflag) {
X        	update(FALSE);
X		mlwrite("[Can not search and goto at the same time!]");
X	}
X        else if (gotoflag) {
X                if (gotoline(TRUE,gline) == FALSE) {
X                	update(FALSE);
X			mlwrite("[Bogus goto argument]");
X		}
X        } else if (searchflag) {
X                if (forwhunt(FALSE, 0) == FALSE)
X                	update(FALSE);
X        }
X
X	/* setup to process commands */
X        lastflag = 0;                           /* Fake last flags.     */
X	curbp->b_mode |= gmode;			/* and set default modes*/
X	curwp->w_flag |= WFMODE;		/* and force an update	*/
X
Xloop:
X        update(FALSE);                          /* Fix up the screen    */
X        c = getcmd();
X        if (mpresf != FALSE) {
X                mlerase();
X                update(FALSE);
X#if	CLRMSG
X                if (c == ' ')                   /* ITS EMACS does this  */
X                        goto loop;
X#endif
X        }
X        f = FALSE;
X        n = 1;
X
X	/* do META-# processing if needed */
X
X	basec = c & ~META;		/* strip meta char off if there */
X	if ((c & META) && ((basec >= '0' && basec <= '9') || basec == '-')) {
X		f = TRUE;		/* there is a # arg */
X		n = 0;			/* start with a zero default */
X		mflag = 1;		/* current minus flag */
X		c = basec;		/* strip the META */
X		while ((c >= '0' && c <= '9') || (c == '-')) {
X			if (c == '-') {
X				/* already hit a minus or digit? */
X				if ((mflag == -1) || (n != 0))
X					break;
X				mflag = -1;
X			} else {
X				n = n * 10 + (c - '0');
X			}
X			if ((n == 0) && (mflag == -1))	/* lonely - */
X				mlwrite("Arg:");
X			else
X				mlwrite("Arg: %d",n * mflag);
X
X			c = getcmd();	/* get the next key */
X		}
X		n = n * mflag;	/* figure in the sign */
X	}
X
X	/* do ^U repeat argument processing */
X
X        if (c == reptc) {                  /* ^U, start argument   */
X                f = TRUE;
X                n = 4;                          /* with argument of 4 */
X                mflag = 0;                      /* that can be discarded. */
X                mlwrite("Arg: 4");
X                while ((c=getcmd()) >='0' && c<='9' || c==reptc || c=='-'){
X                        if (c == reptc)
X				if ((n > 0) == ((n*4) > 0))
X	                                n = n*4;
X	                        else
X	                        	n = 1;
X                        /*
X                         * If dash, and start of argument string, set arg.
X                         * to -1.  Otherwise, insert it.
X                         */
X                        else if (c == '-') {
X                                if (mflag)
X                                        break;
X                                n = 0;
X                                mflag = -1;
X                        }
X                        /*
X                         * If first digit entered, replace previous argument
X                         * with digit and set sign.  Otherwise, append to arg.
X                         */
X                        else {
X                                if (!mflag) {
X                                        n = 0;
X                                        mflag = 1;
X                                }
X                                n = 10*n + c - '0';
X                        }
X                        mlwrite("Arg: %d", (mflag >=0) ? n : (n ? -n : -1));
X                }
X                /*
X                 * Make arguments preceded by a minus sign negative and change
X                 * the special argument "^U -" to an effective "^U -1".
X                 */
X                if (mflag == -1) {
X                        if (n == 0)
X                                n++;
X                        n = -n;
X                }
X        }
X
X	/* and execute the command */
X        execute(c, f, n);
X        goto loop;
X}
X
X/*
X * Initialize all of the buffers and windows. The buffer name is passed down
X * as an argument, because the main routine may have been told to read in a
X * file by default, and we want the buffer name to be right.
X */
Xedinit(bname)
Xchar    bname[];
X{
X        register BUFFER *bp;
X        register WINDOW *wp;
X	char *malloc();
X
X        bp = bfind(bname, TRUE, 0);             /* First buffer         */
X        blistp = bfind("[List]", TRUE, BFINVS); /* Buffer list buffer   */
X        wp = (WINDOW *) malloc(sizeof(WINDOW)); /* First window         */
X        if (bp==NULL || wp==NULL || blistp==NULL)
X                exit(1);
X        curbp  = bp;                            /* Make this current    */
X        wheadp = wp;
X        curwp  = wp;
X        wp->w_wndp  = NULL;                     /* Initialize window    */
X        wp->w_bufp  = bp;
X        bp->b_nwnd  = 1;                        /* Displayed.           */
X        wp->w_linep = bp->b_linep;
X        wp->w_dotp  = bp->b_linep;
X        wp->w_doto  = 0;
X        wp->w_markp = NULL;
X        wp->w_marko = 0;
X        wp->w_toprow = 0;
X#if	COLOR
X	/* initalize colors to global defaults */
X	wp->w_fcolor = gfcolor;
X	wp->w_bcolor = gbcolor;
X#endif
X        wp->w_ntrows = term.t_nrow-1;           /* "-1" for mode line.  */
X        wp->w_force = 0;
X        wp->w_flag  = WFMODE|WFHARD;            /* Full.                */
X}
X
X/*
X * This is the general command execution routine. It handles the fake binding
X * of all the keys to "self-insert". It also clears out the "thisflag" word,
X * and arranges to move it to the "lastflag", so that the next command can
X * look at it. Return the status of command.
X */
Xexecute(c, f, n)
X{
X        register KEYTAB *ktp;
X        register int    status;
X
X        ktp = &keytab[0];                       /* Look in key table.   */
X        while (ktp->k_fp != NULL) {
X                if (ktp->k_code == c) {
X                        thisflag = 0;
X                        status   = (*ktp->k_fp)(f, n);
X                        lastflag = thisflag;
X                        return (status);
X                }
X                ++ktp;
X        }
X
X        /*
X         * If a space was typed, fill column is defined, the argument is non-
X         * negative, wrap mode is enabled, and we are now past fill column,
X	 * and we are not read-only, perform word wrap.
X         */
X        if (c == ' ' && (curwp->w_bufp->b_mode & MDWRAP) && fillcol > 0 &&
X	    n >= 0 && getccol(FALSE) > fillcol &&
X	    (curwp->w_bufp->b_mode & MDVIEW) == FALSE)
X		execute(META|SPEC|'W', FALSE, 1);
X
X        if ((c>=0x20 && c<=0x7E)                /* Self inserting.      */
X#if	IBMPC
X        ||  (c>=0x80 && c<=0xFE)) {
X#else
X        ||  (c>=0xA0 && c<=0xFE)) {
X#endif
X                if (n <= 0) {                   /* Fenceposts.          */
X                        lastflag = 0;
X                        return (n<0 ? FALSE : TRUE);
X                }
X                thisflag = 0;                   /* For the future.      */
X
X		/* if we are in overwrite mode, not at eol,
X		   and next char is not a tab or we are at a tab stop,
X		   delete a char forword			*/
X		if (curwp->w_bufp->b_mode & MDOVER &&
X		    curwp->w_doto < curwp->w_dotp->l_used &&
X			(lgetc(curwp->w_dotp, curwp->w_doto) != '\t' ||
X			 (curwp->w_doto) % 8 == 7))
X				ldelete(1L, FALSE);
X
X		/* do the appropriate insertion */
X		if (c == '}' && (curbp->b_mode & MDCMOD) != 0)
X	        	status = insbrace(n, c);
X	        else if (c == '#' && (curbp->b_mode & MDCMOD) != 0)
X	        	status = inspound();
X	        else
X	                status = linsert(n, c);
X
X#if	CFENCE
X		/* check for CMODE fence matching */
X		if ((c == '}' || c == ')' || c == ']') &&
X				(curbp->b_mode & MDCMOD) != 0)
X			fmatch(c);
X#endif
X
X		/* check auto-save mode */
X		if (curbp->b_mode & MDASAVE)
X			if (--gacount == 0) {
X				/* and save the file if needed */
X				upscreen(FALSE, 0);
X				filesave(FALSE, 0);
X				gacount = gasave;
X			}
X
X                lastflag = thisflag;
X                return (status);
X        }
X	TTbeep();
X	mlwrite("[Key not bound]");		/* complain		*/
X        lastflag = 0;                           /* Fake last flags.     */
X        return (FALSE);
X}
X
X/*
X * Fancy quit command, as implemented by Norm. If the any buffer has
X * changed do a write on that buffer and exit emacs, otherwise simply exit.
X */
Xquickexit(f, n)
X{
X	register BUFFER *bp;	/* scanning pointer to buffers */
X	register int status;
X
X	bp = bheadp;
X	while (bp != NULL) {
X	        if ((bp->b_flag&BFCHG) != 0	/* Changed.             */
X        	&& (bp->b_flag&BFINVS) == 0) {	/* Real.                */
X			curbp = bp;		/* make that buffer cur	*/
X			mlwrite("[Saving %s]\n",bp->b_fname);
X                	if ((status = filesave(f, n)) != TRUE)
X                		return(status);
X		}
X	bp = bp->b_bufp;			/* on to the next buffer */
X	}
X        quit(f, n);                             /* conditionally quit   */
X	return(TRUE);
X}
X
X/*
X * Quit command. If an argument, always quit. Otherwise confirm if a buffer
X * has been changed and not written out. Normally bound to "C-X C-C".
X */
Xquit(f, n)
X{
X        register int    s;
X
X        if (f != FALSE                          /* Argument forces it.  */
X        || anycb() == FALSE                     /* All buffers clean.   */
X						/* User says it's OK.   */
X        || (s=mlyesno("Modified buffers exist. Leave anyway")) == TRUE) {
X#if	FILOCK
X		if (lockrel() != TRUE) {
X			TTputc('\n');
X			TTputc('\r');
X			TTclose();
X			TTkclose();
X			exit(1);
X		}
X#endif
X                vttidy();
X                exit(GOOD);
X        }
X	mlwrite("");
X        return (s);
X}
X
X/*
X * Begin a keyboard macro.
X * Error if not at the top level in keyboard processing. Set up variables and
X * return.
X */
Xctlxlp(f, n)
X{
X        if (kbdmode != STOP) {
X                mlwrite("%%Macro already active");
X                return(FALSE);
X        }
X        mlwrite("[Start macro]");
X	kbdptr = &kbdm[0];
X	kbdend = kbdptr;
X        kbdmode = RECORD;
X        return (TRUE);
X}
X
X/*
X * End keyboard macro. Check for the same limit conditions as the above
X * routine. Set up the variables and return to the caller.
X */
Xctlxrp(f, n)
X{
X        if (kbdmode == STOP) {
X                mlwrite("%%Macro not active");
X                return(FALSE);
X        }
X	if (kbdmode == RECORD) {
X	        mlwrite("[End macro]");
X	        kbdmode = STOP;
X	}
X        return(TRUE);
X}
X
X/*
X * Execute a macro.
X * The command argument is the number of times to loop. Quit as soon as a
X * command gets an error. Return TRUE if all ok, else FALSE.
X */
Xctlxe(f, n)
X{
X        if (kbdmode != STOP) {
X                mlwrite("%%Macro already active");
X                return(FALSE);
X        }
X        if (n <= 0)
X                return (TRUE);
X	kbdrep = n;		/* remember how many times to execute */
X	kbdmode = PLAY;		/* start us in play mode */
X	kbdptr = &kbdm[0];	/*    at the beginning */
X	return(TRUE);
X}
X
X/*
X * Abort.
X * Beep the beeper. Kill off any keyboard macro, etc., that is in progress.
X * Sometimes called as a routine, to do general aborting of stuff.
X */
Xctrlg(f, n)
X{
X        TTbeep();
X	kbdmode = STOP;
X	mlwrite("[Aborted]");
X        return(ABORT);
X}
X
X/* tell the user that this command is illegal while we are in
X   VIEW (read-only) mode				*/
X
Xrdonly()
X
X{
X	TTbeep();
X	mlwrite("[Key illegal in VIEW mode]");
X	return(FALSE);
X}
X
Xresterr()
X
X{
X	TTbeep();
X	mlwrite("[That command is RESTRICTED]");
X	return(FALSE);
X}
X
Xmeta()	/* dummy function for binding to meta prefix */
X{
X}
X
Xcex()	/* dummy function for binding to control-x prefix */
X{
X}
X
Xunarg()	/* dummy function for binding to universal-argument */
X{
X}
X
X/*****		Compiler specific Library functions	****/
X
X#if	MWC86 & MSDOS
Xmovmem(source, dest, size)
X
Xchar *source;	/* mem location to move memory from */
Xchar *dest;	/* memory location to move text to */
Xint size;	/* number of bytes to move */
X
X{
X	register int i;
X
X	for (i=0; i < size; i++)
X		*dest++ = *source++;
X}
X#endif
X
X#if	AZTEC & MSDOS
X/*	strncpy:	copy a string...with length restrictions
X			ALWAYS null terminate
X*/
X
Xchar *strncpy(dst, src, maxlen)
X
Xchar *dst;	/* destination of copied string */
Xchar *src;	/* source */
Xint maxlen;	/* maximum length */
X
X{
X	char *dptr;	/* ptr into dst */
X
X	dptr = dst;
X	while (*src && (maxlen-- > 0))
X		*dptr++ = *src++;
X	*dptr = 0;
X	return(dst);
X}
X#endif
X
X#if	RAMSIZE & LATTICE & MSDOS
X/*	These routines will allow me to track memory usage by placing
X	a layer on top of the standard system malloc() and free() calls.
X	with this code defined, the environment variable, $RAM, will
X	report on the number of bytes allocated via malloc.
X
X	with SHOWRAM defined, the number is also posted on the
X	end of the bottom mode line and is updated whenever it is changed.
X*/
X
X#undef	malloc
X#undef	free
X
Xchar *allocate(nbytes)	/* allocate nbytes and track */
X
Xunsigned nbytes;	/* # of bytes to allocate */
X
X{
X	char *mp;	/* ptr returned from malloc */
X	char *malloc();
X
X	mp = malloc(nbytes);
X	if (mp) {
X		envram += nbytes;
X#if	RAMSHOW
X		dspram();
X#endif
X	}
X
X	return(mp);
X}
X
Xrelease(mp)	/* release malloced memory and track */
X
Xchar *mp;	/* chunk of RAM to release */
X
X{
X	unsigned *lp;	/* ptr to the long containing the block size */
X
X	if (mp) {
X		lp = ((unsigned *)mp) - 1;
X
X		/* update amount of ram currently malloced */
X		envram -= (long)*lp - 2;
X		free(mp);
X#if	RAMSHOW
X		dspram();
X#endif
X	}
X}
X
X#if	RAMSHOW
Xdspram()	/* display the amount of RAM currently malloced */
X
X{
X	char mbuf[20];
X	char *sp;
X
X	TTmove(term.t_nrow - 1, 70);
X#if	COLOR
X	TTforg(7);
X	TTbacg(0);
X#endif
X	sprintf(mbuf, "[%lu]", envram);
X	sp = &mbuf[0];
X	while (*sp)
X		TTputc(*sp++);
X	TTmove(term.t_nrow, 0);
X	movecursor(term.t_nrow, 0);
X}
X#endif
X#endif
E!O!F
newsize=`wc -c < main.c`
if [ $newsize -ne 46191 ]
then echo "File main.c was $newsize bytes, 46191 expected"
fi
echo 'x - makefile (text)'
sed << 'E!O!F' 's/^X//' > makefile
XCFLAGS=		-O
X
XOFILES=		ansi.o basic.o bind.o buffer.o crypt.o dg10.o \
X		display.o eval.o exec.o file.o fileio.o \
X		hp110.o hp150.o ibmpc.o input.o isearch.o line.o \
X		lock.o main.o random.o region.o search.o spawn.o \
X		st520.o tcap.o termio.o tipc.o vmsvt.o vt52.o \
X		window.o word.o z309.o
X
XCFILES=		ansi.c basic.c bind.c buffer.c crypt.c dg10.c \
X		display.c eval.c exec.c file.c fileio.c \
X		hp110.c hp150.c ibmpc.c input.c isearch.c line.c \
X		lock.c main.c random.c region.c search.c spawn.c \
X		st520.c tcap.c termio.c tipc.c vmsvt.c vt52.c \
X		window.c word.c z309.c
X
XHFILES=		estruct.h edef.h efunc.h epath.h ebind.h evar.h
X
Xemacs:		$(OFILES)
X		$(CC) $(CFLAGS) $(OFILES) -ltermcap -lc -o emacs
X
X$(OFILES):	$(HFILES)
E!O!F
newsize=`wc -c < makefile`
if [ $newsize -ne 728 ]
then echo "File makefile was $newsize bytes, 728 expected"
fi
	bill davidsen		(wedu@ge-crd.arpa)
  {chinet | philabs | sesimo}!steinmetz!crdos1!davidsen
"Stupidity, like virtue, is its own reward" -me