[comp.emacs] Patch to support emacs-18.57 on the Stardent Titans

mac@gold.kpc.com (Mike McNamara) (05/18/91)

This diff adds support to gnu emacs-18.57 for the Stardent Titan
machines.  

In the past, I have posted a similar diff to this newsgroup (or
predecesor newsgroups) for gnu emacs versions 18.53, 18.54, and 18.55.

I had hoped that the Free Software Foundation would add this machine
to those listed in /etc/MACHINES, with all that implies.

This has not yet happened.

Please tell me what I need to do to get the FSF to support the
Stardent machines in future releases of gnu-emacs.

In the meantime, I will continue to send new patches as new versions
of gnu-emacs become available.

diff -cbr dist-18.57/etc/MACHINES emacs-18.57/etc/MACHINES
*** dist-18.57/etc/MACHINES	Tue Jan 15 20:08:29 1991
--- emacs-18.57/etc/MACHINES	Mon Mar  4 09:54:51 1991
***************
*** 584,589 ****
--- 584,594 ----
  
    Works, as of 18.56.  Note that this is a MIPS architecture machine.
  
+ Stardent (m-titan.h, s-usg5-3.h)
+   
+   18.55, 6 & 7 work on the Stardent 1500 & 3000 (aka Titan P2
+   and Titan P3).
+ 	
  Stride (m-stride.h; s-usg5-2.h)
  
    Works (most recent news for 18.30) on their release 2.0.
