summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Kennedy <mkennedy@gentoo.org>2004-05-13 15:27:43 +0000
committerMatthew Kennedy <mkennedy@gentoo.org>2004-05-13 15:27:43 +0000
commit5a5077dab6d23eccdf6ac957874ea947bc662b53 (patch)
tree2f1fa5e49b0397758ee6327d8e8034a2c734c9c8 /app-editors/emacs
parentStable on sparc (diff)
downloadhistorical-5a5077dab6d23eccdf6ac957874ea947bc662b53.tar.gz
historical-5a5077dab6d23eccdf6ac957874ea947bc662b53.tar.bz2
historical-5a5077dab6d23eccdf6ac957874ea947bc662b53.zip
retro emacs, lesstif support
Diffstat (limited to 'app-editors/emacs')
-rw-r--r--app-editors/emacs/ChangeLog13
-rw-r--r--app-editors/emacs/Manifest23
-rw-r--r--app-editors/emacs/emacs-18.59.ebuild68
-rw-r--r--app-editors/emacs/emacs-21.3-r3.ebuild97
-rw-r--r--app-editors/emacs/files/digest-emacs-18.592
-rw-r--r--app-editors/emacs/files/digest-emacs-21.3-r32
-rw-r--r--app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch175
-rw-r--r--app-editors/emacs/files/emacs-18.59-gentoo.patch96
-rw-r--r--app-editors/emacs/files/emacs-18.59-unexelf.patch878
9 files changed, 1345 insertions, 9 deletions
diff --git a/app-editors/emacs/ChangeLog b/app-editors/emacs/ChangeLog
index 2ada51ecd993..9af81ea0bab5 100644
--- a/app-editors/emacs/ChangeLog
+++ b/app-editors/emacs/ChangeLog
@@ -1,6 +1,17 @@
# ChangeLog for app-editors/emacs
# Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.24 2004/04/09 06:41:32 iggy Exp $
+# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.25 2004/05/13 15:27:43 mkennedy Exp $
+
+*emacs-21.3-r3 (13 May 2004)
+
+ 13 May 2004; <mkennedy@gentoo.org> +files/emacs-18.59-gcc-gentoo.patch,
+ +files/emacs-18.59-gentoo.patch, +files/emacs-18.59-unexelf.patch,
+ +emacs-18.59.ebuild, +emacs-21.3-r3.ebuild:
+ Added retro emacs-18.59 w/ SLOT=1 (ebuild contributed by Ulrich Mueller
+ <ulm@kph.uni-mainz.de>), resolves Bug #44766; Added new emacs-21.3-r3
+ with support for using LessTif instead of OpenMotif (OpenMotif has
+ problems which causes Emacs to be unstable); Marked emacs-21.3-r3 as
+ ~arch.
09 Apr 2004; Brian Jackson <iggy@gentoo.org> emacs-21.3-r2.ebuild:
add s390 keywords
diff --git a/app-editors/emacs/Manifest b/app-editors/emacs/Manifest
index 874b5a5174c8..943af97088e2 100644
--- a/app-editors/emacs/Manifest
+++ b/app-editors/emacs/Manifest
@@ -1,14 +1,21 @@
-MD5 41992d567140cedd24b9610aea7752ab emacs-21.1-r4.ebuild 2163
-MD5 f47004be6237b3469d35b2656875fedb emacs-21.3-r2.ebuild 2214
-MD5 5092d9743d9c4aaee8a405f5163f3793 emacs-21.2-r2.ebuild 1852
MD5 0eb1ebef92b3ccf63d7d510c5c4593ca emacs-21.3-r1.ebuild 2138
-MD5 0e802062fd237555b6407fff3d8e61de ChangeLog 3546
+MD5 5092d9743d9c4aaee8a405f5163f3793 emacs-21.2-r2.ebuild 1852
+MD5 f47004be6237b3469d35b2656875fedb emacs-21.3-r2.ebuild 2214
+MD5 7d2bade12651ca2a0abfc86836c4ca29 emacs-21.3-r3.ebuild 2352
+MD5 8490da001361199b4b285dacb264e04e emacs-18.59.ebuild 1997
+MD5 69395dee5b5051f2e0169b377a0fdaf5 ChangeLog 4068
+MD5 41992d567140cedd24b9610aea7752ab emacs-21.1-r4.ebuild 2163
MD5 fcd33d07e4ee719b01157946734f4fe8 metadata.xml 158
+MD5 e8ce9306bc0d26ebc1d4cd6c6c7765d8 files/digest-emacs-21.2-r2 126
MD5 0e5a4a35651f5365c6191636a2c26eb7 files/emacs.desktop 190
+MD5 4163870348c1c0d4dc485dff749fe5cb files/digest-emacs-21.3-r3 126
+MD5 3763ec7eaed9e5bb4da2f3f7c3795594 files/emacs-21.3-hppa.patch 2493
MD5 bb29381a50b72e88d869fb09a2c0a34e files/emacs-21.3-amd64.patch 7938
-MD5 da1e3cd3b08e0f57770ac6bb3a900a37 files/digest-emacs-21.1-r4 64
-MD5 e8ce9306bc0d26ebc1d4cd6c6c7765d8 files/digest-emacs-21.2-r2 126
-MD5 c196c1f14bc7e319f1dadb065f39bbfb files/digest-emacs-21.3-r1 323
MD5 4163870348c1c0d4dc485dff749fe5cb files/digest-emacs-21.3-r2 126
+MD5 c196c1f14bc7e319f1dadb065f39bbfb files/digest-emacs-21.3-r1 323
+MD5 da1e3cd3b08e0f57770ac6bb3a900a37 files/digest-emacs-21.1-r4 64
+MD5 f36e98b1361ca8666d3d4029f121c2bf files/emacs-18.59-gcc-gentoo.patch 5439
+MD5 2179ae07d8caf10bdb4e36126353f0b1 files/emacs-18.59-unexelf.patch 30720
+MD5 2dc071ea24db58587a5e72af42addbc4 files/digest-emacs-18.59 147
MD5 0c27886961e8f16d3889fbd36b4da14d files/emacs-21.1-gentoo.diff 532
-MD5 3763ec7eaed9e5bb4da2f3f7c3795594 files/emacs-21.3-hppa.patch 2493
+MD5 d9a84fa25df38b43cdce07e9ca4f53c0 files/emacs-18.59-gentoo.patch 3901
diff --git a/app-editors/emacs/emacs-18.59.ebuild b/app-editors/emacs/emacs-18.59.ebuild
new file mode 100644
index 000000000000..de31af6fcf4d
--- /dev/null
+++ b/app-editors/emacs/emacs-18.59.ebuild
@@ -0,0 +1,68 @@
+# Copyright 1999-2004 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/emacs-18.59.ebuild,v 1.1 2004/05/13 15:27:43 mkennedy Exp $
+
+DESCRIPTION="The extensible self-documenting text editor"
+SRC_URI="ftp://ftp.gnu.org/old-gnu/emacs/${P}.tar.gz
+ ftp://ftp.splode.com/pub/users/friedman/patches/${P}-linux22x-elf-glibc2.diff.gz"
+HOMEPAGE="http://www.gnu.org/software/emacs/"
+
+SLOT="1"
+KEYWORDS="~x86"
+LICENSE="GPL-1"
+IUSE="X"
+DEPEND="sys-libs/ncurses
+ X? ( virtual/x11 )"
+PROVIDE="virtual/editor"
+
+MY_BASEDIR="/usr/share/emacs/${PV}"
+MY_LOCKDIR="/var/lib/emacs/lock"
+
+# Do not use the sandbox, or the dumped Emacs will be twice as large
+SANDBOX_DISABLED="1"
+
+src_unpack() {
+ unpack ${A}
+ epatch ${P}-linux22x-elf-glibc2.diff
+ epatch ${FILESDIR}/${P}-unexelf.patch
+ epatch ${FILESDIR}/${P}-gentoo.patch
+ epatch ${FILESDIR}/${P}-gcc-gentoo.patch
+}
+
+src_compile() {
+ # autoconf? What's autoconf? We are living in 1992. ;-)
+ local arch
+ case ${ARCH} in
+ x86) arch=intel386 ;;
+ *) die "Architecture ${ARCH} not supported" ;;
+ esac
+ local cmd="s/\"s-.*\.h\"/\"s-linux.h\"/;s/\"m-.*\.h\"/\"m-${arch}.h\"/"
+ use X && cmd="${cmd};s/.*\(#define HAVE_X_WINDOWS\).*/\1/"
+ sed -e "${cmd}" src/config.h-dist >src/config.h
+
+ cat <<-END >src/paths.h
+ #define PATH_LOADSEARCH "${MY_BASEDIR}/lisp"
+ #define PATH_EXEC "${MY_BASEDIR}/etc"
+ #define PATH_LOCK "${MY_LOCKDIR}/"
+ #define PATH_SUPERLOCK "${MY_LOCKDIR}/!!!SuperLock!!!"
+ END
+
+ emake -j1 || die
+}
+
+src_install() {
+ dodir ${MY_BASEDIR}
+ dodir /usr/share/man/man1
+ make install LIBDIR=${D}${MY_BASEDIR} BINDIR=${D}/usr/bin \
+ MANDIR=${D}/usr/share/man/man1 || die
+ chmod -R go-w ${D}${MY_BASEDIR}
+ rmdir ${D}${MY_BASEDIR}/lock
+
+ dodir ${MY_LOCKDIR%/*}
+ diropts -m0777
+ dodir ${MY_LOCKDIR}
+ keepdir ${MY_LOCKDIR}
+
+ for file in ${D}/usr/bin/*; do mv ${file} ${file}-${PV}; done
+ mv ${D}/usr/share/man/man1/emacs.1 ${D}/usr/share/man/man1/emacs-${PV}.1
+}
diff --git a/app-editors/emacs/emacs-21.3-r3.ebuild b/app-editors/emacs/emacs-21.3-r3.ebuild
new file mode 100644
index 000000000000..20d52305ea9b
--- /dev/null
+++ b/app-editors/emacs/emacs-21.3-r3.ebuild
@@ -0,0 +1,97 @@
+# Copyright 1999-2004 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/emacs-21.3-r3.ebuild,v 1.1 2004/05/13 15:27:43 mkennedy Exp $
+
+inherit flag-o-matic eutils
+
+DESCRIPTION="An incredibly powerful, extensible text editor"
+HOMEPAGE="http://www.gnu.org/software/emacs"
+SRC_URI="mirror://gnu/emacs/${P}.tar.gz
+ leim? ( mirror://gnu/emacs/leim-${PV}.tar.gz )"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~x86 ~ppc ~sparc -alpha ~amd64 -hppa -ia64 ~s390"
+IUSE="X nls motif leim gnome Xaw3d lesstif"
+
+RDEPEND="sys-libs/ncurses
+ sys-libs/gdbm
+ X? ( virtual/x11
+ >=media-libs/libungif-4.1.0.1b
+ >=media-libs/jpeg-6b-r2
+ >=media-libs/tiff-3.5.5-r3
+ >=media-libs/libpng-1.2.1
+ Xaw3d? ( x11-libs/Xaw3d )
+ motif? ( lesstif? ( x11-libs/lesstif ) : ( >=x11-libs/openmotif-2.1.30 ) )
+ gnome? ( gnome-base/gnome-desktop )
+ )
+ nls? ( sys-devel/gettext )"
+DEPEND="${RDEPEND}
+ >=sys-devel/autoconf-2.58"
+
+PROVIDE="virtual/emacs virtual/editor"
+SANDBOX_DISABLED="1"
+
+DFILE=emacs.desktop
+
+src_compile() {
+
+ # -fstack-protector gets internal compiler error at xterm.c (bug 33265)
+ filter-flags -fstack-protector
+
+ epatch ${FILESDIR}/${P}-amd64.patch
+ epatch ${FILESDIR}/${P}-hppa.patch
+
+ export WANT_AUTOCONF=2.1
+ autoconf
+
+ local myconf
+ use nls || myconf="${myconf} --disable-nls"
+ if use X ; then
+ if use motif && use lesstif; then
+ export LIBS="-L/usr/X11R6/lib/lesstif/"
+ fi
+ myconf="${myconf}
+ --with-x
+ --with-xpm
+ --with-jpeg
+ --with-tiff
+ --with-gif
+ --with-png"
+ if [ "`use motif`" ] ; then
+ myconf="${myconf} --with-x-toolkit=motif"
+ elif [ "`use Xaw3d`" ] ; then
+ myconf="${myconf} --with-x-toolkit=athena"
+ else
+ # do not build emacs with any toolkit, bug 35300
+ myconf="${myconf} --with-x-toolkit=no"
+ fi
+ else
+ myconf="${myconf} --without-x"
+ fi
+ econf ${myconf} || die
+ emake || die
+}
+
+src_install() {
+ einstall || die
+ einfo "Fixing info documentation..."
+ rm -f ${D}/usr/share/info/dir
+ for i in ${D}/usr/share/info/*
+ do
+ mv ${i%.info} $i.info
+ done
+
+ einfo "Fixing permissions..."
+ find ${D} -perm 664 |xargs chmod 644
+ find ${D} -type d |xargs chmod 755
+
+ dodoc BUGS ChangeLog README
+
+ keepdir /usr/share/emacs/${PV}/leim
+
+ if use gnome ; then
+ insinto /usr/share/gnome/apps/Application
+ doins ${FILESDIR}/${DFILE}
+ fi
+}
diff --git a/app-editors/emacs/files/digest-emacs-18.59 b/app-editors/emacs/files/digest-emacs-18.59
new file mode 100644
index 000000000000..5dc7708b786e
--- /dev/null
+++ b/app-editors/emacs/files/digest-emacs-18.59
@@ -0,0 +1,2 @@
+MD5 ca57ae095ef098faca135bca736e1ca8 emacs-18.59.tar.gz 2962652
+MD5 a7a4ed051dc232cdc9cf37208135302a emacs-18.59-linux22x-elf-glibc2.diff.gz 15671
diff --git a/app-editors/emacs/files/digest-emacs-21.3-r3 b/app-editors/emacs/files/digest-emacs-21.3-r3
new file mode 100644
index 000000000000..7aafc8e2fda1
--- /dev/null
+++ b/app-editors/emacs/files/digest-emacs-21.3-r3
@@ -0,0 +1,2 @@
+MD5 a0bab457cbf5b4f8eb99d1d0a3ada420 emacs-21.3.tar.gz 20399831
+MD5 1c968c37e22be0f0d8f8cd57cebe5a5e leim-21.3.tar.gz 3291224
diff --git a/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch b/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch
new file mode 100644
index 000000000000..ac825f7896c0
--- /dev/null
+++ b/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch
@@ -0,0 +1,175 @@
+Only in emacs-18.59/etc: DOC
+Only in emacs-18.59/etc: DOC-18.59.1
+Files emacs-18.59.orig/etc/ctags and emacs-18.59/etc/ctags differ
+Only in emacs-18.59/etc: cvtmail
+Files emacs-18.59.orig/etc/digest-doc and emacs-18.59/etc/digest-doc differ
+Only in emacs-18.59/etc: emacsclient
+Only in emacs-18.59/etc: env
+diff -ur emacs-18.59.orig/etc/etags.c emacs-18.59/etc/etags.c
+--- emacs-18.59.orig/etc/etags.c 2004-05-12 19:51:20.263954648 -0500
++++ emacs-18.59/etc/etags.c 2004-05-12 19:54:07.018604088 -0500
+@@ -128,8 +128,6 @@
+
+ char *savestr();
+ char *savenstr ();
+-char *rindex();
+-char *index();
+ char *concat ();
+ void initbuffer ();
+ long readline ();
+@@ -1380,7 +1378,6 @@
+ char *defenv;
+ {
+ register char *env, *p;
+- extern char *savenstr (), *index ();
+
+ struct TEX_tabent *tab;
+ int size, i;
+@@ -1530,47 +1527,6 @@
+ return dp;
+ }
+
+-/*
+- * Return the ptr in sp at which the character c last
+- * appears; NULL if not found
+- *
+- * Identical to v7 rindex, included for portability.
+- */
+-
+-char *
+-rindex(sp, c)
+- register char *sp, c;
+-{
+- register char *r;
+-
+- r = NULL;
+- do
+- {
+- if (*sp == c)
+- r = sp;
+- } while (*sp++);
+- return(r);
+-}
+-
+-/*
+- * Return the ptr in sp at which the character c first
+- * appears; NULL if not found
+- *
+- * Identical to v7 index, included for portability.
+- */
+-
+-char *
+-index(sp, c)
+- register char *sp, c;
+-{
+- do
+- {
+- if (*sp == c)
+- return (sp);
+- } while (*sp++);
+- return (NULL);
+-}
+-
+ /* Print error message and exit. */
+
+ fatal (s1, s2)
+Only in emacs-18.59/etc: fakemail
+Files emacs-18.59.orig/etc/make-docfile and emacs-18.59/etc/make-docfile differ
+Only in emacs-18.59/etc: movemail
+Only in emacs-18.59/etc: server
+Files emacs-18.59.orig/etc/sorted-doc and emacs-18.59/etc/sorted-doc differ
+Files emacs-18.59.orig/etc/wakeup and emacs-18.59/etc/wakeup differ
+Only in emacs-18.59/etc: yow
+diff -ur emacs-18.59.orig/lisp/version.el emacs-18.59/lisp/version.el
+--- emacs-18.59.orig/lisp/version.el 2004-05-12 19:51:09.078655072 -0500
++++ emacs-18.59/lisp/version.el 2004-05-12 19:57:25.812382840 -0500
+@@ -20,7 +20,7 @@
+
+ ;; The following line is modified automatically
+ ;; by loading inc-version.el, each time a new Emacs is dumped.
+-(defconst emacs-version "18.59.0" "\
++(defconst emacs-version "18.59.1" "\
+ Version numbers of this version of Emacs.")
+
+ (defconst emacs-build-time (current-time-string) "\
+Only in emacs-18.59/src: abbrev.o
+Only in emacs-18.59/src: alloc.o
+Only in emacs-18.59/src: buffer.o
+Only in emacs-18.59/src: bytecode.o
+Only in emacs-18.59/src: callint.o
+Only in emacs-18.59/src: callproc.o
+Only in emacs-18.59/src: casefiddle.o
+Only in emacs-18.59/src: cm.o
+Only in emacs-18.59/src: cmds.o
+Only in emacs-18.59/src: config.h
+Only in emacs-18.59/src: data.o
+Only in emacs-18.59/src: dired.o
+Only in emacs-18.59/src: dispnew.o
+Only in emacs-18.59/src: doc.o
+Only in emacs-18.59/src: doprnt.o
+Only in emacs-18.59/src: editfns.o
+Only in emacs-18.59/src: emacs-18.59.1
+Only in emacs-18.59/src: emacs.o
+Only in emacs-18.59/src: eval.o
+Only in emacs-18.59/src: fileio.o
+Only in emacs-18.59/src: filelock.o
+Only in emacs-18.59/src: filemode.o
+Only in emacs-18.59/src: fns.o
+Only in emacs-18.59/src: indent.o
+Only in emacs-18.59/src: insdel.o
+Only in emacs-18.59/src: keyboard.o
+Only in emacs-18.59/src: keymap.o
+Only in emacs-18.59/src: lastfile.o
+diff -ur emacs-18.59.orig/src/lisp.h emacs-18.59/src/lisp.h
+--- emacs-18.59.orig/src/lisp.h 2004-05-12 19:51:10.200484528 -0500
++++ emacs-18.59/src/lisp.h 2004-05-12 19:56:52.999371176 -0500
+@@ -983,7 +983,7 @@
+
+ extern void debugger ();
+
+-extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd ();
++/* extern void *malloc (), *realloc (),*getenv (), *ctime (), *getwd (); */
+ extern long *xmalloc (), *xrealloc ();
+
+ #ifdef MAINTAIN_ENVIRONMENT
+Only in emacs-18.59/src: lisp.h~
+Only in emacs-18.59/src: lread.o
+Only in emacs-18.59/src: macros.o
+Only in emacs-18.59/src: malloc.o
+Only in emacs-18.59/src: marker.o
+Only in emacs-18.59/src: minibuf.o
+Only in emacs-18.59/src: mocklisp.o
+Only in emacs-18.59/src: paths.h
+Only in emacs-18.59/src: pre-crt0.o
+Only in emacs-18.59/src: print.o
+Only in emacs-18.59/src: process.o
+Only in emacs-18.59/src: regex.o
+diff -ur emacs-18.59.orig/src/s-linux.h emacs-18.59/src/s-linux.h
+--- emacs-18.59.orig/src/s-linux.h 2004-05-12 19:51:09.959521160 -0500
++++ emacs-18.59/src/s-linux.h 2004-05-12 20:03:12.614660880 -0500
+@@ -253,7 +253,7 @@
+
+ #define C_COMPILER gcc
+ #define C_DEBUG_SWITCH -g
+-#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2
++#define C_OPTIMIZE_SWITCH -O2 -falign-loops=2 -falign-jumps=2 -falign-functions=2
+ #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o
+ #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o
+ #define LIBS_DEBUG /* override in config.h to include -lg */
+Only in emacs-18.59/src: s-linux.h~
+Only in emacs-18.59/src: scroll.o
+Only in emacs-18.59/src: search.o
+Only in emacs-18.59/src: syntax.o
+Only in emacs-18.59/src: sysdep.o
+Only in emacs-18.59/src: temacs
+Only in emacs-18.59/src: term.o
+Only in emacs-18.59/src: terminfo.o
+Only in emacs-18.59/src: undo.o
+Only in emacs-18.59/src: unexelf.o
+Only in emacs-18.59/src: window.o
+Only in emacs-18.59/src: x11fns.o
+Only in emacs-18.59/src: x11term.o
+Only in emacs-18.59/src: xdisp.o
+Only in emacs-18.59/src: xemacs
+Only in emacs-18.59/src: xmakefile
+Only in emacs-18.59/src: xmakefile~
diff --git a/app-editors/emacs/files/emacs-18.59-gentoo.patch b/app-editors/emacs/files/emacs-18.59-gentoo.patch
new file mode 100644
index 000000000000..0b6d94acd981
--- /dev/null
+++ b/app-editors/emacs/files/emacs-18.59-gentoo.patch
@@ -0,0 +1,96 @@
+Prereq: 2004-03-08
+diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog
+--- emacs-18.59-orig/src/ChangeLog 2004-03-08 09:38:50.000000000 +0100
++++ emacs-18.59/src/ChangeLog 2004-03-09 08:36:49.000000000 +0100
+@@ -1,3 +1,9 @@
++2004-03-09 Ulrich Mueller <ulm@kph.uni-mainz.de>
++
++ * malloc.c (DONT_DEFINE_SIGNAL): Defined.
++
++ * s-linux.h (TERMINFO): Moved here from ymakefile.
++
+ 2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de>
+
+ * unexelf.c: Replaced with version from Emacs 21.3.
+diff -Nur emacs-18.59-orig/src/malloc.c emacs-18.59/src/malloc.c
+--- emacs-18.59-orig/src/malloc.c 1992-03-23 05:09:07.000000000 +0100
++++ emacs-18.59/src/malloc.c 2004-03-09 08:33:12.000000000 +0100
+@@ -59,6 +59,9 @@
+ */
+
+ #ifdef emacs
++/* Inhibit macro definition of "signal" in m-*.h */
++#define DONT_DEFINE_SIGNAL
++
+ /* config.h specifies which kind of system this is. */
+ #include "config.h"
+
+diff -Nur emacs-18.59-orig/src/s-linux.h emacs-18.59/src/s-linux.h
+--- emacs-18.59-orig/src/s-linux.h 1999-11-05 09:17:23.000000000 +0100
++++ emacs-18.59/src/s-linux.h 2004-03-09 08:34:05.000000000 +0100
+@@ -164,6 +164,9 @@
+ #define POSIX /* affects only getpagesize.h */
+ #define POSIX_SIGNALS /* uses sigaction from sys_signal */
+
++/* Use terminfo instead of termcap. */
++#define TERMINFO
++
+ #ifdef HAVE_PTMX
+
+ /* This change means that we don't loop through allocate_pty too many
+@@ -250,7 +253,7 @@
+
+ #define C_COMPILER gcc
+ #define C_DEBUG_SWITCH -g
+-#define C_OPTIMIZE_SWITCH -O3 -malign-loops=2 -malign-jumps=2 -malign-functions=2
++#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2
+ #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o
+ #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o
+ #define LIBS_DEBUG /* override in config.h to include -lg */
+diff -Nur emacs-18.59-orig/src/ymakefile emacs-18.59/src/ymakefile
+--- emacs-18.59-orig/src/ymakefile 1999-11-05 09:19:47.000000000 +0100
++++ emacs-18.59/src/ymakefile 2003-11-13 08:35:38.000000000 +0100
+@@ -191,7 +191,7 @@
+ SHORT= shortnames
+ #endif /* SHORTNAMES */
+
+-CFLAGS= C_DEBUG_SWITCH C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
++CFLAGS= C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
+ /* DO NOT use -R. There is a special hack described in lastfile.c
+ which is used instead. Some initialized data areas are modified
+ at initial startup, then labeled as part of the text area when
+@@ -284,7 +284,6 @@
+ process.o callproc.o $(environobj) \
+ doprnt.o
+
+-#define TERMINFO
+ #ifdef TERMINFO
+ /* Used to be -ltermcap here. If your machine needs that,
+ define LIBS_TERMCAP in the m- file. */
+diff -Nur emacs-18.59-orig/lisp/ChangeLog emacs-18.59/lisp/ChangeLog
+--- emacs-18.59-orig/lisp/ChangeLog 1992-10-31 01:32:00.000000000 +0100
++++ emacs-18.59/lisp/ChangeLog 2004-03-08 09:37:21.000000000 +0100
+@@ -1,3 +1,9 @@
++2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de>
++
++ * term/linux.el: New file.
++
++ * term/xterm.el: Load vt200.el.
++
+ Fri Oct 30 19:36:38 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
+
+ * Version 18.59 released.
+diff -Nur emacs-18.59-orig/lisp/term/linux.el emacs-18.59/lisp/term/linux.el
+--- emacs-18.59-orig/lisp/term/linux.el 1970-01-01 01:00:00.000000000 +0100
++++ emacs-18.59/lisp/term/linux.el 2003-11-29 21:37:15.000000000 +0100
+@@ -0,0 +1,2 @@
++(load (concat term-file-prefix "vt200") nil t)
++(enable-arrow-keys)
+diff -Nur emacs-18.59-orig/lisp/term/xterm.el emacs-18.59/lisp/term/xterm.el
+--- emacs-18.59-orig/lisp/term/xterm.el 1989-04-27 03:52:39.000000000 +0200
++++ emacs-18.59/lisp/term/xterm.el 2003-11-29 21:37:15.000000000 +0100
+@@ -1,2 +1,2 @@
+-;; Don't send the `ti' string when screen is cleared.
+-(setq reset-terminal-on-clear nil)
++(load (concat term-file-prefix "vt200") nil t)
++(enable-arrow-keys)
diff --git a/app-editors/emacs/files/emacs-18.59-unexelf.patch b/app-editors/emacs/files/emacs-18.59-unexelf.patch
new file mode 100644
index 000000000000..66aa78a7f01b
--- /dev/null
+++ b/app-editors/emacs/files/emacs-18.59-unexelf.patch
@@ -0,0 +1,878 @@
+Prereq: 1999-11-05
+diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog
+--- emacs-18.59-orig/src/ChangeLog 1999-11-05 09:19:56.000000000 +0100
++++ emacs-18.59/src/ChangeLog 2004-03-08 09:38:50.000000000 +0100
+@@ -1,3 +1,7 @@
++2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de>
++
++ * unexelf.c: Replaced with version from Emacs 21.3.
++
+ 1999-11-05 Noah Friedman <friedman@splode.com>
+
+ * ymakefile [LIBS_TERMCAP]: Use -lncurses, not -lcurses.
+diff -Nur emacs-18.59-orig/src/unexelf.c emacs-18.59/src/unexelf.c
+--- emacs-18.59-orig/src/unexelf.c 1998-05-31 04:35:54.000000000 +0200
++++ emacs-18.59/src/unexelf.c 2004-03-08 01:18:54.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992
++/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 01, 02
+ Free Software Foundation, Inc.
+
+ This file is part of GNU Emacs.
+@@ -33,14 +33,14 @@
+ * Modified heavily since then.
+ *
+ * Synopsis:
+- * unexec (new_name, a_name, data_start, bss_start, entry_address)
+- * char *new_name, *a_name;
++ * unexec (new_name, old_name, data_start, bss_start, entry_address)
++ * char *new_name, *old_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.
++ * If old_name is non-NULL, the symbol table will be taken from the given file.
++ * On some machines, an existing old_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.
+@@ -52,11 +52,6 @@
+ * 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
+@@ -66,9 +61,6 @@
+ *
+ * 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
+- *
+ */
+
+ /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co.
+@@ -412,22 +404,159 @@
+
+ */
+
++/*
++ * Modified by rdh@yottayotta.com of Yotta Yotta Incorporated.
++ *
++ * The code originally used mmap() to create a memory image of the new
++ * and old object files. This had a few handy features: (1) you get
++ * to use a cool system call like mmap, (2) no need to explicitly
++ * write out the new file before the close, and (3) no swap space
++ * requirements. Unfortunately, mmap() often fails to work with
++ * nfs-mounted file systems.
++ *
++ * So, instead of relying on the vm subsystem to do the file i/o for
++ * us, it's now done explicitly. A buffer of the right size for the
++ * file is dynamically allocated, and either the old_name is read into
++ * it, or it is initialized with the correct new executable contents,
++ * and then written to new_name.
++ */
++
++#ifndef emacs
++#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
++#include <string.h>
++#else
++#include "config.h"
++extern void fatal (char *, ...);
++#endif
++
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <sys/stat.h>
+ #include <memory.h>
+-#include <string.h>
+ #include <errno.h>
+ #include <unistd.h>
+ #include <fcntl.h>
++#if !defined (__NetBSD__) && !defined (__OpenBSD__)
+ #include <elf.h>
++#endif
+ #include <sys/mman.h>
+-
+-#ifndef emacs
+-#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
++#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
++#include <sys/elf_mips.h>
++#include <sym.h>
++#endif /* __sony_news && _SYSTYPE_SYSV */
++#if __sgi
++#include <syms.h> /* for HDRR declaration */
++#endif /* __sgi */
++
++#ifndef MAP_ANON
++#ifdef MAP_ANONYMOUS
++#define MAP_ANON MAP_ANONYMOUS
+ #else
+-#include "config.h"
+-extern void fatal (char *, ...);
++#define MAP_ANON 0
++#endif
++#endif
++
++#ifndef MAP_FAILED
++#define MAP_FAILED ((void *) -1)
++#endif
++
++#if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
++/* Declare COFF debugging symbol table. This used to be in
++ /usr/include/sym.h, but this file is no longer included in Red Hat
++ 5.0 and presumably in any other glibc 2.x based distribution. */
++typedef struct {
++ short magic;
++ short vstamp;
++ int ilineMax;
++ int idnMax;
++ int ipdMax;
++ int isymMax;
++ int ioptMax;
++ int iauxMax;
++ int issMax;
++ int issExtMax;
++ int ifdMax;
++ int crfd;
++ int iextMax;
++ long cbLine;
++ long cbLineOffset;
++ long cbDnOffset;
++ long cbPdOffset;
++ long cbSymOffset;
++ long cbOptOffset;
++ long cbAuxOffset;
++ long cbSsOffset;
++ long cbSsExtOffset;
++ long cbFdOffset;
++ long cbRfdOffset;
++ long cbExtOffset;
++} HDRR, *pHDRR;
++#define cbHDRR sizeof(HDRR)
++#define hdrNil ((pHDRR)0)
++#endif
++
++#ifdef __NetBSD__
++/*
++ * NetBSD does not have normal-looking user-land ELF support.
++ */
++# if defined __alpha__ || defined __sparc_v9__
++# define ELFSIZE 64
++# else
++# define ELFSIZE 32
++# endif
++# include <sys/exec_elf.h>
++
++# ifndef PT_LOAD
++# define PT_LOAD Elf_pt_load
++# if 0 /* was in pkgsrc patches for 20.7 */
++# define SHT_PROGBITS Elf_sht_progbits
++# endif
++# define SHT_SYMTAB Elf_sht_symtab
++# define SHT_DYNSYM Elf_sht_dynsym
++# define SHT_NULL Elf_sht_null
++# define SHT_NOBITS Elf_sht_nobits
++# define SHT_REL Elf_sht_rel
++# define SHT_RELA Elf_sht_rela
++
++# define SHN_UNDEF Elf_eshn_undefined
++# define SHN_ABS Elf_eshn_absolute
++# define SHN_COMMON Elf_eshn_common
++# endif /* !PT_LOAD */
++
++# ifdef __alpha__
++# include <sys/exec_ecoff.h>
++# define HDRR struct ecoff_symhdr
++# define pHDRR HDRR *
++# endif /* __alpha__ */
++
++#ifdef __mips__ /* was in pkgsrc patches for 20.7 */
++# define SHT_MIPS_DEBUG DT_MIPS_FLAGS
++# define HDRR struct Elf_Shdr
++#endif /* __mips__ */
++#endif /* __NetBSD__ */
++
++#ifdef __OpenBSD__
++# include <sys/exec_elf.h>
++#endif
++
++#if __GNU_LIBRARY__ - 0 >= 6
++# include <link.h> /* get ElfW etc */
++#endif
++
++#ifndef ElfW
++# ifdef __STDC__
++# define ElfBitsW(bits, type) Elf##bits##_##type
++# else
++# define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type
++# endif
++# ifdef _LP64
++# define ELFSIZE 64
++# else
++# define ELFSIZE 32
++# endif
++ /* This macro expands `bits' before invoking ElfBitsW. */
++# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type)
++# define ElfW(type) ElfExpandBitsW (ELFSIZE, type)
+ #endif
+
+ #ifndef ELF_BSS_SECTION_NAME
+@@ -462,13 +591,13 @@
+ */
+
+ #define OLD_SECTION_H(n) \
+- (*(Elf32_Shdr *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
++ (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
+ #define NEW_SECTION_H(n) \
+- (*(Elf32_Shdr *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
++ (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
+ #define OLD_PROGRAM_H(n) \
+- (*(Elf32_Phdr *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
++ (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
+ #define NEW_PROGRAM_H(n) \
+- (*(Elf32_Phdr *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
++ (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
+
+ #define PATCH_INDEX(n) \
+ do { \
+@@ -478,9 +607,9 @@
+
+ /* Round X up to a multiple of Y. */
+
+-int
++static ElfW(Addr)
+ round_up (x, y)
+- int x, y;
++ ElfW(Addr) x, y;
+ {
+ int rem = x % y;
+ if (rem == 0)
+@@ -488,6 +617,45 @@
+ return x - rem + y;
+ }
+
++/* Return the index of the section named NAME.
++ SECTION_NAMES, FILE_NAME and FILE_H give information
++ about the file we are looking in.
++
++ If we don't find the section NAME, that is a fatal error
++ if NOERROR is 0; we return -1 if NOERROR is nonzero. */
++
++static int
++find_section (name, section_names, file_name, old_file_h, old_section_h, noerror)
++ char *name;
++ char *section_names;
++ char *file_name;
++ ElfW(Ehdr) *old_file_h;
++ ElfW(Shdr) *old_section_h;
++ int noerror;
++{
++ int idx;
++
++ for (idx = 1; idx < old_file_h->e_shnum; idx++)
++ {
++#ifdef DEBUG
++ fprintf (stderr, "Looking for %s - found %s\n", name,
++ section_names + OLD_SECTION_H (idx).sh_name);
++#endif
++ if (!strcmp (section_names + OLD_SECTION_H (idx).sh_name,
++ name))
++ break;
++ }
++ if (idx == old_file_h->e_shnum)
++ {
++ if (noerror)
++ return -1;
++ else
++ fatal ("Can't find %s in %s.\n", name, file_name);
++ }
++
++ return idx;
++}
++
+ /* ****************************************************************
+ * unexec
+ *
+@@ -507,25 +675,36 @@
+ /* Pointers to the base of the image of the two files. */
+ caddr_t old_base, new_base;
+
++#if MAP_ANON == 0
++ int mmap_fd;
++#else
++# define mmap_fd -1
++#endif
++
+ /* Pointers to the file, program and section headers for the old and new
+ * files.
+ */
+- Elf32_Ehdr *old_file_h, *new_file_h;
+- Elf32_Phdr *old_program_h, *new_program_h;
+- Elf32_Shdr *old_section_h, *new_section_h;
++ ElfW(Ehdr) *old_file_h, *new_file_h;
++ ElfW(Phdr) *old_program_h, *new_program_h;
++ ElfW(Shdr) *old_section_h, *new_section_h;
+
+ /* Point to the section name table in the old file */
+ char *old_section_names;
+
+- Elf32_Addr old_bss_addr, new_bss_addr;
+- Elf32_Word old_bss_size, new_data2_size;
+- Elf32_Off new_data2_offset;
+- Elf32_Addr new_data2_addr;
+-
+- int n, nn, old_bss_index, old_data_index, new_data2_index;
++ ElfW(Addr) old_bss_addr, new_bss_addr;
++ ElfW(Word) old_bss_size, new_data2_size;
++ ElfW(Off) new_data2_offset;
++ ElfW(Addr) new_data2_addr;
++
++ int n, nn;
++ int old_bss_index, old_sbss_index;
++ int old_data_index, new_data2_index;
++ int old_mdebug_index;
+ struct stat stat_buf;
++ int old_file_size;
+
+- /* Open the old file & map it into the address space. */
++ /* Open the old file, allocate a buffer of the right size, and read
++ * in the file contents. */
+
+ old_file = open (old_name, O_RDONLY);
+
+@@ -535,52 +714,80 @@
+ if (fstat (old_file, &stat_buf) == -1)
+ fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
+
+- old_base = mmap (0, stat_buf.st_size, PROT_READ, MAP_SHARED, old_file, 0);
++#if MAP_ANON == 0
++ mmap_fd = open ("/dev/zero", O_RDONLY);
++ if (mmap_fd < 0)
++ fatal ("Can't open /dev/zero for reading: errno %d\n", errno);
++#endif
+
+- if (old_base == (caddr_t) -1)
+- fatal ("Can't mmap (%s): errno %d\n", old_name, errno);
++ /* We cannot use malloc here because that may use sbrk. If it does,
++ we'd dump our temporary buffers with Emacs, and we'd have to be
++ extra careful to use the correct value of sbrk(0) after
++ allocating all buffers in the code below, which we aren't. */
++ old_file_size = stat_buf.st_size;
++ old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE,
++ MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++ if (old_base == MAP_FAILED)
++ fatal ("Can't allocate buffer for %s\n", old_name);
+
+-#ifdef DEBUG
+- fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size,
+- old_base);
+-#endif
++ if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
++ fatal ("Didn't read all of %s: errno %d\n", old_name, errno);
+
+ /* Get pointers to headers & section names */
+
+- old_file_h = (Elf32_Ehdr *) old_base;
+- old_program_h = (Elf32_Phdr *) ((byte *) old_base + old_file_h->e_phoff);
+- old_section_h = (Elf32_Shdr *) ((byte *) old_base + old_file_h->e_shoff);
++ old_file_h = (ElfW(Ehdr) *) old_base;
++ old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff);
++ old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff);
+ old_section_names = (char *) old_base
+ + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
+
++ /* Find the mdebug section, if any. */
++
++ old_mdebug_index = find_section (".mdebug", old_section_names,
++ old_name, old_file_h, old_section_h, 1);
++
+ /* Find the old .bss section. Figure out parameters of the new
+ * data2 and bss sections.
+ */
+
+- for (old_bss_index = 1; old_bss_index < (int) old_file_h->e_shnum;
+- old_bss_index++)
++ old_bss_index = find_section (".bss", old_section_names,
++ old_name, old_file_h, old_section_h, 0);
++
++ old_sbss_index = find_section (".sbss", old_section_names,
++ old_name, old_file_h, old_section_h, 1);
++ if (old_sbss_index != -1)
++ if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS)
++ old_sbss_index = -1;
++
++ if (old_sbss_index == -1)
+ {
+-#ifdef DEBUG
+- fprintf (stderr, "Looking for .bss - found %s\n",
+- old_section_names + OLD_SECTION_H (old_bss_index).sh_name);
+-#endif
+- if (!strcmp (old_section_names + OLD_SECTION_H (old_bss_index).sh_name,
+- ELF_BSS_SECTION_NAME))
+- break;
++ old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
++ old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
++ new_data2_index = old_bss_index;
++ }
++ else
++ {
++ old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr;
++ old_bss_size = OLD_SECTION_H (old_bss_index).sh_size
++ + OLD_SECTION_H (old_sbss_index).sh_size;
++ new_data2_index = old_sbss_index;
+ }
+- if (old_bss_index == old_file_h->e_shnum)
+- fatal ("Can't find .bss in %s.\n", old_name, 0);
+
+- old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
+- old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
+-#if defined(emacs) || !defined(DEBUG)
+- new_bss_addr = (Elf32_Addr) sbrk (0);
++ /* Find the old .data section. Figure out parameters of
++ the new data2 and bss sections. */
++
++ old_data_index = find_section (".data", old_section_names,
++ old_name, old_file_h, old_section_h, 0);
++
++#if defined (emacs) || !defined (DEBUG)
++ new_bss_addr = (ElfW(Addr)) sbrk (0);
+ #else
+ new_bss_addr = old_bss_addr + old_bss_size + 0x1234;
+ #endif
+ new_data2_addr = old_bss_addr;
+ new_data2_size = new_bss_addr - old_bss_addr;
+- new_data2_offset = OLD_SECTION_H (old_bss_index).sh_offset;
++ new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset +
++ (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
+
+ #ifdef DEBUG
+ fprintf (stderr, "old_bss_index %d\n", old_bss_index);
+@@ -595,9 +802,9 @@
+ if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size)
+ fatal (".bss shrank when undumping???\n", 0, 0);
+
+- /* Set the output file to the right size and mmap it. Set
+- * pointers to various interesting objects. stat_buf still has
+- * old_file data.
++ /* Set the output file to the right size. Allocate a buffer to hold
++ * the image of the new file. Set pointers to various interesting
++ * objects. stat_buf still has old_file data.
+ */
+
+ new_file = open (new_name, O_RDWR | O_CREAT, 0666);
+@@ -609,20 +816,14 @@
+ if (ftruncate (new_file, new_file_size))
+ fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
+
+-#ifdef UNEXEC_USE_MAP_PRIVATE
+- new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
+- new_file, 0);
+-#else
+- new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED,
+- new_file, 0);
+-#endif
+-
+- if (new_base == (caddr_t) -1)
+- fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
+-
+- new_file_h = (Elf32_Ehdr *) new_base;
+- new_program_h = (Elf32_Phdr *) ((byte *) new_base + old_file_h->e_phoff);
+- new_section_h = (Elf32_Shdr *)
++ new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
++ MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++ if (new_base == MAP_FAILED)
++ fatal ("Can't allocate buffer for %s\n", old_name);
++
++ new_file_h = (ElfW(Ehdr) *) new_base;
++ new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
++ new_section_h = (ElfW(Shdr) *)
+ ((byte *) new_base + old_file_h->e_shoff + new_data2_size);
+
+ /* Make our new file, program and section headers as copies of the
+@@ -661,12 +862,22 @@
+ for (n = new_file_h->e_phnum - 1; n >= 0; n--)
+ {
+ /* Compute maximum of all requirements for alignment of section. */
+- int alignment = (NEW_PROGRAM_H (n)).p_align;
++ ElfW(Word) alignment = (NEW_PROGRAM_H (n)).p_align;
+ if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment)
+ alignment = OLD_SECTION_H (old_bss_index).sh_addralign;
+
+- if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz > old_bss_addr)
+- fatal ("Program segment above .bss in %s\n", old_name, 0);
++#ifdef __sgi
++ /* According to r02kar@x4u2.desy.de (Karsten Kuenne)
++ and oliva@gnu.org (Alexandre Oliva), on IRIX 5.2, we
++ always get "Program segment above .bss" when dumping
++ when the executable doesn't have an sbss section. */
++ if (old_sbss_index != -1)
++#endif /* __sgi */
++ if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz
++ > (old_sbss_index == -1
++ ? old_bss_addr
++ : round_up (old_bss_addr, alignment)))
++ fatal ("Program segment above .bss in %s\n", old_name, 0);
+
+ if (NEW_PROGRAM_H (n).p_type == PT_LOAD
+ && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
+@@ -678,7 +889,9 @@
+ if (n < 0)
+ fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0);
+
+- NEW_PROGRAM_H (n).p_filesz += new_data2_size;
++ /* Make sure that the size includes any padding before the old .bss
++ section. */
++ NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr;
+ NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz;
+
+ #if 0 /* Maybe allow section after data2 - does this ever happen? */
+@@ -712,12 +925,14 @@
+ for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++)
+ {
+ caddr_t src;
+- /* If it is bss section, insert the new data2 section before it. */
+- if (n == old_bss_index)
++ /* If it is (s)bss section, insert the new data2 section before it. */
++ /* new_data2_index is the index of either old_sbss or old_bss, that was
++ chosen as a section for new_data2. */
++ if (n == new_data2_index)
+ {
+ /* Steal the data section header for this data2 section. */
+ memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
+- new_file_h->e_shentsize);
++ new_file_h->e_shentsize);
+
+ NEW_SECTION_H (nn).sh_addr = new_data2_addr;
+ NEW_SECTION_H (nn).sh_offset = new_data2_offset;
+@@ -737,13 +952,17 @@
+ memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
+ old_file_h->e_shentsize);
+
+- /* The new bss section's size is zero, and its file offset and virtual
+- address should be off by NEW_DATA2_SIZE. */
+- if (n == old_bss_index)
++ if (n == old_bss_index
++ /* The new bss and sbss section's size is zero, and its file offset
++ and virtual address should be off by NEW_DATA2_SIZE. */
++ || n == old_sbss_index
++ )
+ {
+- /* NN should be `old_bss_index + 1' at this point. */
+- NEW_SECTION_H (nn).sh_offset += new_data2_size;
+- NEW_SECTION_H (nn).sh_addr += new_data2_size;
++ /* NN should be `old_s?bss_index + 1' at this point. */
++ NEW_SECTION_H (nn).sh_offset =
++ NEW_SECTION_H (new_data2_index).sh_offset + new_data2_size;
++ NEW_SECTION_H (nn).sh_addr =
++ NEW_SECTION_H (new_data2_index).sh_addr + new_data2_size;
+ /* Let the new bss section address alignment be the same as the
+ section address alignment followed the old bss section, so
+ this section will be placed in exactly the same place. */
+@@ -767,7 +986,9 @@
+ >= OLD_SECTION_H (old_bss_index-1).sh_offset)
+ NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #else
+- if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
++ if (round_up (NEW_SECTION_H (nn).sh_offset,
++ OLD_SECTION_H (old_bss_index).sh_addralign)
++ >= new_data2_offset)
+ NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #endif
+ /* Any section that was originally placed after the section
+@@ -787,18 +1008,54 @@
+ if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
+ && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
+ PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
++
++ if (old_sbss_index != -1)
++ if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss"))
++ {
++ NEW_SECTION_H (nn).sh_offset =
++ round_up (NEW_SECTION_H (nn).sh_offset,
++ NEW_SECTION_H (nn).sh_addralign);
++ NEW_SECTION_H (nn).sh_type = SHT_PROGBITS;
++ }
+
+ /* Now, start to copy the content of sections. */
+ if (NEW_SECTION_H (nn).sh_type == SHT_NULL
+ || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
+ continue;
+
+- /* Write out the sections. .data and .data1 (and data2, called
++ /* Write out the sections. .data and .data1 (and data2, called
+ ".data" in the strings table) get copied from the current process
+ instead of the old file. */
+ if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
+ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
+- ".data1"))
++ ".sdata")
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".lit4")
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".lit8")
++ /* The conditional bit below was in Oliva's original code
++ (1999-08-25) and seems to have been dropped by mistake
++ subsequently. It prevents a crash at startup under X in
++ `IRIX64 6.5 6.5.17m' with c_dev 7.3.1.3m. It causes no
++ trouble on the other ELF platforms I could test (Irix
++ 6.5.15m, Solaris 8, Debian Potato x86, Debian Woody
++ SPARC); however, it's reported to cause crashes under
++ some version of GNU/Linux. It's not yet clear what's
++ changed in that Irix version to cause the problem, or why
++ the fix sometimes fails under GNU/Linux. There's
++ probably no good reason to have something Irix-specific
++ here, but this will have to do for now. IRIX6_5 is the
++ most specific macro we have to test. -- fx 2002-10-01 */
++#ifdef IRIX6_5
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".got")
++#endif
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".sdata1")
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".data1")
++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++ ".sbss"))
+ src = (caddr_t) OLD_SECTION_H (n).sh_addr;
+ else
+ src = old_base + OLD_SECTION_H (n).sh_offset;
+@@ -806,13 +1063,114 @@
+ memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
+ NEW_SECTION_H (nn).sh_size);
+
++#ifdef __alpha__
++ /* Update Alpha COFF symbol table: */
++ if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug")
++ == 0)
++ {
++ pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base);
++
++ symhdr->cbLineOffset += new_data2_size;
++ symhdr->cbDnOffset += new_data2_size;
++ symhdr->cbPdOffset += new_data2_size;
++ symhdr->cbSymOffset += new_data2_size;
++ symhdr->cbOptOffset += new_data2_size;
++ symhdr->cbAuxOffset += new_data2_size;
++ symhdr->cbSsOffset += new_data2_size;
++ symhdr->cbSsExtOffset += new_data2_size;
++ symhdr->cbFdOffset += new_data2_size;
++ symhdr->cbRfdOffset += new_data2_size;
++ symhdr->cbExtOffset += new_data2_size;
++ }
++#endif /* __alpha__ */
++
++#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
++ if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG
++ && old_mdebug_index != -1)
++ {
++ int diff = NEW_SECTION_H(nn).sh_offset
++ - OLD_SECTION_H(old_mdebug_index).sh_offset;
++ HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base);
++
++ if (diff)
++ {
++ phdr->cbLineOffset += diff;
++ phdr->cbDnOffset += diff;
++ phdr->cbPdOffset += diff;
++ phdr->cbSymOffset += diff;
++ phdr->cbOptOffset += diff;
++ phdr->cbAuxOffset += diff;
++ phdr->cbSsOffset += diff;
++ phdr->cbSsExtOffset += diff;
++ phdr->cbFdOffset += diff;
++ phdr->cbRfdOffset += diff;
++ phdr->cbExtOffset += diff;
++ }
++ }
++#endif /* __sony_news && _SYSTYPE_SYSV */
++
++#if __sgi
++ /* Adjust the HDRR offsets in .mdebug and copy the
++ line data if it's in its usual 'hole' in the object.
++ Makes the new file debuggable with dbx.
++ patches up two problems: the absolute file offsets
++ in the HDRR record of .mdebug (see /usr/include/syms.h), and
++ the ld bug that gets the line table in a hole in the
++ elf file rather than in the .mdebug section proper.
++ David Anderson. davea@sgi.com Jan 16,1994. */
++ if (n == old_mdebug_index)
++ {
++#define MDEBUGADJUST(__ct,__fileaddr) \
++ if (n_phdrr->__ct > 0) \
++ { \
++ n_phdrr->__fileaddr += movement; \
++ }
++
++ HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset);
++ HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset);
++ unsigned movement = new_data2_size;
++
++ MDEBUGADJUST (idnMax, cbDnOffset);
++ MDEBUGADJUST (ipdMax, cbPdOffset);
++ MDEBUGADJUST (isymMax, cbSymOffset);
++ MDEBUGADJUST (ioptMax, cbOptOffset);
++ MDEBUGADJUST (iauxMax, cbAuxOffset);
++ MDEBUGADJUST (issMax, cbSsOffset);
++ MDEBUGADJUST (issExtMax, cbSsExtOffset);
++ MDEBUGADJUST (ifdMax, cbFdOffset);
++ MDEBUGADJUST (crfd, cbRfdOffset);
++ MDEBUGADJUST (iextMax, cbExtOffset);
++ /* The Line Section, being possible off in a hole of the object,
++ requires special handling. */
++ if (n_phdrr->cbLine > 0)
++ {
++ if (o_phdrr->cbLineOffset > (OLD_SECTION_H (n).sh_offset
++ + OLD_SECTION_H (n).sh_size))
++ {
++ /* line data is in a hole in elf. do special copy and adjust
++ for this ld mistake.
++ */
++ n_phdrr->cbLineOffset += movement;
++
++ memcpy (n_phdrr->cbLineOffset + new_base,
++ o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine);
++ }
++ else
++ {
++ /* somehow line data is in .mdebug as it is supposed to be. */
++ MDEBUGADJUST (cbLine, cbLineOffset);
++ }
++ }
++ }
++#endif /* __sgi */
++
+ /* If it is the symbol table, its st_shndx field needs to be patched. */
+ if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
+ || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM)
+ {
+- Elf32_Shdr *spt = &NEW_SECTION_H (nn);
++ ElfW(Shdr) *spt = &NEW_SECTION_H (nn);
+ unsigned int num = spt->sh_size / spt->sh_entsize;
+- Elf32_Sym * sym = (Elf32_Sym *) (NEW_SECTION_H (nn).sh_offset +
++ ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset +
+ new_base);
+ for (; num--; sym++)
+ {
+@@ -830,7 +1188,7 @@
+ for (n = new_file_h->e_shnum - 1; n; n--)
+ {
+ byte *symnames;
+- Elf32_Sym *symp, *symendp;
++ ElfW(Sym) *symp, *symendp;
+
+ if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM
+ && NEW_SECTION_H (n).sh_type != SHT_SYMTAB)
+@@ -838,12 +1196,14 @@
+
+ symnames = ((byte *) new_base
+ + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset);
+- symp = (Elf32_Sym *) (NEW_SECTION_H (n).sh_offset + new_base);
+- symendp = (Elf32_Sym *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
++ symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base);
++ symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
+
+ for (; symp < symendp; symp ++)
+ if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0
+- || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0)
++ || strcmp ((char *) (symnames + symp->st_name), "end") == 0
++ || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0
++ || strcmp ((char *) (symnames + symp->st_name), "edata") == 0)
+ memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
+ }
+
+@@ -851,7 +1211,7 @@
+ that it can undo relocations performed by the runtime linker. */
+ for (n = new_file_h->e_shnum - 1; n; n--)
+ {
+- Elf32_Shdr section = NEW_SECTION_H (n);
++ ElfW(Shdr) section = NEW_SECTION_H (n);
+ switch (section.sh_type) {
+ default:
+ break;
+@@ -863,37 +1223,65 @@
+ nn = section.sh_info;
+ if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++ ".sdata")
++ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++ ".lit4")
++ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++ ".lit8")
++#ifdef IRIX6_5 /* see above */
++ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++ ".got")
++#endif
++ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++ ".sdata1")
++ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
+ ".data1"))
+ {
+- Elf32_Addr offset = NEW_SECTION_H (nn).sh_addr -
++ ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr -
+ NEW_SECTION_H (nn).sh_offset;
+ caddr_t reloc = old_base + section.sh_offset, end;
+ for (end = reloc + section.sh_size; reloc < end;
+ reloc += section.sh_entsize)
+ {
+- Elf32_Addr addr = ((Elf32_Rel *) reloc)->r_offset - offset;
+- memcpy (new_base + addr, old_base + addr, 4);
+- }
++ ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset;
++#ifdef __alpha__
++ /* The Alpha ELF binutils currently have a bug that
++ sometimes results in relocs that contain all
++ zeroes. Work around this for now... */
++ if (((ElfW(Rel) *) reloc)->r_offset == 0)
++ continue;
++#endif
++ memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr)));
++ }
+ }
+ break;
+ }
+ }
+
+-#ifdef UNEXEC_USE_MAP_PRIVATE
+- if (lseek (new_file, 0, SEEK_SET) == -1)
+- fatal ("Can't rewind (%s): errno %d\n", new_name, errno);
++ /* Write out new_file, close it, and free the buffer containing its
++ * contents */
+
+ if (write (new_file, new_base, new_file_size) != new_file_size)
+- fatal ("Can't write (%s): errno %d\n", new_name, errno);
+-#endif
++ fatal ("Didn't write %d bytes to %s: errno %d\n",
++ new_file_size, new_base, errno);
++
++ if (close (new_file))
++ fatal ("Can't close (%s): errno %d\n", new_name, errno);
++
++ munmap (new_base, new_file_size);
+
+- /* Close the files and make the new file executable. */
++ /* Close old_file, and free the corresponding buffer */
++
++#if MAP_ANON == 0
++ close (mmap_fd);
++#endif
+
+ if (close (old_file))
+ fatal ("Can't close (%s): errno %d\n", old_name, errno);
+
+- if (close (new_file))
+- fatal ("Can't close (%s): errno %d\n", new_name, errno);
++ munmap (old_base, old_file_size);
++
++ /* Make the new file executable */
+
+ if (stat (new_name, &stat_buf) == -1)
+ fatal ("Can't stat (%s): errno %d\n", new_name, errno);