diff -cbr dist-18.57/src/dispnew.c emacs-18.57/src/dispnew.c
*** dist-18.57/src/dispnew.c	Tue Jan  8 09:25:14 1991
--- emacs-18.57/src/dispnew.c	Mon Mar  4 09:54:52 1991
***************
*** 1413,1421 ****
--- 1413,1425 ----
    if (XINT (n) > 0)
      {
  #ifdef subprocesses
+ /* We are unable to use interrupts if FIONREAD is not available,
+ 	so don't call gobble_input (or home?) without it */
+ #ifdef FIONREAD
  #ifdef SIGIO
        gobble_input ();
  #endif				/* SIGIO */
+ #endif				/* FIONREAD */
        wait_reading_process_input (XINT (n), 1, 1);
  #else				/* no subprocesses */
        immediate_quit = 1;
diff -cbr dist-18.57/src/process.c emacs-18.57/src/process.c
*** dist-18.57/src/process.c	Tue Jan 15 17:28:34 1991
--- emacs-18.57/src/process.c	Mon May 13 16:55:47 1991
***************
*** 90,95 ****
--- 90,99 ----
  
  #ifdef SYSV_PTYS
  #include <sys/tty.h>
+ #ifdef titan
+ #include <sys/ttyhw.h>
+ #include <sys/stream.h>
+ #endif /* titan's pty needs ttyhw & stream */
  #include <sys/pty.h>
  #endif
  
***************
*** 1461,1466 ****
--- 1465,1473 ----
  #endif /* not HAVE_TIMEVAL */
    SELECT_TYPE Atemp;
    int wait_channel = 0;
+ #ifdef titan
+   volatile 
+ #endif
    struct Lisp_Process *wait_proc = 0;
    extern kbd_count;
  
diff -cbr dist-18.57/src/sysdep.c emacs-18.57/src/sysdep.c
*** dist-18.57/src/sysdep.c	Tue Jan 15 18:43:45 1991
--- emacs-18.57/src/sysdep.c	Mon May 13 16:46:10 1991
***************
*** 220,225 ****
--- 220,229 ----
  #endif /* AIX */
  
  #ifdef SYSV_PTYS
+ #ifdef titan
+ #include <sys/ttyhw.h>
+ #include <sys/stream.h>
+ #endif /* titan's pty needs ttyhw & stream */
  #include <sys/tty.h>
  #include <sys/pty.h>
  #endif
***************
*** 1529,1534 ****
--- 1533,1539 ----
  end_of_text ()
  {
  #ifdef TEXT_END
+   extern TEXT_END;
    return ((char *) TEXT_END);
  #else
    extern int etext;
***************
*** 1545,1550 ****
--- 1550,1556 ----
  end_of_data ()
  {
  #ifdef DATA_END
+   extern int DATA_END;
    return ((char *) DATA_END);
  #else
    extern int edata;
diff -cbr dist-18.57/src/x11term.c emacs-18.57/src/x11term.c
*** dist-18.57/src/x11term.c	Thu Jan 24 09:36:39 1991
--- emacs-18.57/src/x11term.c	Tue May 14 11:05:01 1991
***************
*** 81,87 ****
  #include <sys/sysmacros.h>	/* for "minor" */
  #include <sys/time.h>
  #else
! #ifdef UNIPLUS
  #include <sys/time.h>
  
  #else /* not IRIS, not UNIPLUS */
--- 81,87 ----
  #include <sys/sysmacros.h>	/* for "minor" */
  #include <sys/time.h>
  #else
! #if defined (UNIPLUS) || defined(USG_SYS_TIME)
  #include <sys/time.h>
  
  #else /* not IRIS, not UNIPLUS */
diff -cbr dist-18.57/src/x11term.h emacs-18.57/src/x11term.h
*** dist-18.57/src/x11term.h	Wed Nov 28 15:07:33 1990
--- emacs-18.57/src/x11term.h	Mon May 13 17:00:28 1991
***************
*** 12,18 ****
  #endif
  
  #define BLOCK_INPUT_DECLARE() int BLOCK_INPUT_mask
! #ifdef SIGIO
  #define BLOCK_INPUT() BLOCK_INPUT_mask = sigblock (sigmask (SIGIO))
  #define UNBLOCK_INPUT() sigsetmask (BLOCK_INPUT_mask)
  #else /* not SIGIO */
--- 12,18 ----
  #endif
  
  #define BLOCK_INPUT_DECLARE() int BLOCK_INPUT_mask
! #if defined(SIGIO) && defined(FINOREAD)
  #define BLOCK_INPUT() BLOCK_INPUT_mask = sigblock (sigmask (SIGIO))
  #define UNBLOCK_INPUT() sigsetmask (BLOCK_INPUT_mask)
  #else /* not SIGIO */
*** /dev/null	Tue May 14 14:07:37 1991
--- emacs-18.57/src/m-titan.h	Tue May 14 10:29:50 1991
***************
*** 0 ****
--- 1,224 ----
+ /* m- file for Stardent 1500 & Stardent 3000s.
+    Copyright (C) 1987 Free Software Foundation, Inc.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY.  No author or distributor
+ accepts responsibility to anyone for the consequences of using it
+ or for whether it serves any particular purpose or works at all,
+ unless he says so in writing.  Refer to the GNU Emacs General Public
+ License for full details.
+ 
+ Everyone is granted permission to copy, modify and redistribute
+ GNU Emacs, but only under the conditions described in the
+ GNU Emacs General Public License.   A copy of this license is
+ supposed to have been given to you along with GNU Emacs so you
+ can know your rights and responsibilities.  It should be in a
+ file named COPYING.  Among other things, the copyright notice
+ and this notice must be preserved on all copies.  */
+ 
+ #ifndef __P3__
+ #ifndef __P2__
+ #define __P2__
+ #endif
+ #endif
+ 
+ 
+ /* The following three symbols give information on
+  the size of various data types.  */
+ 
+ #define SHORTBITS 16		/* Number of bits in a short */
+ 
+ #define INTBITS 32		/* Number of bits in an int */
+ 
+ #define LONGBITS 32		/* Number of bits in a long */
+ 
+ /* Define BIG_ENDIAN iff lowest-numbered byte in a word
+    is the most significant byte.  */
+ 
+ #define BIG_ENDIAN
+ 
+ /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
+  * group of arguments and treat it as an array of the arguments.  */
+ 
+ #define NO_ARG_ARRAY
+ 
+ /* Define WORD_MACHINE if addresses and such have
+  * to be corrected before they can be used as byte counts.  */
+ 
+ #undef WORD_MACHINE
+ 
+ /* Define how to take a char and sign-extend into an int.
+    On machines where char is signed, this is a no-op.  */
+ 
+ #define SIGN_EXTEND_CHAR(c) (c)
+ 
+ /* Now define a symbol for the cpu type, if your compiler
+    does not define it automatically:
+    Ones defined so far include vax, m68000, ns16000, pyramid,
+    orion, tahoe, APOLLO and many others */
+ 
+ #ifndef titan			/* C compiler defines this */
+ #	define titan
+ #endif
+ 
+ /* Use type int rather than a union, to represent Lisp_Object */
+ /* This is desirable for most machines.  */
+ 
+ #define NO_UNION_TYPE
+ 
+ /* Define EXPLICIT_SIGN_EXTEND if XINT must explicitly sign-extend
+    the 24-bit bit field into an int.  In other words, if bit fields
+    are always unsigned.
+ 
+    If you use NO_UNION_TYPE, this flag does not matter.  */
+ 
+ #define EXPLICIT_SIGN_EXTEND
+ 
+ /* Data type of load average, as read out of kmem.  */
+ 
+ #define LOAD_AVE_TYPE long
+ 
+ /* Convert that into an integer that is 100 for a load average of 1.0  */
+ 
+ #define LOAD_AVE_CVT(x) (int) (((double) (x)) * 100. / 65536.)
+ 
+ /* Define CANNOT_DUMP on machines where unexec does not work.
+    Then the function dump-emacs will not be defined
+    and temacs will do (load "loadup") automatically unless told otherwise.  */
+ 
+ /* #define CANNOT_DUMP */
+ 
+ /* Define VIRT_ADDR_VARIES if the virtual addresses of
+    pure and impure space as loaded can vary, and even their
+    relative order cannot be relied on.
+ 
+    Otherwise Emacs assumes that text space precedes data space,
+    numerically.  */
+ 
+ /* #define VIRT_ADDR_VARIES */
+ 
+ /* Define C_ALLOCA if this machine does not support a true alloca
+    and the one written in C should be used instead.
+    Define HAVE_ALLOCA to say that the system provides a properly
+    working alloca function and it should be used.
+    Define neither one if an assembler-language alloca
+    in the file alloca.s should be used.  */
+ 
+ #define C_ALLOCA
+ /* #define HAVE_ALLOCA */
+ 
+ /* Define NO_REMAP if memory segmentation makes it not work well
+    to change the boundary between the text section and data section
+    when Emacs is dumped.  If you define this, the preloaded Lisp
+    code will not be sharable; but that's better than failing completely.  */
+ 
+ #define NO_REMAP
+ 
+ /* Allow emacs to grow up to 64 Mbytes */
+ #define VALBITS   26
+ #define GCTYPEBITS 5
+ /*
+  *	Define HAVE_TERMIO if the system provides sysV-style ioctls
+  *	for terminal control.
+  */
+ 
+ /* Ardent supports both termcap and terminfo; hence either define HAVE_TERMIO,
+    (gets you terminfo) or undefine it, (gets you termcap) as you wish. Note:
+    Ardent also supplies captoinfo, which translates from termcap to terminfo,
+    which lets you be even more terminal library independant. */
+ 
+ #define HAVE_TERMIO /* */
+ 
+ /* Give alloca some direction */
+ #define STACK_DIRECTION -1
+ 
+ /* undo various usg5-3 defines */
+ 
+ /* Unlike most SYSV's, Stardent supports ^Z */
+ #ifdef NOMULTIPLEJOBS		
+ #undef NOMULTIPLEJOBS
+ #endif /* */
+ 
+ /* Stardent does not adequately support interrupt I/O */
+ #ifdef INTERRUPT_INPUT
+ #undef INTERRUPT_INPUT
+ #endif /* */
+ #undef SIGIO
+ /* Stardent supports timeval; x11term.c seems to need timeval, hence
+    I suggest you use it. */
+ #ifndef HAVE_TIMEVAL	
+ #define HAVE_TIMEVAL
+ #define USG_SYS_TIME
+ #endif /* */
+ 
+ /* Stardent supports ptys */
+ #ifndef HAVE_PTYS
+ #define HAVE_PTYS
+ #define SYSV_PTYS
+ #endif   /* */
+ 
+ /* Stardent does NOT put networking library in libnsl_s.a; it's in libc */
+ #ifdef LIBX10_SYSTEM
+ #undef LIBX10_SYSTEM
+ #endif /* */
+ #ifdef LIBX11_SYSTEM
+ #undef LIBX11_SYSTEM
+ #endif /* */
+ 
+ #define HAVE_X_WINDOWS
+ #define X11 
+ /* ardent specific defines */
+ 
+ #define START_FILES /lib/crt0.o
+ #define C_OPTIMIZE_SWITCH -O1 
+ #define C_SWITCH_MACHINE -I/usr/X11/include 
+ #define LD_SWITCH_MACHINE   
+ 
+ /* ardent supplies a working select even in sysv mode */
+ #define HAVE_SELECT
+ 
+ /* The Stardent only defines utimes in the BSD environment */
+ #define MISSING_UTIMES
+ 
+ /* setenv is a useful thing to have */
+ #define MAINTAIN_ENVIRONMENT
+ 
+ /* (loadst.c) Stardent does not have this */
+ #undef DKSTAT_HEADER_FILE
+ 
+ /* RMS asked that I create an unextitan, as unexec.c has too many ifdefs already */
+ #define UNEXEC unextitan.o
+ #define TEXT_END _etext
+ #define DATA_END _edata
+ #define DATA_SECTION_ALIGNMENT pagemask
+ #define TEXT_START 0x400000
+ #ifdef __P3__ /* The Titan P3 (aka Stardent 3000) data section starts here */
+ #define DATA_START 0x10000000
+ #else	        /* The Titan P2 (aka Stardent 1500) data section starts here */
+ #define DATA_START 0x10003000
+ #endif
+ #define DATA_SEG_BITS 0x10000000
+ 
+ /* -NW: Stardent cc performs lint; emacs is not lint free; -NW kills warnings  */
+ #define C_DEBUG_SWITCH -g 	
+ 
+ 
+ /* The standard definitions of these macros would work ok,
+    but these are faster because the constants are short.  */
+ 
+ #define XUINT(a) (((unsigned)(a) << INTBITS-VALBITS) >> INTBITS-VALBITS)
+ 
+ #define XSET(var, type, ptr) \
+    ((var) = ((int)(type) << VALBITS) + (((unsigned) (ptr) << INTBITS-VALBITS) >> INTBITS-VALBITS))
+ 
+ #define XSETINT(a, b)  XSET(a, XTYPE(a), b)
+ #define XSETUINT(a, b) XSET(a, XTYPE(a), b)
+ #define XSETPNTR(a, b) XSET(a, XTYPE(a), b)
+ 
+ #define XMARKBIT(a) ((a) < 0)
+ /*(a < 0) returns 1, not MARKBIT, so XSETMARKBIT has to be redefined.*/
+ #define XSETMARKBIT(a,b) ((a) = ((b) ? (a)|MARKBIT : (a) & ~MARKBIT))
+ #define XUNMARK(a) ((a) = (((a) << INTBITS-GCTYPEBITS-VALBITS) >> INTBITS-GCTYPEBITS-VALBITS))
+ #define PURESIZE 200000
*** /dev/null	Tue May 14 14:10:50 1991
--- emacs-18.57/src/unextitan.c	Mon Mar  4 10:07:38 1991
***************
*** 0 ****
--- 1,777 ----
+ /* Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
+ 
+ 		       NO WARRANTY
+ 
+   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
+ NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
+ WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
+ RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
+ AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+ DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+ CORRECTION.
+ 
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
+ STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
+ WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
+ OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+ USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
+ DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
+ A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
+ PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
+ 
+ 		GENERAL PUBLIC LICENSE TO COPY
+ 
+   1. You may copy and distribute verbatim copies of this source file
+ as you receive it, in any medium, provided that you conspicuously and
+ appropriately publish on each copy a valid copyright notice "Copyright
+ (C) 1987 Free Software Foundation, Inc."; and include following the
+ copyright notice a verbatim copy of the above disclaimer of warranty
+ and of this License.  You may charge a distribution fee for the
+ physical act of transferring a copy.
+ 
+   2. You may modify your copy or copies of this source file or
+ any portion of it, and copy and distribute such modifications under
+ the terms of Paragraph 1 above, provided that you also do the following:
+ 
+     a) cause the modified files to carry prominent notices stating
+     that you changed the files and the date of any change; and
+ 
+     b) cause the whole of any work that you distribute or publish,
+     that in whole or in part contains or is a derivative of this
+     program or any part thereof, to be licensed at no charge to all
+     third parties on terms identical to those contained in this
+     License Agreement (except that you may choose to grant more extensive
+     warranty protection to some or all third parties, at your option).
+ 
+     c) You may charge a distribution fee for the physical act of
+     transferring a copy, and you may at your option offer warranty
+     protection in exchange for a fee.
+ 
+ Mere aggregation of another unrelated program with this program (or its
+ derivative) on a volume of a storage or distribution medium does not bring
+ the other program under the scope of these terms.
+ 
+   3. You may copy and distribute this program (or a portion or derivative
+ of it, under Paragraph 2) in object code or executable form under the terms
+ of Paragraphs 1 and 2 above provided that you also do one of the following:
+ 
+     a) accompany it with the complete corresponding machine-readable
+     source code, which must be distributed under the terms of
+     Paragraphs 1 and 2 above; or,
+ 
+     b) accompany it with a written offer, valid for at least three
+     years, to give any third party free (except for a nominal
+     shipping charge) a complete machine-readable copy of the
+     corresponding source code, to be distributed under the terms of
+     Paragraphs 1 and 2 above; or,
+ 
+     c) accompany it with the information you received as to where the
+     corresponding source code may be obtained.  (This alternative is
+     allowed only for noncommercial distribution and only if you
+     received the program in object code or executable form alone.)
+ 
+ For an executable file, complete source code means all the source code for
+ all modules it contains; but, as a special exception, it need not include
+ source code for modules which are standard libraries that accompany the
+ operating system on which the executable file runs.
+ 
+   4. You may not copy, sublicense, distribute or transfer this program
+ except as expressly provided under this License Agreement.  Any attempt
+ otherwise to copy, sublicense, distribute or transfer this program is void and
+ your rights to use the program under this License agreement shall be
+ automatically terminated.  However, parties who have received computer
+ software programs from you with this License Agreement will not have
+ their licenses terminated so long as such parties remain in full compliance.
+ 
+   5. If you wish to incorporate parts of this program into other free
+ programs whose distribution conditions are different, write to the Free
+ Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
+ worked out a simple rule that can be stated here, but we will often permit
+ this.  We will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing and reuse of
+ software.
+ 
+ 
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ what you give them.   Help stamp out software-hoarding!  */
+ 
+ 
+ /*
+  * unexec.c - Convert a running program into an a.out file.
+  *
+  * Author:	Spencer W. Thomas
+  * 		Computer Science Dept.
+  * 		University of Utah
+  * Date:	Tue Mar  2 1982
+  * Modified heavily since then.
+  *
+  * Synopsis:
+  *	unexec (new_name, a_name, data_start, bss_start, entry_address)
+  *	char *new_name, *a_name;
+  *	unsigned data_start, bss_start, entry_address;
+  *
+  * Takes a snapshot of the program and makes an a.out format file in the
+  * file named by the string argument new_name.
+  * If a_name is non-NULL, the symbol table will be taken from the given file.
+  * On some machines, an existing a_name file is required.
+  *
+  * The boundaries within the a.out file may be adjusted with the data_start
+  * and bss_start arguments.  Either or both may be given as 0 for defaults.
+  *
+  * Data_start gives the boundary between the text segment and the data
+  * segment of the program.  The text segment can contain shared, read-only
+  * program code and literal data, while the data segment is always unshared
+  * and unprotected.  Data_start gives the lowest unprotected address.
+  * The value you specify may be rounded down to a suitable boundary
+  * as required by the machine you are using.
+  *
+  * Specifying zero for data_start means the boundary between text and data
+  * should not be the same as when the program was loaded.
+  * If NO_REMAP is defined, the argument data_start is ignored and the
+  * segment boundaries are never changed.
+  *
+  * Bss_start indicates how much of the data segment is to be saved in the
+  * a.out file and restored when the program is executed.  It gives the lowest
+  * unsaved address, and is rounded up to a page boundary.  The default when 0
+  * is given assumes that the entire data segment is to be stored, including
+  * the previous data and bss as well as any additional storage allocated with
+  * break (2).
+  *
+  * The new file is set up to start at entry_address.
+  *
+  * If you make improvements I'd like to get them too.
+  * harpo!utah-cs!thomas, thomas@Utah-20
+  *
+  */
+ /* March 89 Michael McNamara (mac@ardent): finished Tim Moore's port of unexec
+  * to the titan.
+  */
+ 
+ /* There are several compilation parameters affecting unexec:
+ 
+ * COFF
+ 
+ Define this if your system uses COFF for executables.
+ Otherwise we assume you use Berkeley format.
+ 
+ * NO_REMAP
+ 
+ Define this if you do not want to try to save Emacs's pure data areas
+ as part of the text segment.
+ 
+ Saving them as text is good because it allows users to share more.
+ 
+ However, on machines that locate the text area far from the data area,
+ the boundary cannot feasibly be moved.  Such machines require
+ NO_REMAP.
+ 
+ Also, remapping can cause trouble with the built-in startup routine
+ /lib/crt0.o, which defines `environ' as an initialized variable.
+ Dumping `environ' as pure does not work!  So, to use remapping,
+ you must write a startup routine for your machine in Emacs's crt0.c.
+ If NO_REMAP is defined, Emacs uses the system's crt0.o.
+ 
+ * SECTION_ALIGNMENT
+ 
+ Some machines that use COFF executables require that each section
+ start on a certain boundary *in the COFF file*.  Such machines should
+ define SECTION_ALIGNMENT to a mask of the low-order bits that must be
+ zero on such a boundary.  This mask is used to control padding between
+ segments in the COFF file.
+ 
+ If SECTION_ALIGNMENT is not defined, the segments are written
+ consecutively with no attempt at alignment.  This is right for
+ unmodified system V.
+ 
+ * SEGMENT_MASK
+ 
+ Some machines require that the beginnings and ends of segments
+ *in core* be on certain boundaries.  For most machines, a page
+ boundary is sufficient.  That is the default.  When a larger
+ boundary is needed, define SEGMENT_MASK to a mask of
+ the bits that must be zero on such a boundary.
+ 
+ * A_TEXT_OFFSET(HDR)
+ 
+ Some machines count the a.out header as part of the size of the text
+ segment (a_text); they may actually load the header into core as the
+ first data in the text segment.  Some have additional padding between
+ the header and the real text of the program that is counted in a_text.
+ 
+ For these machines, define A_TEXT_OFFSET(HDR) to examine the header
+ structure HDR and return the number of bytes to add to `a_text'
+ before writing it (above and beyond the number of bytes of actual
+ program text).  HDR's standard fields are already correct, except that
+ this adjustment to the `a_text' field has not yet been made;
+ thus, the amount of offset can depend on the data in the file.
+   
+ * A_TEXT_SEEK(HDR)
+ 
+ If defined, this macro specifies the number of bytes to seek into the
+ a.out file before starting to write the text segment.a
+ 
+ * EXEC_MAGIC
+ 
+ For machines using COFF, this macro, if defined, is a value stored
+ into the magic number field of the output file.
+ 
+ * ADJUST_EXEC_HEADER
+ 
+ This macro can be used to generate statements to adjust or
+ initialize nonstandard fields in the file header
+ 
+ * ADDR_CORRECT(ADDR)
+ 
+ Macro to correct an int which is the bit pattern of a pointer to a byte
+ into an int which is the number of a byte.
+ 
+ This macro has a default definition which is usually right.
+ This default definition is a no-op on most machines (where a
+ pointer looks like an int) but not on all machines.
+ 
+ */
+ 
+ #ifndef emacs
+ #define PERROR(arg) perror (arg); return -1
+ #else
+ #include "config.h"
+ #define PERROR(file) report_error (file, new)
+ #endif
+ 
+ #ifndef CANNOT_DUMP  /* all rest of file!  */
+ 
+ #ifndef CANNOT_UNEXEC /* most of rest of file */
+ 
+ #include <a.out.h>
+ /* Define getpagesize () if the system does not.
+    Note that this may depend on symbols defined in a.out.h
+  */
+ #include "getpagesize.h"
+ 
+ #ifndef makedev			/* Try to detect types.h already loaded */
+ #include <sys/types.h>
+ #endif
+ #include <stdio.h>
+ #include <sys/stat.h>
+ #include <errno.h>
+ 
+ extern char *start_of_text ();		/* Start of text */
+ extern char *start_of_data ();		/* Start of initialized data */
+ 
+ static long block_copy_start;		/* Old executable start point */
+ static struct filehdr f_hdr;		/* File header */
+ static struct aouthdr f_ohdr;		/* Optional file header (a.out) */
+ static struct scnhdr f_thdr;		/* Text section header */
+ static struct scnhdr f_dhdr;		/* Data section header */
+ static struct scnhdr f_shdr;		/* Symtab section header */
+ static struct scnhdr f_bhdr;		/* Bss section header */
+ static struct scnhdr f_ihdr;		/* Ident section header */
+ static struct scnhdr scntemp;		/* Temporary section header */
+ static long old_ident_scnptr;
+ long bias;			/* Bias to add for growth */
+ long lnnoptr;			/* Pointer to line-number info within file */
+ #define SYMS_START block_copy_start
+ 
+ static long text_scnptr;
+ static long data_scnptr;
+ static long symtab_scnptr;
+ static long ident_scnptr;
+ static long symptr_scnptr;
+ 
+ static int pagemask;
+ 
+ /* Correct an int which is the bit pattern of a pointer to a byte
+    into an int which is the number of a byte.
+    This is a no-op on ordinary machines, but not on all.  */
+ 
+ #ifndef ADDR_CORRECT   /* Let m-*.h files override this definition */
+ #define ADDR_CORRECT(x) ((char *)(x) - (char*)0)
+ #endif
+ 
+ #ifdef emacs
+ 
+ static
+ report_error (file, fd)
+      char *file;
+      int fd;
+ {
+   if (fd)
+     close (fd);
+   error ("Failure operating on %s", file);
+ }
+ #endif /* emacs */
+ 
+ #define ERROR0(msg) report_error_1 (new, msg, 0, 0); return -1
+ #define ERROR1(msg,x) report_error_1 (new, msg, x, 0); return -1
+ #define ERROR2(msg,x,y) report_error_1 (new, msg, x, y); return -1
+ 
+ static
+ report_error_1 (fd, msg, a1, a2)
+      int fd;
+      char *msg;
+      unsigned int a1, a2;
+ {
+   close (fd);
+ #ifdef emacs
+   error (msg, a1, a2);
+ #else
+   fprintf (stderr, msg, a1, a2);
+   fprintf (stderr, "\n");
+ #endif
+ }
+ 
+ /* ****************************************************************
+  * unexec
+  *
+  * driving logic.
+  */
+ unexec (new_name, a_name, data_start, bss_start, entry_address)
+      char *new_name, *a_name;
+      unsigned data_start, bss_start, entry_address;
+ {
+   int new = -1;
+   int a_out = -1;
+ 
+   if (a_name && (a_out = open (a_name, 0)) < 0)
+     {
+       PERROR (a_name);
+     }
+   if ((new = creat (new_name, 0666)) < 0)
+     {
+       PERROR (new_name);
+     }
+ 
+   if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
+       || copy_text_and_data (new) < 0
+       || copy_sym (new, a_out, a_name, new_name) < 0)
+     {
+       close (new);
+       /* unlink (new_name);	    	/* Failed, unlink new a.out */
+       return -1;	
+     }
+ 
+   close (new);
+   if (a_out >= 0)
+     close (a_out);
+   mark_x (new_name);
+   return 0;
+ }
+ 
+ /* ****************************************************************
+  * make_hdr
+  *
+  * Make the header in the new a.out from the header in core.
+  * Modify the text and data sizes.
+  */
+ static int
+ make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name)
+      int new, a_out;
+      unsigned data_start, bss_start, entry_address;
+      char *a_name;
+      char *new_name;
+ {
+   register int scns;
+   unsigned int bss_end;
+   unsigned int start_next_section;
+   
+   pagemask = getpagesize () - 1;
+ 
+   /* Adjust text/data boundary. */
+ #ifdef NO_REMAP
+   data_start = (int) start_of_data ();
+ #else /* not NO_REMAP */
+   if (!data_start)
+     data_start = (int) start_of_data ();
+ #endif /* not NO_REMAP */
+   data_start = ADDR_CORRECT (data_start);
+ 
+ #ifdef SEGMENT_MASK
+   data_start = data_start & ~SEGMENT_MASK; /* (Down) to segment boundary. */
+ #else
+   data_start = data_start & ~pagemask; /* (Down) to page boundary. */
+ #endif
+ 
+   bss_end = ADDR_CORRECT (sbrk (0)) + pagemask;
+   bss_end &= ~ pagemask;
+ 
+   /* Adjust data/bss boundary. */
+   if (bss_start != 0)
+     {
+       bss_start = (ADDR_CORRECT (bss_start) + pagemask);
+       /* (Up) to page bdry. */
+       bss_start &= ~ pagemask;
+       if (bss_start > bss_end)
+ 	{
+ 	  ERROR1 ("unexec: Specified bss_start (%u) is past end of program",
+ 		  bss_start);
+ 	}
+     }
+   else
+     bss_start = bss_end;
+ 
+   if (data_start > bss_start)	/* Can't have negative data size. */
+     {
+       ERROR2 ("unexec: data_start (%u) can't be greater than bss_start (%u)",
+ 	      data_start, bss_start);
+     }
+ 
+   /* Salvage as much info from the existing file as possible */
+   if (a_out >= 0)
+     {
+       if (read (a_out, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
+ 	{
+ 	  PERROR (a_name);
+ 	}
+       block_copy_start += sizeof (f_hdr);
+       if (f_hdr.f_opthdr > 0)
+ 	{
+ 	  if (read (a_out, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
+ 	    {
+ 	      PERROR (a_name);
+ 	    }
+ 	  block_copy_start += sizeof (f_ohdr);
+ 	}
+       /* Loop through section headers, copying them in */
+       for (scns = f_hdr.f_nscns; scns > 0; scns--) {
+ 	if (read (a_out, &scntemp, sizeof (scntemp)) != sizeof (scntemp))
+ 	  {
+ 	    PERROR (a_name);
+ 	  }
+ 	if (scntemp.s_scnptr > 0L)
+ 	  {
+             if (block_copy_start < scntemp.s_scnptr + scntemp.s_size)
+ 	      block_copy_start = scntemp.s_scnptr + scntemp.s_size;
+ 	  }
+ 	if (strcmp (scntemp.s_name, ".text") == 0)
+ 	  {
+ 	    f_thdr = scntemp;
+ 	  }
+ 	else if (strcmp (scntemp.s_name, ".ident") == 0)
+ 	  {
+ 	    f_ihdr = scntemp;
+ 	  }
+ 	else if (strcmp (scntemp.s_name, ".data") == 0)
+ 	  {
+ 	    f_dhdr = scntemp;
+ 	  }
+ 	else if (strcmp (scntemp.s_name, ".bss") == 0)
+ 	  {
+ 	    f_bhdr = scntemp;
+ 	  }
+ 	else if (strcmp (scntemp.s_name, ".symtab") == 0)
+ 	  {
+ 	    f_shdr = scntemp;
+ 	  }
+       }
+     }
+   else
+     {
+       ERROR0 ("can't build a COFF file from scratch yet");
+     }
+ 
+   /* Now we alter the contents of all the f_*hdr variables
+      to correspond to what we want to dump.  */
+ 
+   f_hdr.f_flags |= (
+ #ifndef titan
+ 		    F_RELFLG | 
+ #endif
+ 		    F_EXEC);
+ #ifdef EXEC_MAGIC
+   f_ohdr.magic = EXEC_MAGIC;
+ #endif
+ #ifndef NO_REMAP
+   f_ohdr.text_start = (long) start_of_text ();
+   f_ohdr.tsize = data_start - f_ohdr.text_start;
+   f_ohdr.data_start = data_start;
+ #endif /* NO_REMAP */
+   f_ohdr.dsize = bss_start - f_ohdr.data_start;
+   f_ohdr.bsize = bss_end - bss_start;
+ #ifdef SECTION_ALIGNMENT
+   /* Some systems require special alignment
+      of the sections in the file itself.  */
+   f_thdr.s_scnptr
+     = (f_thdr.s_scnptr + SECTION_ALIGNMENT) & ~SECTION_ALIGNMENT;
+ #endif /* SECTION_ALIGNMENT */
+   text_scnptr = f_thdr.s_scnptr;
+   f_dhdr.s_paddr = f_ohdr.data_start;
+   f_dhdr.s_vaddr = f_ohdr.data_start;
+   f_dhdr.s_size = f_ohdr.dsize;
+   f_dhdr.s_scnptr = f_thdr.s_scnptr + f_thdr.s_size;
+ #ifdef SECTION_ALIGNMENT
+   /* Some systems require special alignment
+      of the sections in the file itself.  */
+   f_dhdr.s_scnptr
+     = (f_dhdr.s_scnptr + SECTION_ALIGNMENT) & ~SECTION_ALIGNMENT;
+ #endif /* SECTION_ALIGNMENT */
+ #ifdef DATA_SECTION_ALIGNMENT
+   /* Some systems require special alignment
+      of the data section only.  */
+   f_dhdr.s_scnptr
+     = (f_dhdr.s_scnptr + DATA_SECTION_ALIGNMENT) & ~DATA_SECTION_ALIGNMENT;
+ #endif /* DATA_SECTION_ALIGNMENT */
+   data_scnptr = f_dhdr.s_scnptr;
+   f_bhdr.s_paddr = f_ohdr.data_start + f_ohdr.dsize;
+   f_bhdr.s_vaddr = f_ohdr.data_start + f_ohdr.dsize;
+   f_bhdr.s_size = f_ohdr.bsize;
+   f_bhdr.s_scnptr = 0L;
+   ident_scnptr = f_ihdr.s_scnptr;
+   if (f_ihdr.s_scnptr > 0L)
+     {
+       f_ihdr.s_scnptr = f_dhdr.s_scnptr + f_dhdr.s_size;
+ #ifdef DATA_SECTION_ALIGNMENT
+       f_ihdr.s_scnptr = (f_ihdr.s_scnptr + DATA_SECTION_ALIGNMENT)
+ 	& ~DATA_SECTION_ALIGNMENT;
+ #endif
+       start_next_section = f_ihdr.s_scnptr + f_ihdr.s_size;
+     }
+   symtab_scnptr = f_shdr.s_scnptr;
+   if (f_shdr.s_scnptr > 0L) /* symbol section */
+     {
+       f_shdr.s_scnptr = start_next_section;
+       start_next_section = f_shdr.s_scnptr + f_shdr.s_size;
+     }
+   symptr_scnptr = f_hdr.f_symptr;
+   if (f_hdr.f_symptr > 0L)
+     {
+       f_hdr.f_symptr = start_next_section;
+     }
+ 
+ #ifdef ADJUST_EXEC_HEADER
+   ADJUST_EXEC_HEADER
+ #endif /* ADJUST_EXEC_HEADER */
+ 
+   if (write (new, &f_hdr, sizeof (f_hdr)) != sizeof (f_hdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   if (write (new, &f_ohdr, sizeof (f_ohdr)) != sizeof (f_ohdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   if (write (new, &f_thdr, sizeof (f_thdr)) != sizeof (f_thdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   if (write (new, &f_dhdr, sizeof (f_dhdr)) != sizeof (f_dhdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   if (write (new, &f_ihdr, sizeof (f_ihdr)) != sizeof (f_ihdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   if (write (new, &f_shdr, sizeof (f_shdr)) != sizeof (f_shdr))
+     {
+       PERROR (new_name);
+     }
+ 
+   return (0);
+ }
+ 
+ /* ****************************************************************
+  * copy_text_and_data
+  *
+  * Copy the text and data segments from memory to the new a.out
+  */
+ static int
+ copy_text_and_data (new)
+      int new;
+ {
+   register char *end;
+   register char *ptr;
+ 
+   lseek (new, (long) text_scnptr, 0);
+ /* The titan stores its headers in the text segment. Also, we have to
+    avoid reading the floating point stuff, which is located at the
+    beginning of the data segment. */
+   
+   ptr = (char *) f_thdr.s_vaddr;
+   end = ptr + f_thdr.s_size;
+   write_segment (new, ptr, end);
+   printf("copied text segment from [%x-%x] to xemacs\n", (int)ptr, (int)end);
+   lseek (new, (long) (data_scnptr + (DATA_START - f_ohdr.data_start)), 0);
+   printf("seeked to %x\n", (int)(data_scnptr + (DATA_START -
+ 					      f_ohdr.data_start)));
+   ptr = (char *)DATA_START;
+   end = ptr + f_ohdr.dsize;
+   write_segment (new, ptr, end);
+   printf("copied data segment from [%x-%x] to xemacs\n", (int)ptr, (int)end);
+   return 0;
+ }
+ 
+ write_segment (new, ptr, end)
+      int new;
+      register char *ptr, *end;
+ {
+   register int i, nwrite, ret;
+   char buf[80];
+   extern int errno;
+   char zeros[128];
+ 
+   bzero (zeros, sizeof zeros);
+ 
+   for (i = 0; ptr < end;)
+     {
+       /* distance to next multiple of 128.  */
+       nwrite = (((int) ptr + 128) & -128) - (int) ptr;
+       /* But not beyond specified end.  */
+       if (nwrite > end - ptr) nwrite = end - ptr;
+       ret = write (new, ptr, nwrite);
+       /* If write gets a page fault, it means we reached
+ 	 a gap between the old text segment and the old data segment.
+ 	 This gap has probably been remapped into part of the text segment.
+ 	 So write zeros for it.  */
+       if (ret == -1 && errno == EFAULT)
+ 	write (new, zeros, nwrite);
+       else if (nwrite != ret)
+ 	{
+ 	  sprintf (buf,
+ 		   "unexec write failure: addr 0x%x, fileno %d, size 0x%x, wrote 0x%x, errno %d",
+ 		   ptr, new, nwrite, ret, errno);
+ 	  PERROR (buf);
+ 	}
+       i += nwrite;
+       ptr += nwrite;
+     }
+ }
+ 
+ /* ****************************************************************
+  * copy_sym
+  *
+  * Copy the relocation information and symbol table from the a.out to the new
+  */
+ static int
+ copy_sym (new, a_out, a_name, new_name)
+      int new, a_out;
+      char *a_name, *new_name;
+ {
+ #define SIZE 8192
+   char page[SIZE];
+   int n,newsyms,symrel;
+   char * ptr;
+   char * end;
+ 
+   if (a_out < 0)
+     return 0;
+ 
+   if (SYMS_START == 0L)
+     return 0;
+ 
+ 
+ /* Copy .ident section */
+   if(ident_scnptr > 0)
+     {
+       lseek(a_out, ident_scnptr, 0);
+       printf( "seeking to 0x%x (start of .ident) in %s\n", 
+ 	     ident_scnptr,a_name);
+       lseek (new, (long) f_ihdr.s_scnptr, 0);
+       printf( "seeking to 0x%x (start of .ident) in %s\n", 
+ 	     f_ihdr.s_scnptr,new_name);
+       if ( (n = read(a_out, page, SIZE)) < 0)
+ 	PERROR("reading .ident section");
+       do
+ 	{
+ 	  ptr = (char *) page;
+ 	  end = ptr + n;
+ 	  write_segment (new, ptr, end);
+ 	  if( (n = read(a_out, page, SIZE)) < 0)
+ 	    PERROR("reading .ident section");
+ 	} while (n != 0);  
+     }
+ 
+ /* Copy symtab section */
+   if(symtab_scnptr > 0)
+     {
+       lseek(a_out, symtab_scnptr, 0);
+       printf( "seeking to 0x%x (start of .symtab) in %s\n", 
+ 	     symtab_scnptr,a_name);
+       lseek (new, (long) f_shdr.s_scnptr, 0);
+       printf( "seeking to 0x%x (start of .symtab) in %s\n", 
+ 	     f_shdr.s_scnptr,new_name);
+       if ( (n = read(a_out, page, SIZE)) < 0)
+ 	PERROR("reading .symtab section");
+       do
+ 	{
+ 	  ptr = (char *) page;
+ 	  end = ptr + n;
+ 	  write_segment (new, ptr, end);
+ 	  if( (n = read(a_out, page, SIZE)) < 0)
+ 	    PERROR("reading .ident section");
+ 	} while (n != 0);  
+     }
+ 
+ /* Copy & adjust symptr section */
+   if(symptr_scnptr>0)
+     {
+       lseek(a_out, symptr_scnptr, 0);
+       printf( "seeking to 0x%x (start of .symptr) in %s\n", 
+ 	     symptr_scnptr,a_name);
+       lseek (new, (long) f_hdr.f_symptr, 0);
+       printf( "seeking to 0x%x (start of .symptr) in %s\n", 
+ 	     f_hdr.f_symptr,new_name);
+       n = read(a_out, page, SIZE);
+       if (n < sizeof(SYMBOLS)) {
+ 	PERROR("reading symbols from temacs");
+       }
+ #define symhdr ((SYMBOLS *)page)
+       symrel = f_hdr.f_symptr - symptr_scnptr;
+       symhdr->strings_off += symrel;
+       if(symhdr->comini_off) /* If there is common initialized data...*/
+ 	symhdr->comini_off += symrel;
+       symhdr->address_off += symrel;
+       symhdr->symbols_off += symrel;
+ #undef symhdr
+       do
+ 	{
+ 	  ptr = (char *) page;
+ 	  end = ptr + n;
+ 	  write_segment (new, ptr, end);
+ 	  n = read(a_out, page, SIZE);
+ 	  if (n < 0) {
+ 	    PERROR("reading more symbols from temacs");
+ 	  }
+ #undef SIZE
+ 	} while (n != 0);
+     }
+  
+   return 0;
+ }
+ 
+ /* ****************************************************************
+  * mark_x
+  *
+  * After succesfully building the new a.out, mark it executable
+  */
+ static
+ mark_x (name)
+      char *name;
+ {
+   struct stat sbuf;
+   int um;
+   int new = 0;  /* for PERROR */
+ 
+   um = umask (777);
+   umask (um);
+   if (stat (name, &sbuf) == -1)
+     {
+       PERROR (name);
+     }
+   sbuf.st_mode |= 0111 & ~um;
+   if (chmod (name, sbuf.st_mode) == -1)
+     PERROR (name);
+ }
+ #endif /* not CANNOT_UNEXEC */
+ 
+ #endif /* not CANNOT_DUMP */
*** /dev/null	Tue May 14 14:10:50 1991
--- emacs-18.57/src/config.h	Tue May 14 14:37:01 1991
***************
*** 0 ****
--- 1,108 ----
+ /* GNU Emacs site configuration template file.
+    Copyright (C) 1988 Free Software Foundation, Inc.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 1, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ 
+ 
+ /* Include here a s- file that describes the system type you are using.
+    See the file ../etc/MACHINES for a list of systems and
+    the names of the s- files to use for them.
+    See s-template.h for documentation on writing s- files.  */
+ #include "s-usg5-3.h"
+ 
+ /* Include here a m- file that describes the machine and system you use.
+    See the file ../etc/MACHINES for a list of machines and
+    the names of the m- files to use for them.
+    See m-template.h for info on what m- files should define.
+    */
+ #include "m-titan.h"
+ 
+ /* Load in the conversion definitions if this system
+    needs them and the source file being compiled has not
+    said to inhibit this.  There should be no need for you
+    to alter these lines.  */
+ 
+ #ifdef SHORTNAMES
+ #ifndef NO_SHORTNAMES
+ #include "../shortnames/remap.h"
+ #endif /* not NO_SHORTNAMES */
+ #endif /* SHORTNAMES */
+ 
+ /* Define HAVE_X_WINDOWS if you want to use the X window system.  */
+ 
+ #define HAVE_X_WINDOWS 
+ 
+ /* Define X11 if you want to use version 11 of X windows.
+    Otherwise, Emacs expects to use version 10.  */
+ 
+ #define X11 
+ 
+ /* Define HAVE_X_MENU if you want to use the X window menu system.
+    This appears to work on some machines that support X
+    and not on others.  */
+ 
+ /* #define HAVE_X_MENU */
+ 
+ /* Define `subprocesses' should be defined if you want to
+    have code for asynchronous subprocesses
+    (as used in M-x compile and M-x shell).
+    These do not work for some USG systems yet;
+    for the ones where they work, the s-*.h file defines this flag.  */
+ 
+ #ifndef VMS
+ #ifndef USG
+ #define subprocesses
+ #endif
+ #endif
+ 
+ /* Define USER_FULL_NAME to return a string
+    that is the user's full name.
+    It can assume that the variable `pw'
+    points to the password file entry for this user.
+ 
+    At some sites, the pw_gecos field contains
+    the user's full name.  If neither this nor any other
+    field contains the right thing, use pw_name,
+    giving the user's login name, since that is better than nothing.  */
+ 
+ #define USER_FULL_NAME pw->pw_gecos
+ 
+ /* Define AMPERSAND_FULL_NAME if you use the convention
+    that & in the full name stands for the login id.  */
+ 
+ /* #define AMPERSAND_FULL_NAME */
+ 
+ /* # bytes of pure Lisp code to leave space for.
+    Note that s-vms.h and m-sun2.h may override this default.  */
+ 
+ #ifndef PURESIZE
+ #ifdef HAVE_X_WINDOWS
+ #define PURESIZE 122000
+ #else
+ #define PURESIZE 119000
+ #endif
+ #endif
+ 
+ /* Define HIGHPRI as a negative number
+    if you want Emacs to run at a higher than normal priority.
+    For this to take effect, you must install Emacs with setuid root.
+    Emacs will change back to the users's own uid after setting
+    its priority.  */
+ 
+ /* #define HIGHPRI */
+ 
--
+-----------+-----------------------------------------------------------------+
|mac@kpc.com| Increasing Software complexity lets us sell Mainframes as       |
|           | personal computers. Carry on, X windows/Postscript/emacs/CASE!! |
+-----------+-----------------------------------------------------------------+