XEmacs 21.4.10 "Military Intelligence".
authortomo <tomo>
Wed, 11 Dec 2002 17:39:38 +0000 (17:39 +0000)
committertomo <tomo>
Wed, 11 Dec 2002 17:39:38 +0000 (17:39 +0000)
70 files changed:
ChangeLog
INSTALL
Makefile.in.in
PROBLEMS
configure
configure.in
configure.usage
etc/BETA
etc/Emacs.ad
etc/OXYMORONS
etc/TUTORIAL.fr
lib-src/ChangeLog
lisp/ChangeLog
lisp/auto-autoloads.el
lisp/bytecomp-runtime.el
lisp/custom-load.el
lisp/dialog-items.el
lisp/dialog.el
lisp/files.el
lisp/font-lock.el
lisp/gutter-items.el
lisp/keydefs.el
lisp/obsolete.el
lisp/package-get.el
lwlib/ChangeLog
man/ChangeLog
man/internals/internals.texi
man/lispref/compile.texi
man/lispref/syntax.texi
man/xemacs-faq.texi
man/xemacs/packages.texi
netinstall/ChangeLog
nt/ChangeLog
nt/xemacs.mak
src/ChangeLog
src/callproc.c
src/console.h
src/dired.c
src/emacs.c
src/event-Xt.c
src/event-msw.c
src/extents.c
src/extents.h
src/file-coding.c
src/font-lock.c
src/frame-msw.c
src/frame-x.c
src/frame.c
src/general-slots.h
src/glyphs-msw.c
src/glyphs-widget.c
src/glyphs-x.c
src/glyphs.h
src/lisp.h
src/menubar-msw.c
src/nas.c
src/process-unix.c
src/realpath.c
src/redisplay-output.c
src/redisplay.c
src/regex.c
src/search.c
src/symsinit.h
src/syntax.c
src/syntax.h
tests/ChangeLog
tests/automated/regexp-tests.el
tests/automated/syntax-tests.el
tests/automated/test-harness.el
version.sh

index 0615c59..b743ab6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,80 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-11-01  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * Makefile.in.in (lisp/custom-load.el): Depend on auto-autoloads.el.
+
+2002-10-31  Christopher Sekiya  <wileyc@rezrov.net>
+
+       * etc/OXYMORONS: "Too much Mozart" is an oxymoron.
+
+2002-10-25  Steve Youngs  <youngs@xemacs.org>
+
+       * etc/TUTORIAL.fr (suivante): Typo fix.
+       From juergen stuber <stuberj@mines.inpl-nancy.fr>.
+
+2002-10-23  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * Makefile.in.in (lisp/auto-autoloads.el):
+       (lisp/custom-load.el): 
+       Use -no-autoloads for these targets; can't load 'em if they ain't.
+
+2002-10-18  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * PROBLEMS (Running/Cygwin): "No cygXpm-noX" fatal error.
+
+2002-10-17  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * PROBLEMS (Missing charsets): Remove ambiguity.
+
+2002-10-10  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * INSTALL (PREREQUISITES): Recommend Texinfo 4.2.
+
+2002-10-09  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * etc/BETA: Improve descriptions of XEmacs Patches; mention Design.
+
+2002-10-08  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * PROBLEMS (MacOS/X): Describe stack limitation.
+       (Digital Unix): Generalize to all regexp-using applications.
+       * INSTALL (PREQUISITES): Mention MacOS/X stack limitation.
+       (PROBLEMS): Point to PROBLEMS file for build notes.
+       Thanks to Skip Montanaro for the report.
+
+2002-10-07  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * Makefile.in.in (all-elcs): Depend on autoloads.
+       (autoloads): Depend on lib-src, lwlib, and src.
+
+2002-10-04  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * configure.in (Check for POSIX functions):  New section head.
+       getaddrinfo is detected on HP-UX 11.XX, but appears to be
+       non-functional.  Disable it.  Based on work by Darryl Okahata.
+       
+2002-09-27  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * PROBLEMS (Running, General): Missing charset in FontSet warnings.
+
+       * Emacs.ad: Add charsets to *menubar*FontSet and *popup*FontSet.
+
+2002-08-29  Ville Skyttä  <ville.skytta@xemacs.org>
+
+       * Emacs.ad: Add *menubar*FontSet and *popup*FontSet entries,
+       (self-)obtained from Red Hat.
+
+2002-09-25  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * etc/OXYMORONS:  A couple new ones.
+
+2002-09-03  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * configure.usage: Complete rewrite and reorganization.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
diff --git a/INSTALL b/INSTALL
index 8282e8b..3cbcd98 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -32,8 +32,8 @@ error in the command `temacs -batch -l loadup dump', found in
 XEmacs.
 
 Verify that your users have a high enough stack limit. On some systems
-such as OpenBSD and OSF/Tru64 the default is 2MB which is too low. See
-'PROBLEMS' for details.
+such as OpenBSD and OSF/Tru64 the default is 2MB which is too low.  On
+MacOS/X (Darwin), it's 512kB.  See 'PROBLEMS' for details.
 
 Building XEmacs requires about 100 Mb of disk space (including the
 XEmacs sources).  Once installed, XEmacs occupies between 20 and 100 Mb
@@ -44,7 +44,8 @@ installed
 
 XEmacs requires an ANSI C compiler, such as GCC.  If you wish to build
 the documentation yourself, you will need at least version 1.68 of
-makeinfo (GNU texinfo-3.11).
+makeinfo (GNU texinfo-3.11).  GNU Texinfo 4.2 is recommended; it is
+necessary for building packages, and we may move to it for the core.
 
 ADD-ON LIBRARIES
 ================
@@ -691,5 +692,6 @@ The most likely problem is that you forgot to read and follow the
 directions in README.packages.  You can not have a working XEmacs
 without downloading some additional packages.
 
-See the file PROBLEMS in this directory for a list of various
-problems sometimes encountered, and what to do about them.
+See the file PROBLEMS in this directory for a list of various problems
+sometimes encountered, and what to do about them.  PROBLEMS is also
+the place where platform-specific build notes can be found.
index ce005c3..bf5656f 100644 (file)
@@ -283,7 +283,7 @@ depend ${srcdir}/src/depend:
 
 ## Build XEmacs and recompile out-of-date and missing .elc files along
 ## the way.
-all-elc all-elcs: lib-src lwlib dump-elcs src
+all-elc all-elcs: autoloads dump-elcs
        ${blddir}/src/${PROGNAME} -batch -vanilla \
                -l update-elc-2.el -f batch-update-elc-2 lisp
 
@@ -291,19 +291,19 @@ all-elc all-elcs: lib-src lwlib dump-elcs src
 dump-elc dump-elcs: ${GENERATED_HEADERS} FRC.dump-elcs
        cd ./src && $(RECURSIVE_MAKE) dump-elcs
 
-autoloads: lisp/auto-autoloads.el lisp/custom-load.el
+autoloads: lib-src lwlib src lisp/auto-autoloads.el lisp/custom-load.el
 
 FRC.lisp.auto.autoloads.el:
 lisp/auto-autoloads.el:        FRC.lisp.auto.autoloads.el
        $(RM) lisp/auto-autoloads.el
-       ${blddir}/src/${PROGNAME} -batch -vanilla \
+       ${blddir}/src/${PROGNAME} -batch -no-autoloads \
                -l autoload -f batch-update-directory lisp
        ${blddir}/src/${PROGNAME} -batch -vanilla \
                -f batch-byte-compile lisp/auto-autoloads.el
        @$(RM) lisp/auto-autoloads.el~
 
 FRC.lisp.custom.load.el:
-lisp/custom-load.el: FRC.lisp.custom.load.el
+lisp/custom-load.el: FRC.lisp.custom.load.el lisp/auto-autoloads.el
        ${blddir}/src/${PROGNAME} -batch -vanilla -l cus-dep \
                -f Custom-make-dependencies lisp
 
index ccce14f..b6dd37a 100644 (file)
--- a/PROBLEMS
+++ b/PROBLEMS
@@ -685,6 +685,28 @@ microsoft website.
 * Problems with running XEmacs
 ==============================
 ** General
+*** At startup I get a warning on stderr about missing charsets:
+
+    Warning: Missing charsets in String to FontSet conversion
+
+You need to specify appropriate charsets for your locale (usually the
+value of the LANG environment variable) in .Xresources.  See
+etc/Emacs.ad for the relevant resources (mostly menubar fonts and
+fontsets).  Do not edit this file, it's purely informative.
+
+If you have no satisfactory fonts for iso-8859-1, XEmacs will crash.
+
+It looks like XFree86 4.x (the usual server on Linux and *BSD) has
+some braindamage where .UTF-8 locales will always generate this
+message, because the XFree86 (font)server doesn't know that UTF-8 will
+use the ISO10646-1 font registry (or a Cmap or something).
+
+If you are not using a .UTF-8 locale and see this warning for a
+character set not listed in the default in Emacs.ad, please let
+xemacs-beta@xemacs.org know about it, so we can add fonts to the
+appropriate fontsets and stifle this warning.  (Unfortunately it's
+buried in Xlib, so we can't easily get rid of it otherwise.)
+
 *** Whenever I try to retrieve a remote file, I have problems.
 
 A typical error: FTP Error: USER request failed; 500 AUTH not understood.
@@ -1189,6 +1211,20 @@ Use the following instead
        Emacs*EmacsFrame.geometry:              81x56--9--1
 
 
+** MacOS/X, Darwin
+*** XEmacs crashes on MacOS within font-lock, or when dealing
+with large compilation buffers, or in other regex applications.
+
+The default stack size under MacOS/X is rather small (512k as opposed
+to Solaris 8M), hosing the regexp code, which uses alloca()
+extensively, overflowing the stack when complex regexps are used.
+Workarounds:
+
+1) Increase your stack size, using `ulimit -s 8192' or a (t)csh
+   equivalent;
+
+2) Recompile regex.c with REGEX_MALLOC defined.
+
 ** AIX
 *** Your Delete key sends a Backspace to the terminal, using an AIXterm.
 
@@ -1652,7 +1688,7 @@ systems is a C++ lib, which apparently XEmacs cannot cope with.
 
 ** Digital UNIX/OSF/VMS/Ultrix
 *** XEmacs crashes on Digital Unix within font-lock, or when dealing
-with large compilation buffers.
+with large compilation buffers, or in other regex applications.
 
 The default stack size under Digital Unix is rather small (2M as
 opposed to Solaris 8M), hosing the regexp code, which uses alloca()
@@ -1858,6 +1894,14 @@ problem still exists.  Also ask on xemacs-nt@xemacs.org.
 
 
 ** Cygwin
+*** XEmacs fails to start because cygXpm-noX4.dll was not found.
+
+Andy Piper <andy@xemacs.org> sez:
+
+    cygXpm-noX4 is part of the cygwin distribution under libraries or
+    graphics, but is not installed by default. You need to run the
+    cygwin setup again and select this package.
+
 *** Subprocesses do not work.
  
 You do not have "tty" in your CYGWIN environment variable.  This must
index 890f809..8aad1af 100755 (executable)
--- a/configure
+++ b/configure
 
 fi
 
+
 for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strerror tzset ulimit usleep waitpid vsnprintf fsync ftruncate umask
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10863: checking for $ac_func" >&5
+echo "configure:10864: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10866 "configure"
+#line 10867 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10885,7 +10886,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
 done
 
 
+if test "$ac_cv_func_getaddrinfo" != "no" ; then
+  case "$opsys" in
+    hpux11 )
+      echo "configure: warning: Use of getaddrinfo is disabled for HP-UX 11.XX." 1>&2
+      ac_cv_func_getaddrinfo=no
+      ;;
+  esac
+fi
+
 
 for ac_func in getpt _getpty grantpt unlockpt ptsname killpg tcgetpgrp
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10921: checking for $ac_func" >&5
+echo "configure:10931: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10924 "configure"
+#line 10934 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10943,7 +10953,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10957: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -10972,10 +10982,10 @@ done
 
 
 echo $ac_n "checking for openpty""... $ac_c" 1>&6
-echo "configure:10976: checking for openpty" >&5
+echo "configure:10986: checking for openpty" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10979 "configure"
+#line 10989 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char openpty(); below.  */
@@ -10998,7 +11008,7 @@ openpty();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_openpty=yes"
 else
@@ -11017,12 +11027,12 @@ else
 
   
 echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6
-echo "configure:11021: checking for openpty in -lutil" >&5
+echo "configure:11031: checking for openpty in -lutil" >&5
 ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lutil "
 cat > conftest.$ac_ext <<EOF
-#line 11026 "configure"
+#line 11036 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11033,7 +11043,7 @@ int main() {
 openpty()
 ; return 0; }
 EOF
-if { (eval echo configure:11037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -11068,15 +11078,15 @@ EOF
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11072: checking for $ac_hdr" >&5
+echo "configure:11082: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11075 "configure"
+#line 11085 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11080: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11090: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11112,15 +11122,15 @@ for ac_hdr in stropts.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11116: checking for $ac_hdr" >&5
+echo "configure:11126: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11119 "configure"
+#line 11129 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11124: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11153,10 +11163,10 @@ if test "$ac_cv_header_stropts_h" = "yes"; then
   for ac_func in isastream
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11157: checking for $ac_func" >&5
+echo "configure:11167: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11160 "configure"
+#line 11170 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11179,7 +11189,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11210,15 +11220,15 @@ done
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11214: checking for $ac_hdr" >&5
+echo "configure:11224: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11217 "configure"
+#line 11227 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11222: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11232: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11255,10 +11265,10 @@ extra_objs="$extra_objs realpath.o" &&  if test "$extra_verbose" = "yes"; then
 for ac_func in getloadavg
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11259: checking for $ac_func" >&5
+echo "configure:11269: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11262 "configure"
+#line 11272 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11281,7 +11291,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11314,15 +11324,15 @@ if test "$ac_cv_func_getloadavg" = "yes"; then
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11318: checking for $ac_hdr" >&5
+echo "configure:11328: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11321 "configure"
+#line 11331 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11326: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11336: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11358,12 +11368,12 @@ else
 
     
 echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6
-echo "configure:11362: checking for kstat_open in -lkstat" >&5
+echo "configure:11372: checking for kstat_open in -lkstat" >&5
 ac_lib_var=`echo kstat'_'kstat_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkstat "
 cat > conftest.$ac_ext <<EOF
-#line 11367 "configure"
+#line 11377 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11374,7 +11384,7 @@ int main() {
 kstat_open()
 ; return 0; }
 EOF
-if { (eval echo configure:11378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11413: checking for $ac_hdr" >&5
+echo "configure:11423: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11416 "configure"
+#line 11426 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11431: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11449,12 +11459,12 @@ done
 
     
 echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6
-echo "configure:11453: checking for kvm_read in -lkvm" >&5
+echo "configure:11463: checking for kvm_read in -lkvm" >&5
 ac_lib_var=`echo kvm'_'kvm_read | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkvm "
 cat > conftest.$ac_ext <<EOF
-#line 11458 "configure"
+#line 11468 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11465,7 +11475,7 @@ int main() {
 kvm_read()
 ; return 0; }
 EOF
-if { (eval echo configure:11469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 fi
 
 echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
-echo "configure:11503: checking whether netdb declares h_errno" >&5
+echo "configure:11513: checking whether netdb declares h_errno" >&5
 cat > conftest.$ac_ext <<EOF
-#line 11505 "configure"
+#line 11515 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 int main() {
 return h_errno;
 ; return 0; }
 EOF
-if { (eval echo configure:11512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
 rm -f conftest*
 
 echo $ac_n "checking for sigsetjmp""... $ac_c" 1>&6
-echo "configure:11532: checking for sigsetjmp" >&5
+echo "configure:11542: checking for sigsetjmp" >&5
 cat > conftest.$ac_ext <<EOF
-#line 11534 "configure"
+#line 11544 "configure"
 #include "confdefs.h"
 #include <setjmp.h>
 int main() {
 sigjmp_buf bar; sigsetjmp (bar, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:11541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11551: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
 rm -f conftest*
 
 echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
-echo "configure:11561: checking whether localtime caches TZ" >&5
+echo "configure:11571: checking whether localtime caches TZ" >&5
 
 if test "$ac_cv_func_tzset" = "yes"; then
 cat > conftest.$ac_ext <<EOF
-#line 11565 "configure"
+#line 11575 "configure"
 #include "confdefs.h"
 #include <time.h>
 #if STDC_HEADERS
@@ -11596,7 +11606,7 @@ main()
   exit (0);
 }
 EOF
-if { (eval echo configure:11600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   emacs_cv_localtime_cache=no
 else
@@ -11626,9 +11636,9 @@ fi
 
 if test "$HAVE_TIMEVAL" = "yes"; then
 echo $ac_n "checking whether gettimeofday accepts one or two arguments""... $ac_c" 1>&6
-echo "configure:11630: checking whether gettimeofday accepts one or two arguments" >&5
+echo "configure:11640: checking whether gettimeofday accepts one or two arguments" >&5
 cat > conftest.$ac_ext <<EOF
-#line 11632 "configure"
+#line 11642 "configure"
 #include "confdefs.h"
 
 #ifdef TIME_WITH_SYS_TIME
@@ -11649,7 +11659,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:11653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""two" 1>&6
 else
 
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:11675: checking for inline" >&5
+echo "configure:11685: checking for inline" >&5
 
 ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 11680 "configure"
+#line 11690 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:11687: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11697: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -11724,17 +11734,17 @@ if test "$__DECC" != "yes"; then
   # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:11728: checking for working alloca.h" >&5
+echo "configure:11738: checking for working alloca.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11731 "configure"
+#line 11741 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:11738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -11758,10 +11768,10 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:11762: checking for alloca" >&5
+echo "configure:11772: checking for alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11765 "configure"
+#line 11775 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -11789,7 +11799,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:11793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -11828,10 +11838,10 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:11832: checking whether alloca needs Cray hooks" >&5
+echo "configure:11842: checking whether alloca needs Cray hooks" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11835 "configure"
+#line 11845 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -11855,10 +11865,10 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11859: checking for $ac_func" >&5
+echo "configure:11869: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11862 "configure"
+#line 11872 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11881,7 +11891,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11885: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11911,10 +11921,10 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:11915: checking stack direction for C alloca" >&5
+echo "configure:11925: checking stack direction for C alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11918 "configure"
+#line 11928 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -11933,7 +11943,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:11937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_c_stack_direction=1
 else
 
 ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:11967: checking for vfork.h" >&5
+echo "configure:11977: checking for vfork.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11970 "configure"
+#line 11980 "configure"
 #include "confdefs.h"
 #include <vfork.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11975: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11985: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11999,10 +12009,10 @@ else
 fi
 
 echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:12003: checking for working vfork" >&5
+echo "configure:12013: checking for working vfork" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12006 "configure"
+#line 12016 "configure"
 #include "confdefs.h"
 /* Thanks to Paul Eggert for this test.  */
 #include <stdio.h>
@@ -12097,7 +12107,7 @@ main() {
   }
 }
 EOF
-if { (eval echo configure:12101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_vfork_works=yes
 else
 
 
 echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
-echo "configure:12127: checking for working strcoll" >&5
+echo "configure:12137: checking for working strcoll" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12130 "configure"
+#line 12140 "configure"
 #include "confdefs.h"
 #include <string.h>
 main ()
@@ -12136,7 +12146,7 @@ main ()
        strcoll ("123", "456") >= 0);
 }
 EOF
-if { (eval echo configure:12140: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_strcoll_works=yes
 else
 for ac_func in getpgrp
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12168: checking for $ac_func" >&5
+echo "configure:12178: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12171 "configure"
+#line 12181 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -12190,7 +12200,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12194: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
 done
 
 echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:12222: checking whether getpgrp takes no argument" >&5
+echo "configure:12232: checking whether getpgrp takes no argument" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12225 "configure"
+#line 12235 "configure"
 #include "confdefs.h"
 
 /*
@@ -12276,7 +12286,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:12280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_getpgrp_void=yes
 else
 
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:12307: checking for working mmap" >&5
+echo "configure:12317: checking for working mmap" >&5
 case "$opsys" in ultrix* ) have_mmap=no ;; *)
 cat > conftest.$ac_ext <<EOF
-#line 12310 "configure"
+#line 12320 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <unistd.h>
@@ -12339,7 +12349,7 @@ int main (int argc, char *argv[])
   return 1;
 }
 EOF
-if { (eval echo configure:12343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   have_mmap=yes
 else
@@ -12368,9 +12378,9 @@ test "$GNU_MALLOC" != "yes" -a "$have_mmap" != "yes" && rel_alloc=no
 if test "$rel_alloc $have_mmap" = "default yes"; then
   if test "$doug_lea_malloc" = "yes"; then
         echo $ac_n "checking for M_MMAP_THRESHOLD""... $ac_c" 1>&6
-echo "configure:12372: checking for M_MMAP_THRESHOLD" >&5
+echo "configure:12382: checking for M_MMAP_THRESHOLD" >&5
     cat > conftest.$ac_ext <<EOF
-#line 12374 "configure"
+#line 12384 "configure"
 #include "confdefs.h"
 #include <malloc.h>
 int main() {
@@ -12382,7 +12392,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12386: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12396: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   rel_alloc=no; echo "$ac_t""yes" 1>&6;
 else
@@ -12407,15 +12417,15 @@ EOF
 
 ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termios.h""... $ac_c" 1>&6
-echo "configure:12411: checking for termios.h" >&5
+echo "configure:12421: checking for termios.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12414 "configure"
+#line 12424 "configure"
 #include "confdefs.h"
 #include <termios.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12419: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12429: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12458,15 +12468,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "termio.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termio.h""... $ac_c" 1>&6
-echo "configure:12462: checking for termio.h" >&5
+echo "configure:12472: checking for termio.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12465 "configure"
+#line 12475 "configure"
 #include "confdefs.h"
 #include <termio.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12470: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12480: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 
 echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:12502: checking for socket" >&5
+echo "configure:12512: checking for socket" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12505 "configure"
+#line 12515 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -12524,7 +12534,7 @@ socket();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12528: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_socket=yes"
 else
@@ -12539,15 +12549,15 @@ if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "netinet/in.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for netinet/in.h""... $ac_c" 1>&6
-echo "configure:12543: checking for netinet/in.h" >&5
+echo "configure:12553: checking for netinet/in.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12546 "configure"
+#line 12556 "configure"
 #include "confdefs.h"
 #include <netinet/in.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12561: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12564,15 +12574,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "arpa/inet.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for arpa/inet.h""... $ac_c" 1>&6
-echo "configure:12568: checking for arpa/inet.h" >&5
+echo "configure:12578: checking for arpa/inet.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12571 "configure"
+#line 12581 "configure"
 #include "confdefs.h"
 #include <arpa/inet.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12576: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12586: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12597,9 +12607,9 @@ EOF
 }
 
       echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:12601: checking "for sun_len member in struct sockaddr_un"" >&5
+echo "configure:12611: checking "for sun_len member in struct sockaddr_un"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 12603 "configure"
+#line 12613 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12610,7 +12620,7 @@ int main() {
 static struct sockaddr_un x; x.sun_len = 1;
 ; return 0; }
 EOF
-if { (eval echo configure:12614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_SOCKADDR_SUN_LEN
@@ -12628,9 +12638,9 @@ else
 fi
 rm -f conftest*
       echo $ac_n "checking "for ip_mreq struct in netinet/in.h"""... $ac_c" 1>&6
-echo "configure:12632: checking "for ip_mreq struct in netinet/in.h"" >&5
+echo "configure:12642: checking "for ip_mreq struct in netinet/in.h"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 12634 "configure"
+#line 12644 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12640,7 +12650,7 @@ int main() {
 static struct ip_mreq x;
 ; return 0; }
 EOF
-if { (eval echo configure:12644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_MULTICAST
 
 
 echo $ac_n "checking for msgget""... $ac_c" 1>&6
-echo "configure:12675: checking for msgget" >&5
+echo "configure:12685: checking for msgget" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12678 "configure"
+#line 12688 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char msgget(); below.  */
@@ -12697,7 +12707,7 @@ msgget();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12701: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_msgget=yes"
 else
@@ -12712,15 +12722,15 @@ if eval "test \"`echo '$ac_cv_func_'msgget`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:12716: checking for sys/ipc.h" >&5
+echo "configure:12726: checking for sys/ipc.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12719 "configure"
+#line 12729 "configure"
 #include "confdefs.h"
 #include <sys/ipc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12724: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12737,15 +12747,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6
-echo "configure:12741: checking for sys/msg.h" >&5
+echo "configure:12751: checking for sys/msg.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12744 "configure"
+#line 12754 "configure"
 #include "confdefs.h"
 #include <sys/msg.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12749: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dirent.h""... $ac_c" 1>&6
-echo "configure:12787: checking for dirent.h" >&5
+echo "configure:12797: checking for dirent.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12790 "configure"
+#line 12800 "configure"
 #include "confdefs.h"
 #include <dirent.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12795: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12805: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12818,15 +12828,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "sys/dir.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/dir.h""... $ac_c" 1>&6
-echo "configure:12822: checking for sys/dir.h" >&5
+echo "configure:12832: checking for sys/dir.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12825 "configure"
+#line 12835 "configure"
 #include "confdefs.h"
 #include <sys/dir.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12830: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for nlist.h""... $ac_c" 1>&6
-echo "configure:12863: checking for nlist.h" >&5
+echo "configure:12873: checking for nlist.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12866 "configure"
+#line 12876 "configure"
 #include "confdefs.h"
 #include <nlist.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12871: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 
 echo "checking "for sound support"" 1>&6
-echo "configure:12901: checking "for sound support"" >&5
+echo "configure:12911: checking "for sound support"" >&5
 test -z "$with_native_sound" -a -n "$native_sound_lib" && with_native_sound=yes
 
 if test "$with_native_sound" != "no"; then
     if test -n "$native_sound_lib"; then
     ac_safe=`echo "multimedia/audio_device.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for multimedia/audio_device.h""... $ac_c" 1>&6
-echo "configure:12908: checking for multimedia/audio_device.h" >&5
+echo "configure:12918: checking for multimedia/audio_device.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12911 "configure"
+#line 12921 "configure"
 #include "confdefs.h"
 #include <multimedia/audio_device.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12926: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
       if test -z "$native_sound_lib"; then
         
 echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6
-echo "configure:12964: checking for ALopenport in -laudio" >&5
+echo "configure:12974: checking for ALopenport in -laudio" >&5
 ac_lib_var=`echo audio'_'ALopenport | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -laudio "
 cat > conftest.$ac_ext <<EOF
-#line 12969 "configure"
+#line 12979 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12976,7 +12986,7 @@ int main() {
 ALopenport()
 ; return 0; }
 EOF
-if { (eval echo configure:12980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       if test -z "$native_sound_lib"; then
        
 echo $ac_n "checking for AOpenAudio in -lAlib""... $ac_c" 1>&6
-echo "configure:13011: checking for AOpenAudio in -lAlib" >&5
+echo "configure:13021: checking for AOpenAudio in -lAlib" >&5
 ac_lib_var=`echo Alib'_'AOpenAudio | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lAlib "
 cat > conftest.$ac_ext <<EOF
-#line 13016 "configure"
+#line 13026 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13023,7 +13033,7 @@ int main() {
 AOpenAudio()
 ; return 0; }
 EOF
-if { (eval echo configure:13027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
     for dir in "machine" "sys" "linux"; do
       ac_safe=`echo "${dir}/soundcard.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ${dir}/soundcard.h""... $ac_c" 1>&6
-echo "configure:13072: checking for ${dir}/soundcard.h" >&5
+echo "configure:13082: checking for ${dir}/soundcard.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13075 "configure"
+#line 13085 "configure"
 #include "confdefs.h"
 #include <${dir}/soundcard.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13080: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13090: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 if test "$with_nas_sound" != "no"; then
   ac_safe=`echo "audio/audiolib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for audio/audiolib.h""... $ac_c" 1>&6
-echo "configure:13134: checking for audio/audiolib.h" >&5
+echo "configure:13144: checking for audio/audiolib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13137 "configure"
+#line 13147 "configure"
 #include "confdefs.h"
 #include <audio/audiolib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13142: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13152: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -13156,12 +13166,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   
     
 echo $ac_n "checking for AuOpenServer in -laudio""... $ac_c" 1>&6
-echo "configure:13160: checking for AuOpenServer in -laudio" >&5
+echo "configure:13170: checking for AuOpenServer in -laudio" >&5
 ac_lib_var=`echo audio'_'AuOpenServer | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -laudio "
 cat > conftest.$ac_ext <<EOF
-#line 13165 "configure"
+#line 13175 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13172,7 +13182,7 @@ int main() {
 AuOpenServer()
 ; return 0; }
 EOF
-if { (eval echo configure:13176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13211,7 +13221,7 @@ EOF
  fi
     libs_x="-laudio $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-laudio\" to \$libs_x"; fi
             cat > conftest.$ac_ext <<EOF
-#line 13215 "configure"
+#line 13225 "configure"
 #include "confdefs.h"
 #include <audio/Xtutil.h>
 EOF
@@ -13242,7 +13252,7 @@ if test "$with_esd_sound" != "no"; then
   # Extract the first word of "esd-config", so it can be a program name with args.
 set dummy esd-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:13246: checking for $ac_word" >&5
+echo "configure:13256: checking for $ac_word" >&5
 
 if test -n "$have_esd_config"; then
   ac_cv_prog_have_esd_config="$have_esd_config" # Let the user override the test.
     c_switch_site="$c_switch_site `esd-config --cflags`" &&  if test "$extra_verbose" = "yes"; then echo "    Appending \"`esd-config --cflags`\" to \$c_switch_site"; fi
     LIBS="`esd-config --libs` $LIBS" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"`esd-config --libs`\" to \$LIBS"; fi
     echo $ac_n "checking for esd_play_stream""... $ac_c" 1>&6
-echo "configure:13275: checking for esd_play_stream" >&5
+echo "configure:13285: checking for esd_play_stream" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13278 "configure"
+#line 13288 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char esd_play_stream(); below.  */
@@ -13297,7 +13307,7 @@ esd_play_stream();
 
 ; return 0; }
 EOF
-if { (eval echo configure:13301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_esd_play_stream=yes"
 else
@@ -13348,7 +13358,7 @@ test -z "$with_tty" && with_tty=yes
 
 if test "$with_tty" = "yes"  ; then
   echo "checking for TTY-related features" 1>&6
-echo "configure:13352: checking for TTY-related features" >&5
+echo "configure:13362: checking for TTY-related features" >&5
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_TTY
 EOF
@@ -13364,12 +13374,12 @@ EOF
     if test -z "$with_ncurses"; then
     
 echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:13368: checking for tgetent in -lncurses" >&5
+echo "configure:13378: checking for tgetent in -lncurses" >&5
 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lncurses "
 cat > conftest.$ac_ext <<EOF
-#line 13373 "configure"
+#line 13383 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13380,7 +13390,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:13384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13413,15 +13423,15 @@ EOF
 
     ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:13417: checking for ncurses/curses.h" >&5
+echo "configure:13427: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13420 "configure"
+#line 13430 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13425: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13435: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
     ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6
-echo "configure:13447: checking for ncurses/term.h" >&5
+echo "configure:13457: checking for ncurses/term.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13450 "configure"
+#line 13460 "configure"
 #include "confdefs.h"
 #include <ncurses/term.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13455: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13465: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
       c_switch_site="$c_switch_site -I/usr/include/ncurses"
       ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:13485: checking for ncurses/curses.h" >&5
+echo "configure:13495: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13488 "configure"
+#line 13498 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13493: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
        for lib in curses termlib termcap; do
          
 echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6
-echo "configure:13528: checking for tgetent in -l$lib" >&5
+echo "configure:13538: checking for tgetent in -l$lib" >&5
 ac_lib_var=`echo $lib'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$lib "
 cat > conftest.$ac_ext <<EOF
-#line 13533 "configure"
+#line 13543 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13540,7 +13550,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:13544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
     else       if test -n "$libs_termcap" -a "$opsys" = "openbsd"; then
                                 
 echo $ac_n "checking for tgoto in -ltermcap""... $ac_c" 1>&6
-echo "configure:13569: checking for tgoto in -ltermcap" >&5
+echo "configure:13579: checking for tgoto in -ltermcap" >&5
 ac_lib_var=`echo termcap'_'tgoto | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltermcap "
 cat > conftest.$ac_ext <<EOF
-#line 13574 "configure"
+#line 13584 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13581,7 +13591,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:13585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       else
        
 echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:13630: checking for tgetent in -lcurses" >&5
+echo "configure:13640: checking for tgetent in -lcurses" >&5
 ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcurses "
 cat > conftest.$ac_ext <<EOF
-#line 13635 "configure"
+#line 13645 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13642,7 +13652,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:13646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13660,12 +13670,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:13664: checking for tgetent in -ltermcap" >&5
+echo "configure:13674: checking for tgetent in -ltermcap" >&5
 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltermcap "
 cat > conftest.$ac_ext <<EOF
-#line 13669 "configure"
+#line 13679 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13676,7 +13686,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:13680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13724,15 +13734,15 @@ EOF
 
     test -z "$with_gpm" && { ac_safe=`echo "gpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for gpm.h""... $ac_c" 1>&6
-echo "configure:13728: checking for gpm.h" >&5
+echo "configure:13738: checking for gpm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13731 "configure"
+#line 13741 "configure"
 #include "confdefs.h"
 #include <gpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13746: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
  }
   test -z "$with_gpm" && { 
 echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:13759: checking for Gpm_Open in -lgpm" >&5
+echo "configure:13769: checking for Gpm_Open in -lgpm" >&5
 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgpm "
 cat > conftest.$ac_ext <<EOF
-#line 13764 "configure"
+#line 13774 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13771,7 +13781,7 @@ int main() {
 Gpm_Open()
 ; return 0; }
 EOF
-if { (eval echo configure:13775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13821,20 +13831,20 @@ test "$with_x11" = "yes" -o "$with_tty" = "yes" -o "$need_event_unixoid" = "yes"
 
 test "$with_database_gdbm $with_database_dbm $with_database_berkdb" \
   != "no no no" && echo "checking for database support" 1>&6
-echo "configure:13825: checking for database support" >&5
+echo "configure:13835: checking for database support" >&5
 
 if test "$with_database_gdbm $with_database_dbm" != "no no"; then
   ac_safe=`echo "ndbm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ndbm.h""... $ac_c" 1>&6
-echo "configure:13830: checking for ndbm.h" >&5
+echo "configure:13840: checking for ndbm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13833 "configure"
+#line 13843 "configure"
 #include "confdefs.h"
 #include <ndbm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13838: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 if test "$with_database_gdbm" != "no"; then
   
 echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6
-echo "configure:13868: checking for dbm_open in -lgdbm" >&5
+echo "configure:13878: checking for dbm_open in -lgdbm" >&5
 ac_lib_var=`echo gdbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgdbm "
 cat > conftest.$ac_ext <<EOF
-#line 13873 "configure"
+#line 13883 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13880,7 +13890,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:13884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
 if test "$with_database_dbm" != "no"; then
   echo $ac_n "checking for dbm_open""... $ac_c" 1>&6
-echo "configure:13912: checking for dbm_open" >&5
+echo "configure:13922: checking for dbm_open" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13915 "configure"
+#line 13925 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char dbm_open(); below.  */
@@ -13934,7 +13944,7 @@ dbm_open();
 
 ; return 0; }
 EOF
-if { (eval echo configure:13938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_dbm_open=yes"
 else
@@ -13953,12 +13963,12 @@ else
 
     
 echo $ac_n "checking for dbm_open in -ldbm""... $ac_c" 1>&6
-echo "configure:13957: checking for dbm_open in -ldbm" >&5
+echo "configure:13967: checking for dbm_open in -ldbm" >&5
 ac_lib_var=`echo dbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldbm "
 cat > conftest.$ac_ext <<EOF
-#line 13962 "configure"
+#line 13972 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13969,7 +13979,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:13973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -14010,10 +14020,10 @@ EOF
 
 if test "$with_database_berkdb" != "no"; then
   echo $ac_n "checking for Berkeley db.h""... $ac_c" 1>&6
-echo "configure:14014: checking for Berkeley db.h" >&5
+echo "configure:14024: checking for Berkeley db.h" >&5
   for header in "db/db.h" "db.h"; do
     cat > conftest.$ac_ext <<EOF
-#line 14017 "configure"
+#line 14027 "configure"
 #include "confdefs.h"
 
 #include <stdlib.h>
@@ -14035,7 +14045,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:14039: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14049: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   db_h_file="$header"; break
 else
@@ -14051,9 +14061,9 @@ rm -f conftest*
 
   if test "$with_database_berkdb" != "no"; then
     echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6
-echo "configure:14055: checking for Berkeley DB version" >&5
+echo "configure:14065: checking for Berkeley DB version" >&5
     cat > conftest.$ac_ext <<EOF
-#line 14057 "configure"
+#line 14067 "configure"
 #include "confdefs.h"
 #include <$db_h_file>
 #if DB_VERSION_MAJOR > 1
@@ -14065,7 +14075,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   egrep "yes" >/dev/null 2>&1; then
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 14069 "configure"
+#line 14079 "configure"
 #include "confdefs.h"
 #include <$db_h_file>
 #if DB_VERSION_MAJOR > 2
 rm -f conftest*
 
     echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6
-echo "configure:14096: checking for $dbfunc" >&5
+echo "configure:14106: checking for $dbfunc" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 14099 "configure"
+#line 14109 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $dbfunc(); below.  */
@@ -14118,7 +14128,7 @@ $dbfunc();
 
 ; return 0; }
 EOF
-if { (eval echo configure:14122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$dbfunc=yes"
 else
@@ -14137,12 +14147,12 @@ else
 
     
 echo $ac_n "checking for $dbfunc in -ldb""... $ac_c" 1>&6
-echo "configure:14141: checking for $dbfunc in -ldb" >&5
+echo "configure:14151: checking for $dbfunc in -ldb" >&5
 ac_lib_var=`echo db'_'$dbfunc | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldb "
 cat > conftest.$ac_ext <<EOF
-#line 14146 "configure"
+#line 14156 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -14153,7 +14163,7 @@ int main() {
 $dbfunc()
 ; return 0; }
 EOF
-if { (eval echo configure:14157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 if test "$with_socks" = "yes"; then
   
 echo $ac_n "checking for SOCKSinit in -lsocks""... $ac_c" 1>&6
-echo "configure:14221: checking for SOCKSinit in -lsocks" >&5
+echo "configure:14231: checking for SOCKSinit in -lsocks" >&5
 ac_lib_var=`echo socks'_'SOCKSinit | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lsocks "
 cat > conftest.$ac_ext <<EOF
-#line 14226 "configure"
+#line 14236 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -14233,7 +14243,7 @@ int main() {
 SOCKSinit()
 ; return 0; }
 EOF
-if { (eval echo configure:14237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
 if test "$with_modules" != "no"; then
   echo "checking for module support" 1>&6
-echo "configure:14292: checking for module support" >&5
+echo "configure:14302: checking for module support" >&5
 
     if test "$with_msw" = "yes"; then
     have_dl=yes;
   else
         ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
-echo "configure:14299: checking for dlfcn.h" >&5
+echo "configure:14309: checking for dlfcn.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 14302 "configure"
+#line 14312 "configure"
 #include "confdefs.h"
 #include <dlfcn.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14307: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:14317: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -14320,16 +14330,16 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   
       echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6
-echo "configure:14324: checking for dlopen in -lc" >&5
+echo "configure:14334: checking for dlopen in -lc" >&5
       cat > conftest.$ac_ext <<EOF
-#line 14326 "configure"
+#line 14336 "configure"
 #include "confdefs.h"
 #include <dlfcn.h>
 int main() {
        dlopen ("", 0);
 ; return 0; }
 EOF
-if { (eval echo configure:14333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
    have_dl=yes 
 else
@@ -14338,18 +14348,18 @@ else
   rm -rf conftest*
   
       echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:14342: checking for dlopen in -ldl" >&5
+echo "configure:14352: checking for dlopen in -ldl" >&5
       ac_save_LIBS="$LIBS"
       LIBS="-ldl $LIBS"
       cat > conftest.$ac_ext <<EOF
-#line 14346 "configure"
+#line 14356 "configure"
 #include "confdefs.h"
 #include <dlfcn.h>
 int main() {
        dlopen ("", 0);
 ; return 0; }
 EOF
-if { (eval echo configure:14353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
    have_dl=yes 
 else
@@ -14378,12 +14388,12 @@ EOF
     else
       
 echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "configure:14382: checking for shl_load in -ldld" >&5
+echo "configure:14392: checking for shl_load in -ldld" >&5
 ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 14387 "configure"
+#line 14397 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -14394,7 +14404,7 @@ int main() {
 shl_load()
 ; return 0; }
 EOF
-if { (eval echo configure:14398: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -14421,12 +14431,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6
-echo "configure:14425: checking for dld_init in -ldld" >&5
+echo "configure:14435: checking for dld_init in -ldld" >&5
 ac_lib_var=`echo dld'_'dld_init | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 14430 "configure"
+#line 14440 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -14437,7 +14447,7 @@ int main() {
 dld_init()
 ; return 0; }
 EOF
-if { (eval echo configure:14441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -14482,7 +14492,7 @@ xehost=$canonical
 xealias=$internal_configuration
 
 echo "checking how to build dynamic libraries for ${xehost}" 1>&6
-echo "configure:14486: checking how to build dynamic libraries for ${xehost}" >&5
+echo "configure:14496: checking how to build dynamic libraries for ${xehost}" >&5
 # Transform *-*-linux* to *-*-linux-gnu*, to support old configure scripts.
 case "$xehost" in
 *-*-linux-gnu*) ;;
@@ -14510,9 +14520,9 @@ if test "$GCC" = "yes"; then
   XEGCC=yes
 else
   echo $ac_n "checking checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:14514: checking checking whether we are using GNU C" >&5
+echo "configure:14524: checking checking whether we are using GNU C" >&5
   cat > conftest.$ac_ext <<EOF
-#line 14516 "configure"
+#line 14526 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -14534,7 +14544,7 @@ rm -f conftest*
 fi
 
 echo $ac_n "checking how to produce PIC code""... $ac_c" 1>&6
-echo "configure:14538: checking how to produce PIC code" >&5
+echo "configure:14548: checking how to produce PIC code" >&5
 wl=
 
 can_build_shared=yes
@@ -14635,18 +14645,18 @@ if test -n "$dll_cflags"; then
 
   # Check to make sure the dll_cflags actually works.
   echo $ac_n "checking if PIC flag ${dll_cflags} really works""... $ac_c" 1>&6
-echo "configure:14639: checking if PIC flag ${dll_cflags} really works" >&5
+echo "configure:14649: checking if PIC flag ${dll_cflags} really works" >&5
   save_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS $dll_cflags -DPIC"
   cat > conftest.$ac_ext <<EOF
-#line 14643 "configure"
+#line 14653 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=0;
 ; return 0; }
 EOF
-if { (eval echo configure:14650: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   
     # On HP-UX, the stripped-down bundled CC doesn't accept +Z, but also
@@ -14677,7 +14687,7 @@ cc_produces_so=no
 xldf=
 xcldf=
 echo $ac_n "checking if C compiler can produce shared libraries""... $ac_c" 1>&6
-echo "configure:14681: checking if C compiler can produce shared libraries" >&5
+echo "configure:14691: checking if C compiler can produce shared libraries" >&5
 if test "$XEGCC" = yes; then
   xcldf="-shared"
   xldf="-shared"
@@ -14728,14 +14738,14 @@ if test -n "$xcldf"; then
   xe_libs=
   ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
   cat > conftest.$ac_ext <<EOF
-#line 14732 "configure"
+#line 14742 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=0;
 ; return 0; }
 EOF
-if { (eval echo configure:14739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cc_produces_so=yes
 else
@@ -14760,7 +14770,7 @@ if test -z "$LTLD"; then
   if test "$XEGCC" = yes; then
     # Check if gcc -print-prog-name=ld gives a path.
     echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:14764: checking for ld used by GCC" >&5
+echo "configure:14774: checking for ld used by GCC" >&5
     ac_prog=`($CC -print-prog-name=ld) 2>&5`
     case "$ac_prog" in
     # Accept absolute paths.
@@ -14786,7 +14796,7 @@ echo "configure:14764: checking for ld used by GCC" >&5
     esac
   else
     echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:14790: checking for GNU ld" >&5
+echo "configure:14800: checking for GNU ld" >&5
   fi
 
   if test -z "$LTLD"; then
@@ -14824,7 +14834,7 @@ ld_dynamic_link_flags=
 
 # Check to see if it really is or isn't GNU ld.
 echo $ac_n "checking if the linker is GNU ld""... $ac_c" 1>&6
-echo "configure:14828: checking if the linker is GNU ld" >&5
+echo "configure:14838: checking if the linker is GNU ld" >&5
 # I'd rather use --version here, but apparently some GNU ld's only accept -v.
 if $LTLD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
   xe_gnu_ld=yes
@@ -14852,7 +14862,7 @@ else
   # OK - only NOW do we futz about with ld.
   # See if the linker supports building shared libraries.
   echo $ac_n "checking whether the linker supports shared libraries""... $ac_c" 1>&6
-echo "configure:14856: checking whether the linker supports shared libraries" >&5
+echo "configure:14866: checking whether the linker supports shared libraries" >&5
   dll_ld=$CC
   dll_ldflags=$LDFLAGS
   ld_shlibs=yes
@@ -15063,10 +15073,10 @@ EOF
     for ac_func in dlerror _dlerror
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15067: checking for $ac_func" >&5
+echo "configure:15077: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 15070 "configure"
+#line 15080 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -15089,7 +15099,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:15093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -15128,11 +15138,11 @@ done
 fi
 
 cat > conftest.$ac_ext <<EOF
-#line 15132 "configure"
+#line 15142 "configure"
 #include "confdefs.h"
 int main(int c,char *v[]){return 0;}
 EOF
-if { (eval echo configure:15136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:15146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   :
 else
index 9708606..0bf8449 100644 (file)
@@ -3802,8 +3802,22 @@ if test "$need_motif" = "yes" ; then
   XE_COMPUTE_RUNPATH()
 fi
 
+dnl ----------------------------------------------------------------
+dnl Check for POSIX functions.
+dnl ----------------------------------------------------------------
+
 AC_CHECK_FUNCS(cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strerror tzset ulimit usleep waitpid vsnprintf fsync ftruncate umask)
 
+dnl getaddrinfo() is borked under hpux11
+if test "$ac_cv_func_getaddrinfo" != "no" ; then
+  case "$opsys" in
+    hpux11 )
+      AC_MSG_WARN([Use of getaddrinfo is disabled for HP-UX 11.XX.])
+      ac_cv_func_getaddrinfo=no
+      ;;
+  esac
+fi
+
 dnl ----------------------------------------------------------------
 dnl Check for PTY support functions.
 dnl ----------------------------------------------------------------
index 361a596..2b1e1a8 100644 (file)
@@ -2,21 +2,49 @@ Usage: configure [--OPTION[=VALUE] ...] [CONFIGURATION]
 
 Set compilation and installation parameters for XEmacs, and report.
 
-Note that for most of the following options, you can explicitly enable
-them using `--OPTION=yes' and explicitly disable them using `--OPTION=no'.
-This is especially useful for auto-detected options.
-The option `--without-FEATURE' is a synonym for `--with-FEATURE=no'.
-
-Options marked with a (*) are auto-detected.
-
-Many features require external packages to be installed first.
-Get them from ftp://ftp.xemacs.org/pub/xemacs/aux.
+CONFIGURATION is an optional architecture-vendor-os triple, such as
+`sparc-sun-solaris2.7'.  When possible, omit it; configure will detect it.
+
+Conventions for options:
+- Boolean options may be explicitly enabled by using `--OPTION=yes' and
+  explicitly disabled by using `--OPTION=no'.  `--OPTION' (with no argument)
+  is equivalent to `--OPTION=yes'.  `--without-FEATURE' is a synonym for
+  `--with-FEATURE=no'.  Denoted `(Bool)' below.
+- Enumerated options accept one type from a specified list.  These usually
+  accept `--OPTION=no' to disable it entirely, and `--OPTION=yes' often has a
+  useful default.  Denoted `(Enum)'.
+- Set options accept one or more types from a list of implementations of the
+  feature.  All specified implementations will be included.  Prefix a type
+  with `no' to disable only that implementation (e.g., `--with-sound=noesd'
+  to disable ESD).  The special values `none' and `all' must be first in the
+  list if used.  They change the defaults for all types individually from
+  autodetect to `no' or `yes' respectively.  `--with-sound=none,native' and
+  `--with-sound=noesd,nonas,native' have the same effect.  Denoted `(Set)'.
+- Other options have special, option-specific formats.
+
+Options marked with a (*) are auto-detected.  If auto-detected and not
+explicitly specified, normally
+- Boolean options default to `yes'.
+- Enumerated options default to the first detected type in an option-specific
+  priority.  Possible defaults are marked with (*) and listed in order.
+- Set options default to all detected types.
+
+Some options are provided mainly to disable features which are on by default.
+These are indicated by specifying `--OPTION=no'.  Explicitly specifying an
+autodetected option which defaults to `yes' makes a failure to detect signal
+a fatal configure error.
 
 Use colons (or quoted spaces) to separate directory names in option
 values which are PATHs (i.e. lists of directories).
 
+Many features require external packages to be installed.  configure will fail
+if an explicitly requested feature depends on an uninstalled package.  On many
+Linux systems, you must install -devel versions of the package.
+
 The results of configure tests are saved in config.log, which is useful
-for diagnosing problems.
+for diagnosing problems.  Caching of configure results is disabled.
+If successful, configure leaves its status in config.status.  If
+unsuccessful after disturbing the status quo, it removes config.status.
 
 
 General options:
@@ -29,115 +57,121 @@ General options:
 Compilation options:
 
 --compiler=PROG         C compiler to use
---with-gcc (*)          Use GCC to compile XEmacs.
---cflags=FLAGS          Compiler flags (such as -O)
---cpp=PROG              C preprocessor to use (e.g. /usr/ccs/lib/cpp or cc -E)
---cppflags=FLAGS        C preprocessor flags (e.g. -I/foo or -Dfoo=bar)
---libs=LIBS             Additional libraries (e.g. -lfoo)
---ldflags=FLAGS         Additional linker flags (e.g. -L/foo)
+--with-gcc (*)          (Bool) Use GCC to compile XEmacs.
+--cflags=FLAGS          Compiler flags (such as `-O')
+--cpp=PROG              Set C preprocessor (e.g. `/usr/ccs/lib/cpp', `cc -E')
+--cppflags=FLAGS        C preprocessor flags (e.g. `-I/foo' or `-Dfoo=bar')
+--libs=LIBS             Additional libraries (e.g. `-lfoo')
+--ldflags=FLAGS         Additional linker flags (e.g. `-L/foo')
 --site-includes=PATH    List of directories to search first for header files
 --site-libraries=PATH   List of directories to search first for libraries
 --site-prefixes=PATH    List of directories to search for include/ and lib/
                         subdirectories, just after 'site-includes' and
                         'site-libraries'
---site-runtime-libraries=PATH
-                        List of ALL directories to search for dynamically
-                        linked libraries at run time
---dynamic=yes           Link dynamically if supported by system.
---dynamic=no            Force static linking on systems where dynamic
-                        linking is the default.
---srcdir=DIR            Look for the XEmacs source files in DIR.
-                        Works best when using GNU Make.
+--site-runtime-libraries=PATH  List of ALL directories to search for
+                        dynamically linked libraries at run time
+--dynamic (*)           (Bool) Link dynamically if supported by system.
+                        The default is system-dependent.
+--srcdir=DIR            Use the XEmacs source files in DIR.  Requires a Make
+                        with VPATH; GNU Make is recommended.
 
 
 Installation options:
 
 --prefix=DIR            Install files below DIR.  Defaults to `/usr/local'.
---with-prefix=no        Don't compile the value of --prefix into the
-                        executable.
+--with-prefix=no        (Bool) Compile the value of `--prefix' into XEmacs.
+--infodir=DIR           Install XEmacs Info manuals and dir in DIR.
+--moduledir=DIR         Install dynamic modules in DIR.
+
+You may also specify any of the `path' variables found in Makefile.in.in,
+including `--bindir', `--libdir', `--docdir', `--lispdir', `--sitelispdir',
+`--datadir', `--mandir' and so on.  These options are DEPRECATED; see INSTALL.
+
+
+Runtime search path options:
+
+--with-site-modules=no  (Bool) Search directories in the XEmacs hierarchy named
+                        `site-modules' before the installed module directories.
+--with-site-lisp        (Bool) Search a site-lisp directory in the XEmacs
+                        hierarchy before the packaged Lisp.  DEPRECATED.
+--package-path=PATH     Directories to search for packages to dump with xemacs.
+                        PATH splits into three parts separated by double
+                        colons (::), an `early', a `late', and a `last' part,
+                        corresponding to their position in the various
+                        system paths:  The `early' part is always first,
+                        the `late' part somewhere in the middle, and the
+                        `last' part at the very back.
+                        Only the `late' part gets seen at dump time.
+                        If PATH has only one component, it is `late'.  With two
+                        components, the first is `early', the second is `late'.
+--infopath=PATH         Directories to search for Info documents, info dir
+                        and localdir files if run-time searching fails.
 
 
 Window-system options:
 
---with-gtk              Support GTK on the X Window System. (EXPERIMENTAL)
---with-gnome            Support GNOME on the X Window System. (EXPERIMENTAL)
---with-x11 (*)          Support the X Window System.
+--with-gtk              (Bool) Use GTK on the X Window System. (EXPERIMENTAL)
+--with-gnome            (Bool) Use GNOME on the X Window System. (EXPERIMENTAL)
+--with-x11 (*)          (Bool) Support the X Window System.
 --x-includes=DIR        Search for X header files in DIR.
 --x-libraries=DIR       Search for X libraries in DIR.
---with-msw (*)          Support MS Windows as a window system (only under
-                        Cygwin and MinGW).  `--with-msw=no' may be needed on
-                        *nix systems with Wine installed.
---with-toolbars=no      Don't compile with any toolbar support.
---with-wmcommand=no     Compile without realized leader window which will
-                        keep the WM_COMMAND property.
---with-athena=TYPE      Use TYPE Athena widgets
-                        (xaw, 3d, next, 95, or xpm)
---with-menubars=TYPE    Use TYPE menubars (lucid, motif, or no).  The Lucid
-                        widgets emulate Motif (mostly) but are faster.
+--with-msw (*)          (Bool) Support MS Windows as a window system (only
+                        under Cygwin and MinGW).  `--with-msw=no' may be needed
+                        on *nix systems with Wine installed.
+--with-wmcommand=no     (Bool) Compile without realized leader window which
+                        will keep the WM_COMMAND property.
+--with-xmu=no (*)       (Bool) For systems whose vendors don't ship Xmu.
+
+
+GUI component options:
+
+Select the widget set used to implement components, Lucid, Motif, or Athena.
+If `--with-gtk', `--with-gnome', or `--with-msw' are used or implied, treat
+component options as Bool.  The `lucid' widgets are a homebrew set, emulating
+Motif but faster.  Lucid toolbars, menubars, and scrollbars are implemented
+in Xt.  Lucid dialogs and misc widgets wrap and enhance Athena (maybe Motif;
+platform-dependent).  Several enhanced (eg, 3d) Athena libraries may be used,
+but the default is the X11R6 `libXaw' (flat) widgets.  Use `--with-athena' to
+explicitly specify which library to link against.
+
+--with-toolbars=no      (Bool) Don't compile with any toolbar support.
+--with-menubars=TYPE    (Enum) Types: `lucid'(*), `motif', or `no'.
                         *WARNING*  The Motif menubar is currently broken.
---with-scrollbars=TYPE  Use TYPE scrollbars
-                        (lucid, motif, athena, or no).
---with-dialogs=TYPE     Use TYPE dialog boxes (lucid, motif, athena, or no).
-                        Lucid menubars and scrollbars are the default.
-                        Motif dialog boxes will be used if Motif can be found.
---with-widgets=TYPE     Use TYPE widgets (lucid, motif, athena, or no).
-                        Motif widgets will be used if Motif can be found.
-                        Other widget types are currently unsupported.
---with-dragndrop        Compile in the generic drag and drop API. This is
-                        automatically added if one of the drag and drop
-                        protocols is found (currently CDE, OffiX, MSWindows,
-                        and GTK).
-                        *WARNING*  The Drag'n'drop support is under development
-                                   and is considered experimental.
---with-cde              Compile in support for CDE drag and drop.
---with-offix            Compile in support for OffiX drag and drop.
-                        *WARNING*  If you compile in OffiX, you may not be
-                                   able to use multiple X displays success-
-                                   fully.  If the two servers are from
-                                   different vendors, the results may be
-                                   unpredictable.
---with-xmu=no (*)       For those unfortunates whose vendors don't ship Xmu.
---external-widget       Compile with external widget support.
+--with-scrollbars=TYPE  (Enum) Types: `lucid'(*), `motif', `athena', or `no'.
+--with-dialogs=TYPE     (Enum) Types: `motif'(*), `lucid'(*), `athena', or `no'.
+--with-widgets=TYPE     (Enum) Types: `motif'(*), `lucid', `athena', or `no'.
+--with-athena=TYPE      (Enum) Link with the TYPE Athena library.  Types:
+                        `xaw' [flat], `3d', `next', `95', or `xpm'.
+--with-dragndrop (*)    Support generic drag and drop API. (EXPERIMENTAL)
+--with-cde              Support CDE drag and drop API (requires dragndrop).
+--with-offix            Support OffiX drag and drop API (requires dragndrop).
+                        *WARNING*  OffiX support may interfere with use of
+                        multiple X displays.  If the two servers are from
+                        different vendors, the results may be unpredictable.
 
 
 TTY (character terminal) options:
 
 --with-tty=no           Don't support ttys.
 --with-ncurses (*)      Use the ncurses library for tty support.
---with-gpm (*)          Compile in GPM mouse support for ttys.
+--with-gpm (*)          Support the GPM mouse library for ttys.
 
 
 Image options:
 
---with-xpm (*)          Compile with support for XPM images.  PRACTICALLY
-                        REQUIRED.  Although this library is nonstandard and
-                        a real hassle to build, many basic things (e.g.
-                        toolbars) depend on it, and you will run into
-                        many problems without it.
---with-png (*)          Compile with support for PNG images.  Recommended
-                        because the images on the About page are not viewable
-                        without it.
---with-jpeg (*)         Compile with support for JPEG images.  Useful if
-                        you are using a mail, news reader, or web browser
-                        in XEmacs, so that JPEG images can be displayed.
---with-tiff (*)         Compile with support for TIFF images.  Possibly
-                        useful, for the same reason as JPEG images.
---with-xface (*)        Compile with support for X-Face mail headers.
-                        Requires the compface package.  Of doubtful
-                        usefulness.
---with-gif=no           Compile without the (builtin) support for GIF images.
+--with-xpm (*)          Support XPM images.  Toolbars depend on it.
+--with-png (*)          Support PNG images.  Strongly recommended.
+--with-jpeg (*)         Support JPEG images.
+--with-tiff (*)         Support TIFF images.
+--with-xface (*)        Support X-Face mail headers.  Requires libcompface.
+--with-gif=no           Omit the (builtin) support for GIF images.
 
 
 Sound options:
 
---with-sound=TYPE[,TYPE[,...]] (*) Compile with sound support.
-                        Valid types are `native', `nas' and `esd'.
-                        Prefix a type with 'no' to disable.
-                        The first type can be `none' or `all'.  `none' means
-                        `nonative,nonas,noesd'.  `all' means `native,nas,esd'.
-                        Later options override earlier ones for the same TYPE.
-                        Autodetect native and NAS sound unless specified.
-                        ESD must be explicitly requested.
+--with-sound=TYPES (*)  (Set) Compile with sound support.
+                        Types: `native', `nas' and `esd'.
+                        Defaults to `noesd', the others are autodetected.
 --native-sound-lib=LIB  Native sound support library.  Needed on Suns
                         with `--with-sound=native,nas' because both sound
                         libraries are called libaudio.
@@ -145,138 +179,86 @@ Sound options:
 
 Database options:
 
---with-database=TYPE (*) Compile with database support.  Valid types are
-                        `no' or a comma-separated list of one or more
-                        of `berkdb' and either `dbm' or `gnudbm'.
---with-ldap (*)         Compile with support for the LDAP protocol.
---with-postgresql (*)   Compile with support for the PostgreSQL RDBMS.
+--with-database=TYPES (*)  (Set) Support key:value databases.
+                        Types: `berkdb', `dbm', or `gnudbm'.  `dbm' and
+                        `gnudbm' are incompatible with each other.
+--with-ldap (*)         (Bool) Support the LDAP protocol.
+--with-postgresql (*)   (Bool) Support the PostgreSQL RDBMS.
 
 
 Mail options:
 
---mail-locking=TYPE (*) Specify the locking to be used by movemail to prevent
-                        concurrent updates of mail spool files. Valid types
-                        are `lockf', `flock', `dot', `locking' or `mmdf'.
---with-pop              Support POP for mail retrieval.
---with-kerberos         Support Kerberos-authenticated POP.
---with-hesiod           Support Hesiod to get the POP server host.
+--mail-locking=TYPE (*) (Enum) Specify the locking method used by movemail.
+                        Types: `lockf', `flock', `dot', `locking' or `mmdf'.
+--with-pop              (Bool) Support POP for mail retrieval.
+--with-kerberos         (Bool) Support Kerberos-authenticated POP.
+--with-hesiod           (Bool) Support Hesiod to get the POP server host.
 
 
-Additional features:
+Internationalization options:
 
---with-tooltalk (*)     Support the ToolTalk IPC protocol.
---with-workshop         Support the Sun WorkShop (formerly Sparcworks)
-                        development environment.
---with-socks            Compile with support for SOCKS (an Internet proxy).
---with-dnet (*)         Compile with support for DECnet.
---with-modules (*)      Compile in experimental support for dynamically
-                        loaded libraries (Dynamic Shared Objects).
---with-netinstall       Compile in support for installation over the internet.
-                        Only functional on the MS Windows platforms.
---with-ipv6-cname=yes   Try IPv6 information first when canonicalizing host
-                        names.  This option has no effect unless system
-                        supports getaddrinfo(3) and getnameinfo(3).
---with-site-lisp=yes    Allow for a site-lisp directory in the XEmacs hierarchy
-                        searched before the installation packages.
---with-site-modules=no  Disable site-modules directory in the XEmacs hierarchy,
-                        which is searched before the installation modules.
---package-path=PATH     Directories to search for packages to dump with xemacs.
-                        PATH splits into three parts separated by double
-                        colons (::), an early, a late, and a last part,
-                        corresponding to their position in the various
-                        system paths:  The early part is always first,
-                        the late part somewhere in the middle, and the
-                        last part at the very back.
-                        Only the late part gets seen at dump time.
-                        If PATH has only one component, that component
-                        is late.
-                        If PATH has two components, the first is
-                        early, the second is late.
---infodir=DIR           Directory to install XEmacs Info manuals and dir in.
---infopath=PATH         Directories to search for Info documents, info dir
-                        and localdir files in case run-time searching
-                        for them fails.
---moduledir=DIR         Directory to install dynamic modules in.
---pdump                 New, experimental, don't-sue-me-if-your-house-
-                        collapses-and-your-wife-leaves-you, portable dumper.
---with-file-coding      Allows transparent use of "foreign" line break
-                        conventions in text files (such as LF-delimited text
-                        imported from a Unix system to a Windows environment),
-                        optionally including autodetection.  Defaults to ON
-                        on Windows, OFF on Unix.
+--with-mule             (Bool) Support non-Latin-1 (including Asian) languages.
+--with-xim=TYPE         (Enum) Support X Input Method protocol.  Types:
+                        `motif'(*), `xlib', `no'.  Requires Mule.
+--with-canna (*)        (Bool) Support the Canna input method.  Requires Mule.
+--with-wnn (*)          (Bool) Support the Wnn input methods.  Requires Mule.
+--with-wnn6 (*)         (Bool) Support the commercial version of Wnn.
+--with-xfs              (Bool) Support internationalized menubar via XFontSets.
+                        `--with-menubars=lucid' (the default) is desirable.
+                        Incompatible with `--with-xim=motif'.
 
 
-Internationalization options:
+Additional features:
 
---with-mule             Compile with Mule (MUlti-Lingual Emacs) support,
-                        needed to support non-Latin-1 (including Asian)
-                        languages.
---with-xim=xlib         Compile with support for X input methods,
---with-xim=motif (*)    Used in conjunction with Mule support.
-                        Use either raw Xlib to provide XIM support, or
-                        the Motif XmIm* routines (when available).
-                        NOTE:  On some systems bugs in X11's XIM support
-                        will cause XEmacs to crash, so by default,
-                        no XIM support is compiled in, unless running
-                        on Solaris and the XmIm* routines are detected.
---with-canna (*)        Compile with support for Canna (a Japanese input method
-                        used in conjunction with Mule support).
---with-wnn (*)          Compile with support for Wnn (a multi-language input
-                        method used in conjunction with Mule support).
---with-wnn6 (*)         Compile with support for the commercial package Wnn6.
---with-i18n3            Compile with I18N level 3 (support for message
-                        translation).  This doesn't currently work.
---with-xfs              Compile with XFontSet support for internationalized
-                        menubar.  Incompatible with `--with-xim=motif'.
-                        `--with-menubars=lucid' (the default) is desirable.
+--with-workshop         (Bool) Support the Sun WorkShop (formerly Sparcworks)
+                        development environment.
+--with-tooltalk (*)     (Bool) Support the ToolTalk IPC protocol.
+--with-socks            (Bool) Support SOCKS (an Internet proxy).
+--with-dnet (*)         (Bool) Support DECnet.
+--with-netinstall       (Bool) Support installation over the internet.
+                        Only functional on MS Windows platforms.
+--with-ipv6-cname       (Bool) IPv6-ly correct host name canonicalization.
+                        IPv6 is always supported if detected; this option
+                        prevents blocking and unwanted dialup for CNAME lookup.
+--external-widget       (Bool) Export XEmacs as a text widget. (EXPERIMENTAL)
+--with-modules (*)      (Bool) Support for dynamically loaded libraries
+                        (Dynamic Shared Objects). (EXPERIMENTAL)
+--pdump                 (Bool) Somewhat experimental portable dumper.
+--with-file-coding      (Bool) Support detection and translation of newline
+                        conventions.  Default:  `yes' on Windows, `no' on Unix.
+--with-clash-detection=no  (Bool) Detect other instances editing the same file.
+
+
+Memory allocation options:
+
+--rel-alloc             (Bool) Use the relocating allocator (default for this
+                        option is system-dependent).
+--with-dlmalloc=no      (Bool) Don't use Doug Lea malloc on systems that have
+                        it in the standard C library.
+--with-system-malloc    (Bool) Use the system malloc, instead of GNU malloc.
+--with-debug-malloc     (Bool) Use the debugging malloc package.
 
 
 Debugging options:
 
---debug                 Compile with support for debugging XEmacs.
+--debug                 (Bool) Compile with support for debugging XEmacs.
                         (Causes code-size increase and little loss of speed.)
---error-checking=TYPE[,TYPE]...
-                        Compile with internal error-checking added.
-                        Causes noticeable loss of speed.  Valid types
-                        are extents, bufpos, malloc, gc, typecheck.
---error-checking=none   Disable all internal error-checking (the default).
---error-checking=all    Enable all internal error-checking.
---memory-usage-stats    Compile with additional code to allow you to
+--memory-usage-stats    (Bool) Compile with additional code to allow you to
                         determine what XEmacs's memory is being used
                         for.  Causes a small code increase but no loss
-                        of speed.  Normally enabled when --debug is given.
---no-doc-file           Don't rebuild the DOC file unless it's explicitly
-                        deleted.  Only use during development. (It speeds
-                        up the compile-run-test cycle.)
---quick-build           Don't GC when dumping.  Implies --no-doc-file.
---use-union-type        Enable or disable use of a union, instead of an
-                        int, for the fundamental Lisp_Object type; this
-                        provides stricter type-checking.  Only works with
-                        some systems and compilers.
---with-quantify         Add support for performance debugging using Quantify.
---with-purify           Add support for memory debugging using Purify.
-
-
-Other options:
-
---rel-alloc             Use the relocating allocator (default for this option
-                        is system-dependent).
---with-dlmalloc         Control usage of Doug Lea malloc on systems that have
-                        it in the standard C library (default is to use it if
-                        it is available).
---with-system-malloc    Force use of the system malloc, rather than GNU malloc.
---with-debug-malloc     Use the debugging malloc package.
---with-clash-detection  Use lock files to detect multiple edits of the same
-                        file.  The default is to do clash detection.
+                        of speed.  Normally enabled when `--debug' is given.
+--error-checking=TYPES  (Set) Compile with internal error-checking added.
+                        Causes noticeable loss of speed.  Types: `bufpos',
+                        `byte-code', `extents', `gc', `glyphs', `malloc', and
+                        `typecheck'.  The default value is `none'.
+--use-union-type        (Bool) Define Lisp_Object as a union, not an int.
+                        Provides stricter type-checking.  System-dependent.
+--no-doc-file           (Bool) Don't rebuild the DOC file unless it's missing.
+                        Only use during development.
+--quick-build           (Bool) Don't GC when dumping.  Implies `--no-doc-file'.
+--with-quantify         (Bool) Support performance debugging using Quantify.
+--with-purify           (Bool) Support memory debugging using Purify.
 
-You may also specify any of the `path' variables found in Makefile.in.in,
-including --bindir, --libdir, --docdir, --lispdir, --sitelispdir,
---datadir, --infodir, --mandir and so on.  Note that we recommend
-against explicitly setting any of these variables.  See the INSTALL
-file for a complete list plus the reasons we advise not changing them.
-
-If successful, configure leaves its status in config.status.  If
-unsuccessful after disturbing the status quo, it removes config.status.
 
 The configure script also recognizes some environment variables, each
 of which is equivalent to a corresponding configure flag.  Configure
index 26a91fd..3670938 100644 (file)
--- a/etc/BETA
+++ b/etc/BETA
@@ -19,22 +19,32 @@ and coding discussion, takes place on the XEmacs Beta mailing list.
 Only patches and administrative actions regarding patches are sent
 elsewhere (to the XEmacs Patches list).
 
-** XEmacs Patches Mailing List
-==============================
+*** XEmacs Patches Mailing List
+-------------------------------
 
 XEmacs Patches records proposed changes to XEmacs, and their
-disposition.  It is open subscription, but only patches and actions by
-members of the XEmacs Review Board should be posted to this list.  You
+disposition.  It is open subscription, and all patches that are
+seriously proposed for inclusion in XEmacs should be posted here.  You
 can follow progress of your patch by subscribing to the mailing list
 or in the archives.
 
-** List Administrivia
-=====================
+Besides patches, only actions by members of the XEmacs Review Board
+should be posted to this list.  All discussion should be redirected to
+XEmacs Beta or XEmacs Design.
+
+*** XEmacs Design Mailing List
+------------------------------
+
+XEmacs Design is for design discussions such as adding major features
+or whole modules, or reimplementation of existing functions, to XEmacs.
+
+*** List Administrivia
+----------------------
 
 In the descriptions below, the word LIST (all uppercase) is a
-variable.  Substitute "beta" or "patches" as appropriate (to get
-"xemacs-beta" as the mailbox for the XEmacs Beta mailing list, or
-http://www.xemacs.org/Lists/#xemacs-beta for its URL).
+variable.  Substitute "beta", "design", or "patches" as appropriate
+(to get "xemacs-beta" as the mailbox for the XEmacs Beta mailing list,
+or http://www.xemacs.org/Lists/#xemacs-beta for its URL).
 
 The XEmacs mailing lists are managed by the Mailman mailing list
 package, and the usual Mailman commands work.  Do not send mailing
@@ -47,6 +57,9 @@ have searchable archives.  The URL is
 
             http://list-archive.xemacs.org/xemacs-LIST
 
+Note that the xemacs-LIST-admin address is used internally by the
+Mailman software; it is NOT a synonym for xemacs-LIST-request.
+
 *** Managing your subscription via the Web
 ------------------------------------------
 
@@ -362,11 +375,15 @@ Note that this is in essence what `make all-elc' has always done.
 ** Creating patches for submission
 ==================================
 
-Patches to XEmacs should be mailed to <xemacs-patches@xemacs.org>.
-Each patch will be reviewed by the patches review board, and will be
+All patches to XEmacs that are seriously proposed for inclusion (eg,
+bug fixes) should be mailed to <xemacs-patches@xemacs.org>.  Each
+patch will be reviewed by the patches review board, and will be
 acknowledged and added to the distribution, or rejected with an
 explanation.  Progress of the patch is tracked on the XEmacs Patches
-mailing list, which is open subscription.
+mailing list, which is open subscription.  (If a patch is simply
+intended to facilitate discussion, "I mean something that works like
+this but this is really rough", a CC to XEmacs Patches is optional,
+but doesn't hurt.)
 
 Patches to XEmacs Lisp packages should be sent to the maintainer of
 the package.  If the maintainer is listed as `XEmacs Development Team'
@@ -446,10 +463,9 @@ on the side of posting to xemacs-patches.
 
 Discussion of the _content_ of the patch (ie responses to reviewer
 comments beyond "that's right, ok, I'll do it your way") should _always_
-be posted to xemacs-beta.  (We may split xemacs-beta into code
-discussion and stuff that is more relevant to non-developer testers at
-some point, but at this point xemacs-beta is the correct place for
-this.)
+be posted to xemacs-beta or to xemacs-design.  If you're not sure
+which is more appropriate, send it to xemacs-beta.  That is the most
+widely read channel.
 
 If discussion results in a bright idea and you come up with a new
 patch, normally you should post it to both mailing lists.  The people
@@ -461,7 +477,7 @@ as usual.  If it has not been applied, then it is best to submit a new
 patch against CVS.  If possible do this as a reply to the original
 patch post, or something following it in the thread.  (The point is to
 get the original patch post's Message-ID in your References header.)
-In this case, also use the keyword SUPERCEDES in the Subject header to
+In this case, also use the keyword SUPERSEDES in the Subject header to
 indicate that the old patch is no longer valid, and that this one
 replaces it.
 
index 2dda0f9..1205b31 100644 (file)
 ! *menubar*FontSet:    -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*, \
 !                      -*-*-*-*-*-*-*-120-*-jisx0208.1983-0
 !
-*menubar*Font:                         -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*
+*menubar*Font:                 -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*
 *popup*Font:                   -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*
+*menubar*FontSet:      -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*, \
+                       -*-*-*-*-*-*-*-120-*-iso10646-1, \
+                       -*-*-*-*-*-*-*-120-*-jisx0208.1983-0, \
+                       -*-*-*-*-*-*-*-120-*-jisx0201.1976-0
+*popup*FontSet:                -*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-*, \
+                       -*-*-*-*-*-*-*-120-*-iso10646-1, \
+                       -*-*-*-*-*-*-*-120-*-jisx0208.1983-0, \
+                       -*-*-*-*-*-*-*-120-*-jisx0201.1976-0
 
 ! Gui elements share this font
 !
index 91d8b12..da16190 100644 (file)
@@ -35,10 +35,14 @@ theme for the releases following the promotion of 21.4 from "gamma" to
 21.4.12: Rational FORTRAN
 21.4.13: Reasonable Discussion
 21.4.14: Security Through Obscurity
-21.4.15: Stable Release Maintainer
-21.4.16: Standard C
-21.4.17: Successful IPO
-21.4.18: Sufficiently Smart Compiler
+21.4.15: Social Property
+21.4.16: Stable Release Maintainer
+21.4.17: Standard C
+21.4.18: Successful IPO
+21.4.19: Sufficiently Smart Compiler
+21.4.20: The Gift Economy
+21.4.21: Too Much Mozart
+21.4.22: UTF-8 BOM
 
 N.B.  Only incredibly redeeming suggestions can be accepted now.
 
index e78ae19..7dc64ac 100644 (file)
@@ -711,7 +711,7 @@ cha
 
 >> Déplacez le curseur sur la ligne blanche en dessous de ce
    paragraphe, puis tapez
-   M-x repls<Return>Remarquez<Return>Notez<Return>.
+   M-x repl<Return>s<Return>Remarquez<Return>Notez<Return>.
 
    Remarquez comme cette ligne a changé: le mot R-e-m-a-r-q-u-e-z a
    été remplacé par N-o-t-e-z partout où il est apparu après le
index 72125a3..4c9d071 100644 (file)
@@ -1,3 +1,7 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index e5af893..93e89a6 100644 (file)
@@ -1,3 +1,70 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * font-lock.el (font-lock-fontify-keywords-region): Fix typo.
+
+2002-10-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * keydefs.el (global-map): Bind C-xrd to delete-rectangle per GNU.
+
+2001-05-10   Daiki Ueno  <ueno@unixuser.org>
+
+       * font-lock.el (font-lock-compile-keywords): Rewrite as a side
+       effect free function.
+       (font-lock-fontify-keywords-region): Supply the argument to
+       font-lock-compile-keywords.
+
+2002-09-22  Ville Skyttä  <ville.skytta@xemacs.org>
+
+       * package-get.el (package-get-download-sites): Bring sites list
+       up to date, prefer xx.xemacs.org addresses.
+
+2002-09-27  Andy Piper  <andy@xemacs.org>
+
+       * dialog.el (make-dialog-box): for general dialogs only
+       delete-frame-hook will be run.
+
+2002-09-28  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * font-lock.el (font-lock-fontify-syntactically-region): Add
+       comment about lookup-syntax-properties, document LOUDLY as unused.
+
+2002-08-26  Andy Piper  <andy@xemacs.org>
+
+       * gutter-items.el (set-progress-feedback-instantiator): Fix bad
+       merge.
+
+2002-09-02  Ville Skyttä  <ville.skytta@xemacs.org>
+
+       * bytecomp-runtime.el (make-obsolete): Docstring argument nit.
+       (make-obsolete-variable): Ditto.
+       (make-compatible): Ditto.
+       (make-compatible-variable): Ditto.
+
+2002-09-16  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * obsolete.el (parse-sexp-lookup-properties): new compatible alias
+       for `lookup-syntax-properties'.  RFE from Alan Mackenzie.
+
+2002-08-28  Andy Piper  <andy@xemacs.org>
+
+       * files.el (revert-buffer): propagate revert-without-query-status.
+
+2002-06-03  Andy Piper  <andy@xemacs.org>
+
+       * dialog-items.el (make-search-dialog): align various subcontrols
+       in visually pleasing ways, allow frame to autosize to the dialog
+       size.
+       * dialog.el (make-dialog-box): add a border inside the frame. Add
+       :autosize property, if t then reset the frame size appropriately
+       before the frame is mapped.
+       * gutter-items.el (set-progress-feedback-instantiator): align
+       various subcontrols.
+       * gutter-items.el (set-progress-abort-instantiator): ditto.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index cd681c4..35096b5 100644 (file)
@@ -131,19 +131,22 @@ be used only with -batch." nil nil)
 ;;;### (autoloads (build-report) "build-report" "lisp/build-report.el")
 
 (autoload 'build-report "build-report" "\
-Composes a fresh mail message with the contents of the built XEmacs
-Installation file and excerpts from XEmacs make output.
-`compose-mail' is used to create the mail message.  Point is left at
-the beginning of the mail text.  You may add some personal notes if
-you like and send the report.
-See also
-  `compose-mail', `mail-user-agent',
-  `build-report-destination',
-  `build-report-keep-regexp',
-  `build-report-delete-regexp',
-  `build-report-make-output-dir',
-  `build-report-make-output-files', and
-  `build-report-installation-file'." t nil)
+Report build information including Installation and make output.
+
+Prompts for status (usually \"Success\" or \"Failure\").  Then uses
+`compose-mail' to create a mail message.  The Subject header contains
+status and version information.  Point is left at the beginning of the
+mail text.  Add some notes if you like, and send the report.
+
+Looks for Installation and the make output file (`beta.err' by
+default, customizable via `build-report-make-output-files') in the
+build directory of the running XEmacs by default (customizable via
+`build-report-make-output-dir').  The output from make is filtered
+through `build-report-keep-regexp' and `build-report-delete-regexp'
+before including in the message.
+
+See also `mail-user-agent', `build-report-destination', and
+`build-report-installation-file'." t nil)
 
 ;;;***
 \f
@@ -861,7 +864,8 @@ in the tag table that matches the tagname used in the previous find-tag.
 the tag.
 
 This version of this function supports multiple active tags tables,
-and completion.
+and completion. See also the commands `\\[push-tag-mark]' and
+`\\[pop-tag-mark]'.
 
 Variables of note:
 
@@ -1223,7 +1227,8 @@ or if you change your font path, you can call this to re-initialize the menus."
 \f
 ;;;### (autoloads (x-font-build-cache font-default-size-for-device font-default-encoding-for-device font-default-registry-for-device font-default-family-for-device font-default-object-for-device font-default-font-for-device font-create-object) "font" "lisp/font.el")
 
-(autoload 'font-create-object "font" nil nil nil)
+(autoload 'font-create-object "font" "\
+Return a font descriptor object for FONTNAME, appropriate for DEVICE." nil nil)
 
 (autoload 'font-default-font-for-device "font" nil nil nil)
 
@@ -1430,7 +1435,7 @@ If you don't like the lazy invocation of this function, you can add it to
 when they are selected for the first time.  If you add fonts to your system, 
 or if you change your font path, you can call this to re-initialize the menus." nil nil)
 
-(defun* mswindows-font-menu-font-data (face dcache) (let* ((case-fold-search t) (domain (if font-menu-this-frame-only-p (selected-frame) (selected-device))) (name (font-instance-name (face-font-instance face domain))) (truename (font-instance-truename (face-font-instance face domain (if (featurep 'mule) 'ascii)))) family size weight entry slant) (when (string-match mswindows-font-regexp name) (setq family (match-string 1 name)) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match mswindows-font-regexp truename)) (setq family (match-string 1 truename)) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from mswindows-font-menu-font-data (make-vector 5 nil))) (when (string-match mswindows-font-regexp name) (setq weight (match-string 2 name)) (setq size (string-to-int (match-string 4 name)))) (when (string-match mswindows-font-regexp truename) (when (not (member weight (aref entry 1))) (setq weight (match-string 2 truename))) (when (not (member size (aref entry 2))) (setq size (string-to-int (match-string 4 truename)))) (setq slant (match-string 5 truename))) (vector entry family size weight slant)))
+(defun* mswindows-font-menu-font-data (face dcache) (let* ((case-fold-search t) (domain (if font-menu-this-frame-only-p (selected-frame) (selected-device))) (name (font-instance-name (face-font-instance face domain))) (truename (font-instance-truename (face-font-instance face domain (if (featurep 'mule) 'ascii)))) family size weight entry slant) (when (string-match mswindows-font-regexp name) (setq family (match-string 1 name)) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match mswindows-font-regexp truename)) (setq family (match-string 1 truename)) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from mswindows-font-menu-font-data (make-vector 5 nil))) (when (string-match mswindows-font-regexp name) (setq weight (match-string 2 name)) (setq size (string-to-int (or (match-string 4 name) "0")))) (when (string-match mswindows-font-regexp truename) (when (not (member weight (aref entry 1))) (setq weight (match-string 2 truename))) (when (not (member size (aref entry 2))) (setq size (string-to-int (or (match-string 4 truename) "0")))) (setq slant (match-string 5 truename))) (vector entry family size weight slant)))
 
 ;;;***
 \f
@@ -1503,7 +1508,7 @@ recent to least recent -- in other words, the version names don't have to
 be lexically ordered.  It is debatable if it makes sense to have more than
 one version of a package available.")
 
-(defcustom package-get-download-sites '(("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages") ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages") ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages") ("ualberta.ca (Canada)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages") ("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages") ("unc.edu (United States)" "metalab.unc.edu" "pub/packages/editors/xemacs/packages") ("utk.edu (United States)" "ftp.sunsite.utk.edu" "pub/xemacs/packages") ("unicamp.br (Brazil)" "ftp.unicamp.br" "pub/xemacs/packages") ("tuwien.ac.at (Austria)" "gd.tuwien.ac.at" "editors/xemacs/packages") ("auc.dk (Denmark)" "sunsite.auc.dk" "pub/emacs/xemacs/packages") ("doc.ic.ac.uk (England)" "sunsite.doc.ic.ac.uk" "packages/xemacs/packages") ("funet.fi (Finland)" "ftp.funet.fi" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages") ("cenatls.cena.dgac.fr (France)" "ftp.cenatls.cena.dgac.fr" "Emacs/xemacs/packages") ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages") ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages") ("kfki.hu (Hungary)" "ftp.kfki.hu" "pub/packages/xemacs/packages") ("eunet.ie (Ireland)" "ftp.eunet.ie" "mirrors/ftp.xemacs.org/pub/xemacs/packages") ("uniroma2.it (Italy)" "ftp.uniroma2.it" "unix/misc/dist/XEMACS/packages") ("uio.no (Norway)" "sunsite.uio.no" "pub/xemacs/packages") ("icm.edu.pl (Poland)" "ftp.icm.edu.pl" "pub/unix/editors/xemacs/packages") ("srcc.msu.su (Russia)" "ftp.srcc.msu.su" "mirror/ftp.xemacs.org/packages") ("sunet.se (Sweden)" "ftp.sunet.se" "pub/gnu/xemacs/packages") ("cnlab-switch.ch (Switzerland)" "sunsite.cnlab-switch.ch" "mirror/xemacs/packages") ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages") ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages") ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages") ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages") ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages") ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages") ("tsukuba.ac.jp (Japan)" "ftp.netlab.is.tsukuba.ac.jp" "pub/GNU/xemacs/packages") ("kreonet.re.kr (Korea)" "ftp.kreonet.re.kr" "pub/tools/emacs/xemacs/packages") ("nctu.edu.tw (Taiwan)" "coda.nctu.edu.tw" "Editors/xemacs/packages") ("sun.ac.za (South Africa)" "ftp.sun.ac.za" "xemacs/packages") ("isu.net.sa (Saudi Arabia)" "ftp.isu.net.sa" "pub/mirrors/ftp.xemacs.org/packages") ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages")) "*List of remote sites available for downloading packages.\nList format is '(site-description site-name directory-on-site).\nSITE-DESCRIPTION is a textual description of the site.  SITE-NAME\nis the internet address of the download site.  DIRECTORY-ON-SITE\nis the directory on the site in which packages may be found.\nThis variable is used to initialize `package-get-remote', the\nvariable actually used to specify package download sites." :tag "Package download sites" :type '(repeat (list (string :tag "Name") host-name directory)) :group 'package-get)
+(defcustom package-get-download-sites '(("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages") ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages") ("ca.xemacs.org (Canada)" "ftp.ca.xemacs.org" "pub/Mirror/xemacs/packages") ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages") ("us.xemacs.org (United States)" "ftp.us.xemacs.org" "pub/xemacs/packages") ("ibiblio.org (United States)" "ibiblio.org" "pub/packages/editors/xemacs/packages") ("stealth.net (United States)" "ftp.stealth.net" "pub/mirrors/ftp.xemacs.org/pub/xemacs/packages") ("br.xemacs.org (Brazil)" "ftp.br.xemacs.org" "pub/xemacs/packages") ("at.xemacs.org (Austria)" "ftp.at.xemacs.org" "editors/xemacs/packages") ("be.xemacs.org (Belgium)" "ftp.be.xemacs.org" "xemacs/packages") ("cz.xemacs.org (Czech Republic)" "ftp.cz.xemacs.org" "MIRRORS/ftp.xemacs.org/pub/xemacs/packages") ("dk.xemacs.org (Denmark)" "ftp.dk.xemacs.org" "pub/emacs/xemacs/packages") ("fi.xemacs.org (Finland)" "ftp.fi.xemacs.org" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages") ("fr.xemacs.org (France)" "ftp.fr.xemacs.org" "pub/xemacs/packages") ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages") ("de.xemacs.org (Germany)" "ftp.de.xemacs.org" "pub/ftp.xemacs.org/tux/xemacs/packages") ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages") ("ie.xemacs.org (Ireland)" "ftp.ie.xemacs.org" "mirrors/ftp.xemacs.org/pub/xemacs/packages") ("it.xemacs.org (Italy)" "ftp.it.xemacs.org" "unix/packages/XEMACS/packages") ("no.xemacs.org (Norway)" "ftp.no.xemacs.org" "pub/xemacs/packages") ("pl.xemacs.org (Poland)" "ftp.pl.xemacs.org" "pub/unix/editors/xemacs/packages") ("ru.xemacs.org (Russia)" "ftp.ru.xemacs.org" "pub/xemacs/packages") ("sk.xemacs.org (Slovakia)" "ftp.sk.xemacs.org" "pub/mirrors/xemacs/packages") ("se.xemacs.org (Sweden)" "ftp.se.xemacs.org" "pub/gnu/xemacs/packages") ("ch.xemacs.org (Switzerland)" "ftp.ch.xemacs.org" "mirror/xemacs/packages") ("uk.xemacs.org (United Kingdom)" "ftp.uk.xemacs.org" "sites/ftp.xemacs.org/pub/xemacs/packages") ("jp.xemacs.org (Japan)" "ftp.jp.xemacs.org" "pub/GNU/xemacs/packages") ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages") ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages") ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages") ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages") ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages") ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages") ("kr.xemacs.org (Korea)" "ftp.kr.xemacs.org" "pub/tools/emacs/xemacs/packages") ("za.xemacs.org (South Africa)" "ftp.za.xemacs.org" "mirrorsites/ftp.xemacs.org/packages") ("sa.xemacs.org (Saudi Arabia)" "ftp.sa.xemacs.org" "pub/mirrors/ftp.xemacs.org/xemacs/packages") ("au.xemacs.org (Australia)" "ftp.au.xemacs.org" "pub/xemacs/packages") ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages") ("nz.xemacs.org (New Zealand)" "ftp.nz.xemacs.org" "mirror/ftp.xemacs.org/packages")) "*List of remote sites available for downloading packages.\nList format is '(site-description site-name directory-on-site).\nSITE-DESCRIPTION is a textual description of the site.  SITE-NAME\nis the internet address of the download site.  DIRECTORY-ON-SITE\nis the directory on the site in which packages may be found.\nThis variable is used to initialize `package-get-remote', the\nvariable actually used to specify package download sites." :tag "Package download sites" :type '(repeat (list (string :tag "Name") host-name directory)) :group 'package-get)
 
 (autoload 'package-get-download-menu "package-get" "\
 Build the `Add Download Site' menu." nil nil)
@@ -1693,7 +1698,7 @@ they are not defaultly assigned to keys." t nil)
 
 ;;;***
 \f
-;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "lisp/rect.el")
+;;;### (autoloads (clear-rectangle replace-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "lisp/rect.el")
 
 (autoload 'delete-rectangle "rect" "\
 Delete the text in the region-rectangle without saving it.
@@ -1753,6 +1758,10 @@ Otherwise this command does not delete or overwrite any existing text.
 
 When called from a program, the rectangle's corners are START and END." t nil)
 
+(autoload 'replace-rectangle "rect" "\
+Like `string-rectangle', but unconditionally replace the original region,
+as if `pending-delete-mode' were active." t nil)
+
 (autoload 'clear-rectangle "rect" "\
 Blank out the region-rectangle.
 The text previously in the region is overwritten with blanks.
index f146c69..adbc4e1 100644 (file)
@@ -92,7 +92,7 @@ They will only be compiled open-coded when `byte-optimize' is true."
 ;                  ''byte-optimizer ''byte-compile-inline-expand))))
 
 (defun make-obsolete (fn new)
-  "Make the byte-compiler warn that FUNCTION is obsolete.
+  "Make the byte-compiler warn that function FN is obsolete.
 The warning will say that NEW should be used instead.
 If NEW is a string, that is the `use instead' message."
   (interactive "aMake function obsolete: \nxObsoletion replacement: ")
@@ -104,7 +104,7 @@ If NEW is a string, that is the `use instead' message."
   fn)
 
 (defun make-obsolete-variable (var new)
-  "Make the byte-compiler warn that VARIABLE is obsolete,
+  "Make the byte-compiler warn that variable VAR is obsolete,
 and NEW should be used instead.  If NEW is a string, then that is the
 `use instead' message."
   (interactive
@@ -119,7 +119,7 @@ and NEW should be used instead.  If NEW is a string, then that is the
 ;; By overwhelming demand, we separate out truly obsolete symbols from
 ;; those that are present for GNU Emacs compatibility.
 (defun make-compatible (fn new)
-  "Make the byte-compiler know that FUNCTION is provided for compatibility.
+  "Make the byte-compiler know that function FN is provided for compatibility.
 The warning will say that NEW should be used instead.
 If NEW is a string, that is the `use instead' message."
   (interactive "aMake function compatible: \nxCompatible replacement: ")
@@ -131,7 +131,7 @@ If NEW is a string, that is the `use instead' message."
   fn)
 
 (defun make-compatible-variable (var new)
-  "Make the byte-compiler know that VARIABLE is provided for compatibility.
+  "Make the byte-compiler know that variable VAR is provided for compatibility,
 and NEW should be used instead.  If NEW is a string, then that is the
 `use instead' message."
   (interactive
index 4c635f6..90a3c79 100644 (file)
 (custom-add-loads 'menu '("menubar-items"))
 (custom-add-loads 'minibuffer '("simple" "minibuf"))
 (custom-add-loads 'log-message '("simple"))
-(custom-add-loads 'environment '("frame" "keydefs" "minibuf" "modeline" "window-xemacs" "menubar" "gutter" "toolbar-items" "cus-edit" "gnuserv" "sound" "x-init"))
+(custom-add-loads 'environment '("frame" "keydefs" "minibuf" "modeline" "window-xemacs" "menubar" "gutter" "toolbar-items" "x-init" "cus-edit" "gnuserv" "sound"))
 (custom-add-loads 'sound '("sound"))
 (custom-add-loads 'pui '("package-ui"))
 (custom-add-loads 'terminals '("gnuserv"))
 (custom-add-loads 'auto-save '("files" "auto-save"))
 (custom-add-loads 'mail '("simple" "startup"))
+(custom-add-loads 'lpr '("printer"))
 (custom-add-loads 'custom-menu '("cus-edit"))
 (custom-add-loads 'docs '("hyper-apropos" "info"))
 (custom-add-loads 'tools '("etags" "hyper-apropos"))
 (custom-add-loads 'isearch '("isearch-mode"))
 (custom-add-loads 'font-lock-faces '("font-lock"))
 (custom-add-loads 'modeline '("modeline"))
-(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "dragdrop" "cus-edit"))
+(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "cus-edit" "dragdrop"))
 (custom-add-loads 'matching '("simple" "isearch-mode" "hyper-apropos"))
 (custom-add-loads 'i18n '("cus-edit"))
 (custom-add-loads 'info '("toolbar-items" "info"))
-(custom-add-loads 'x '("gtk-faces" "x-faces"))
+(custom-add-loads 'x '("x-faces" "gtk-faces"))
 (custom-add-loads 'buffers-tab '("gutter-items"))
 
 ;;; custom-load.el ends here
index 5d26ac1..9b12179 100644 (file)
      'general
      :parent parent
      :title "Search"
+     :autosize t
      :spec
      (setq search-dialog
           (make-glyph
            `[layout 
-             :orientation horizontal :justify left
-             ;; neither the following height/width nor the identical one
-             ;; below should be necessary! (see below)
-             :height 11 :width 40
+             :orientation horizontal 
+             :vertically-justify top 
+             :horizontally-justify center 
              :border [string :data "Search"]
              :items 
-             ([layout :orientation vertical :justify left
+             ([layout :orientation vertical 
+                      :justify top     ; implies left also
                       :items 
                       ([string :data "Search for:"]
                        [button :descriptor "Match Case"
                                :selected (not search-dialog-direction)
                                :callback (setq search-dialog-direction nil)]
                        )]
-              [layout :orientation vertical :justify left
-                      :items 
+              [layout :orientation vertical
+                      :vertically-justify top
+                      :horizontally-justify right
+                      :items
                       ([edit-field :width 15 :descriptor "" :active t
-                                   :face default :initial-focus t]
+                                   :initial-focus t]
                        [button :width 10 :descriptor "Find Next"
                                :callback-ex
                                (lambda (image-instance event)
                                  (isearch-dehighlight)
                                  (delete-frame 
                                   (event-channel event)))])])]))
-     ;; neither this height/width nor the identical one above should
-     ;; be necessary! (in fact, if you omit the one above, the layout
-     ;; sizes itself correctly; but the frame as a whole doesn't use
-     ;; the layout's size, as it should.)
-     :properties '(height 11 width 40))))
+     ;; These are no longer strictly necessary, but not setting a size
+     ;; at all yields a much more noticeable resize since the initial
+     ;; frame is so big.
+     :properties `(height ,(widget-logical-to-character-height 6)
+                         width ,(widget-logical-to-character-width 39))
+     )))
index 4b3f284..235d135 100644 (file)
@@ -195,6 +195,8 @@ The keywords allowed for `general' are
   The frame is made a child of this frame (defaults to the selected frame).
 :properties
   Additional properties of the frame, as well as `dialog-frame-plist'.
+:autosize
+  If t the frame is sized to exactly fit the widgets given by :spec.
 
 ---------------------------------------------------------------------------
 
@@ -547,7 +549,9 @@ The keywords allowed are
                                   'internal-make-dialog-box-exit did)
                                  (remove-hook 'delete-dialog-box-hook
                                               ',sym))))
-                      (add-hook 'delete-dialog-box-hook sym)
+                      (if (framep id)
+                          (add-hook 'delete-frame-hook sym)
+                        (add-hook 'delete-dialog-box-hook sym))
                       (mapc 'disable-frame frames)
                       (block nil
                         (while t
@@ -568,6 +572,7 @@ The keywords allowed are
             (:parent (selected-frame))
             :modal
             :properties
+            :autosize
             :spec)
            ()
          (flet ((create-dialog-box-frame ()
@@ -615,6 +620,7 @@ The keywords allowed are
                                            vertical-scrollbar-visible-p nil
                                            horizontal-scrollbar-visible-p nil
                                            unsplittable t
+                                           internal-border-width 8
                                            left ,(+ fleft (- (/ fwidth 2)
                                                              (/ (* dfwidth
                                                                    fontw)
@@ -625,6 +631,19 @@ The keywords allowed are
                                                               2)))))))
                     (set-face-foreground 'modeline [default foreground] frame)
                     (set-face-background 'modeline [default background] frame)
+                    ;; resize before mapping
+                    (when cl-autosize
+                      (set-frame-pixel-size 
+                       frame
+                       (image-instance-width 
+                        (glyph-image-instance cl-spec 
+                                              (frame-selected-window frame)))
+                       (image-instance-height 
+                        (glyph-image-instance cl-spec 
+                                              (frame-selected-window frame)))))
+                    ;; somehow, even though the resizing is supposed
+                    ;; to be while the frame is not visible, a
+                    ;; visible resize is perceptible
                     (unless unmapped (make-frame-visible frame))
                     (let ((newbuf (generate-new-buffer " *dialog box*")))
                       (set-buffer-dedicated-frame newbuf frame)
index 4d9562d..05d5011 100644 (file)
@@ -2707,6 +2707,7 @@ Revert only if they differ."
       (funcall revert-buffer-function ignore-auto noconfirm)
     (let* ((opoint (point))
           (newbuf nil)
+          (found nil)
           (delay-prompt nil)
           (auto-save-p (and (not ignore-auto)
                              (recent-auto-save-p)
@@ -2721,10 +2722,9 @@ Revert only if they differ."
             (error "Buffer does not seem to be associated with any file"))
            ((or noconfirm
                 (and (not (buffer-modified-p))
-                     (let (found)
-                       (dolist (rx revert-without-query found)
-                         (when (string-match rx file-name)
-                           (setq found t)))))
+                     (dolist (rx revert-without-query found)
+                       (when (string-match rx file-name)
+                         (setq found t))))
                 ;; If we will call revert-buffer-internal, delay prompting
                 (and (not auto-save-p)
                      (not (buffer-modified-p))
@@ -2738,7 +2738,7 @@ Revert only if they differ."
                        (and (setq newbuf (revert-buffer-internal
                                           file-name))
                             ;; ... and if different, prompt
-                            (or noconfirm
+                            (or noconfirm found
                                 (and delay-prompt
                                      (yes-or-no-p 
                                       (format "Revert buffer from file %s? "
index b1cb31d..5ee4072 100644 (file)
@@ -1323,12 +1323,18 @@ buffer modifications are performed or a buffer is reverted.")
 ;; was supposedly much faster than the FSF version because it was written in
 ;; C. However, the FSF version uses parse-partial-sexp, which is also
 ;; written in C, and the benchmarking I did showed the
-;; syntactically-sectionize code to be slower overall. So here's the FSF
-;; version, modified to support font-lock-doc-string-face.
+;; syntactically-sectionize code to be slower overall. So here's the
+;; FSF version, modified to support font-lock-doc-string-face.
 ;; -- mct 2000-12-29
+;; #### Andy conditionally reverted Matt's change when we were experimenting
+;; with making lookup-syntax-properties an optional feature.  I don't see how
+;; this code relates to lookup-syntax-properties, though.  I wonder if the
+;; bug is in our (?) version of parse-partial-sexp.  Andy says no.  Of course,
+;; Matt benchmarked ... WTF knows?  sjt 2002-09-28
 (defun font-lock-fontify-syntactically-region (start end &optional loudly)
   "Put proper face on each string and comment between START and END.
-START should be at the beginning of a line."
+START should be at the beginning of a line.  Optional argument LOUDLY
+is currently ignored."
   (if font-lock-keywords-only
       nil
 
@@ -1630,10 +1636,11 @@ LIMIT can be modified by the value of its PRE-MATCH-FORM."
 START should be at the beginning of a line."
   (let ((loudly (and font-lock-verbose
                     (>= (- end start) font-lock-message-threshold))))
+    (unless (eq (car-safe font-lock-keywords) t)
+      (setq font-lock-keywords
+           (font-lock-compile-keywords font-lock-keywords)))
     (let* ((case-fold-search font-lock-keywords-case-fold-search)
-          (keywords (cdr (if (eq (car-safe font-lock-keywords) t)
-                             font-lock-keywords
-                           (font-lock-compile-keywords))))
+          (keywords (cdr font-lock-keywords))
           (bufname (buffer-name)) 
           (progress 5) (old-progress 5)
           (iter 0)
@@ -1707,15 +1714,12 @@ START should be at the beginning of a line."
 \f
 ;; Various functions.
 
-(defun font-lock-compile-keywords (&optional keywords)
-  "Compile KEYWORDS into the form (t KEYWORD ...).
-Here KEYWORD is of the form (MATCHER HIGHLIGHT ...) as shown in the
-`font-lock-keywords' doc string."
-  (let ((keywords (or keywords font-lock-keywords)))
-    (setq font-lock-keywords 
-     (if (eq (car-safe keywords) t)
-        keywords
-       (cons t (mapcar 'font-lock-compile-keyword keywords))))))
+(defun font-lock-compile-keywords (keywords)
+  "Compile KEYWORDS (a list) and return the list of compiled keywords.
+Each keyword has the form (MATCHER HIGHLIGHT ...).  See `font-lock-keywords'."
+  (if (eq (car-safe keywords) t)
+      keywords
+    (cons t (mapcar 'font-lock-compile-keyword keywords))))
 
 (defun font-lock-compile-keyword (keyword)
   (cond ((nlistp keyword)              ; Just MATCHER
index 1f7c373..9feefa4 100644 (file)
@@ -416,8 +416,8 @@ side-by-side."
     (setq progress-glyph-height 16)
     (setq progress-layout-instantiator
          `[layout
-           :orientation horizontal
-           :margin-width 4
+           :orientation vertical :margin-width 4
+           :horizontally-justify left :vertically-justify center
            :items (,progress-gauge-instantiator
                    [button
                     :pixel-height (eval progress-glyph-height)
@@ -430,8 +430,8 @@ side-by-side."
     (setq progress-glyph-height 24)
     (setq progress-layout-instantiator
          `[layout 
-           :orientation vertical :justify left
-           :margin-width 4
+           :orientation vertical :margin-width 4
+           :horizontally-justify left :vertically-justify center
            :items (,progress-text-instantiator
                    [layout 
                     :orientation horizontal
@@ -448,7 +448,8 @@ side-by-side."
 
 (defun set-progress-abort-instantiator (&optional locale)
   (set-glyph-image progress-abort-glyph
-                  `[layout :orientation vertical :justify left
+                  `[layout :orientation vertical
+                           :horizontally-justify left :vertically-justify center
                            :items (,progress-text-instantiator
                                    [layout
                                     :margin-width 4
index c34c35d..b7296d0 100644 (file)
@@ -337,6 +337,7 @@ Keymap for characters following C-c.")
 (define-key global-map "\C-xr+" 'increment-register)
 (define-key global-map "\C-xrc" 'clear-rectangle)
 (define-key global-map "\C-xrk" 'kill-rectangle)
+(define-key global-map "\C-xrd" 'delete-rectangle)
 (define-key global-map "\C-xry" 'yank-rectangle)
 (define-key global-map "\C-xro" 'open-rectangle)
 (define-key global-map "\C-xrt" 'string-rectangle)
index 3f83e0a..4970f11 100644 (file)
@@ -106,6 +106,8 @@ setting NEWVAR and marks OLDVAR as provided for compatibility only."
 (make-obsolete 'set-window-dot 'set-window-point)
 
 (define-obsolete-function-alias 'extent-buffer 'extent-object)
+(define-compatible-variable-alias 'parse-sexp-lookup-properties
+  'lookup-syntax-properties)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; frames
 (defun frame-first-window (frame)
index 058e827..5ae5de3 100644 (file)
@@ -186,51 +186,60 @@ order until the package is found.  As a special case, `site-name' can be
     ;; North America
     ("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages")
     ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages")
+    ("ca.xemacs.org (Canada)" "ftp.ca.xemacs.org" "pub/Mirror/xemacs/packages")
     ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages")
-    ("ualberta.ca (Canada)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages")
-    ("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages")
-    ("unc.edu (United States)" "metalab.unc.edu" "pub/packages/editors/xemacs/packages")
-    ("utk.edu (United States)" "ftp.sunsite.utk.edu" "pub/xemacs/packages")
+    ("us.xemacs.org (United States)" "ftp.us.xemacs.org" "pub/xemacs/packages")
+    ("ibiblio.org (United States)" "ibiblio.org" "pub/packages/editors/xemacs/packages")
+    ("stealth.net (United States)" "ftp.stealth.net" "pub/mirrors/ftp.xemacs.org/pub/xemacs/packages")
+    ;("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages")
 
     ;; South America
-    ("unicamp.br (Brazil)" "ftp.unicamp.br" "pub/xemacs/packages")
+    ("br.xemacs.org (Brazil)" "ftp.br.xemacs.org" "pub/xemacs/packages")
 
     ;; Europe
-    ("tuwien.ac.at (Austria)" "gd.tuwien.ac.at" "editors/xemacs/packages")
-    ("auc.dk (Denmark)" "sunsite.auc.dk" "pub/emacs/xemacs/packages")
-    ("doc.ic.ac.uk (England)" "sunsite.doc.ic.ac.uk" "packages/xemacs/packages")
-    ("funet.fi (Finland)" "ftp.funet.fi" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages")
-    ("cenatls.cena.dgac.fr (France)" "ftp.cenatls.cena.dgac.fr" "Emacs/xemacs/packages")
+    ("at.xemacs.org (Austria)" "ftp.at.xemacs.org" "editors/xemacs/packages")
+    ("be.xemacs.org (Belgium)" "ftp.be.xemacs.org" "xemacs/packages")
+    ("cz.xemacs.org (Czech Republic)" "ftp.cz.xemacs.org" "MIRRORS/ftp.xemacs.org/pub/xemacs/packages")
+    ("dk.xemacs.org (Denmark)" "ftp.dk.xemacs.org" "pub/emacs/xemacs/packages")
+    ("fi.xemacs.org (Finland)" "ftp.fi.xemacs.org" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages")
+    ("fr.xemacs.org (France)" "ftp.fr.xemacs.org" "pub/xemacs/packages")
     ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages")
+    ("de.xemacs.org (Germany)" "ftp.de.xemacs.org" "pub/ftp.xemacs.org/tux/xemacs/packages")
     ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages")
-    ("kfki.hu (Hungary)" "ftp.kfki.hu" "pub/packages/xemacs/packages")
-    ("eunet.ie (Ireland)" "ftp.eunet.ie" "mirrors/ftp.xemacs.org/pub/xemacs/packages")
-    ("uniroma2.it (Italy)" "ftp.uniroma2.it" "unix/misc/dist/XEMACS/packages")
-    ("uio.no (Norway)" "sunsite.uio.no" "pub/xemacs/packages")
-    ("icm.edu.pl (Poland)" "ftp.icm.edu.pl" "pub/unix/editors/xemacs/packages")
-    ("srcc.msu.su (Russia)" "ftp.srcc.msu.su" "mirror/ftp.xemacs.org/packages")
-    ("sunet.se (Sweden)" "ftp.sunet.se" "pub/gnu/xemacs/packages")
-    ("cnlab-switch.ch (Switzerland)" "sunsite.cnlab-switch.ch" "mirror/xemacs/packages")
+    ;("hu.xemacs.org (Hungary)" "ftp.hu.xemacs.org" "pub/packages/xemacs/packages")
+    ("ie.xemacs.org (Ireland)" "ftp.ie.xemacs.org" "mirrors/ftp.xemacs.org/pub/xemacs/packages")
+    ("it.xemacs.org (Italy)" "ftp.it.xemacs.org" "unix/packages/XEMACS/packages")
+    ("no.xemacs.org (Norway)" "ftp.no.xemacs.org" "pub/xemacs/packages")
+    ("pl.xemacs.org (Poland)" "ftp.pl.xemacs.org" "pub/unix/editors/xemacs/packages")
+    ("ru.xemacs.org (Russia)" "ftp.ru.xemacs.org" "pub/xemacs/packages")
+    ("sk.xemacs.org (Slovakia)" "ftp.sk.xemacs.org" "pub/mirrors/xemacs/packages")
+    ("se.xemacs.org (Sweden)" "ftp.se.xemacs.org" "pub/gnu/xemacs/packages")
+    ("ch.xemacs.org (Switzerland)" "ftp.ch.xemacs.org" "mirror/xemacs/packages")
+    ("uk.xemacs.org (United Kingdom)" "ftp.uk.xemacs.org" "sites/ftp.xemacs.org/pub/xemacs/packages")
 
     ;; Asia
+    ("jp.xemacs.org (Japan)" "ftp.jp.xemacs.org" "pub/GNU/xemacs/packages")
     ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages")
     ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages")
     ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages")
     ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages")
     ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages")
     ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages")
-    ("tsukuba.ac.jp (Japan)" "ftp.netlab.is.tsukuba.ac.jp" "pub/GNU/xemacs/packages")
-    ("kreonet.re.kr (Korea)" "ftp.kreonet.re.kr" "pub/tools/emacs/xemacs/packages")
-    ("nctu.edu.tw (Taiwan)" "coda.nctu.edu.tw" "Editors/xemacs/packages")
+    ("kr.xemacs.org (Korea)" "ftp.kr.xemacs.org" "pub/tools/emacs/xemacs/packages")
+    ;("tw.xemacs.org (Taiwan)" "ftp.tw.xemacs.org" "Editors/xemacs/packages")
 
     ;; Africa
-    ("sun.ac.za (South Africa)" "ftp.sun.ac.za" "xemacs/packages")
+    ("za.xemacs.org (South Africa)" "ftp.za.xemacs.org" "mirrorsites/ftp.xemacs.org/packages")
 
     ;; Middle East
-    ("isu.net.sa (Saudi Arabia)" "ftp.isu.net.sa" "pub/mirrors/ftp.xemacs.org/packages")
+    ("sa.xemacs.org (Saudi Arabia)" "ftp.sa.xemacs.org" "pub/mirrors/ftp.xemacs.org/xemacs/packages")
 
     ;; Australia
+    ("au.xemacs.org (Australia)" "ftp.au.xemacs.org" "pub/xemacs/packages")
     ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages")
+
+    ;; Oceania
+    ("nz.xemacs.org (New Zealand)" "ftp.nz.xemacs.org" "mirror/ftp.xemacs.org/packages")
     )
   "*List of remote sites available for downloading packages.
 List format is '(site-description site-name directory-on-site).
index 865149d..ec595a1 100644 (file)
@@ -1,3 +1,7 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index 78e5c97..751384a 100644 (file)
@@ -1,3 +1,47 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-29  Stephen J. Turnbull  <steve@tleepslib.sk.tsukuba.ac.jp>
+
+       * lispref/compile.texi (Compilation Options): New node.
+       (Byte Compilation): Add it to menu.
+       (Compilation Functions): Minor mods.
+       (Docs and Compilation):
+       (Dynamic Loading):
+       Document some variable defaults.
+
+2002-10-23  Norbert Koch  <nk@viteno.net>
+
+       * xemacs-faq.texi (Q2.0.16): Fix typo in previous commit.
+
+2002-10-18  Stephen J. Turnbull  <steve@tleepslib.sk.tsukuba.ac.jp>
+
+       * xemacs-faq.texi (Q2.0.16): New FAQ on "no cygXpm-noX" fatal error.
+       (Q6.1.4): Document cygXpm-noX.
+
+2002-08-22  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * internals/internals.texi (Regression Testing XEmacs): Document
+       how to skip and warn about tests that depend on packages.
+
+2002-09-22  Ville Skyttä  <ville.skytta@xemacs.org>
+
+       * xemacs/packages.texi (Available Packages): Add fortran-modes,
+       perl-modes, psgml-dtds, python-modes and ruby-modes.
+       Some consistency tweaks.
+
+2002-09-20  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * internals/internals.texi (Techniques for XEmacs Developers):
+       More performance optimization hints.
+       (Modules for Other Aspects of the Lisp Interpreter and Object System):
+       Describe syntax code internals.
+
+       * lispref/syntax.texi (Syntax Basics): XEmacs "20" -> "20 and later".
+       (Syntax Class Table): Deprecate SPC as whitespace designator.
+       (Syntax Flags): Rewrite for `8-bit' comment syntax flags.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index 54a94a8..19563d4 100644 (file)
@@ -2961,7 +2961,14 @@ commands: @code{quantify-start-recording-data},
 
 If you want to make XEmacs faster, target your favorite slow benchmark,
 run a profiler like Quantify, @code{gprof}, or @code{tcov}, and figure
-out where the cycles are going.  Specific projects:
+out where the cycles are going.  In many cases you can localize the
+problem (because a particular new feature or even a single patch
+elicited it).  Don't hesitate to use brute force techniques like a
+global counter incremented at strategic places, especially in
+combination with other performance indications (@emph{e.g.}, degree of
+buffer fragmentation into extents).
+
+Specific projects:
 
 @itemize @bullet
 @item
@@ -2974,8 +2981,16 @@ developed module system.
 @item
 Speed up redisplay.
 @item
-Speed up syntax highlighting.  Maybe moving some of the syntax
-highlighting capabilities into C would make a difference.
+Speed up syntax highlighting.  It was suggested that ``maybe moving some
+of the syntax highlighting capabilities into C would make a
+difference.''  Wrong idea, I think.  When processing one large file a
+particular low-level routine was being called 40 @emph{million} times
+simply for @emph{one} call to @code{newline-and-indent}.  Syntax
+highlighting needs to be rewritten to use a reliable, fast parser, then
+to trust the pre-parsed structure, and only do re-highlighting locally
+to a text change.  Modern machines are fast enough to implement such
+parsers in Lisp; but no machine will ever be fast enough to deal with
+quadratic (or worse) algorithms!
 @item
 Implement tail recursion in Emacs Lisp (hard!).
 @end itemize
@@ -3222,6 +3237,48 @@ the running and collection of results from the @code{Assert},
 @code{Check-Error}, @code{Check-Error-Message}, and @code{Check-Message}
 macros.
 
+In general, you should avoid using functionality from packages in your
+tests, because you can't be sure that everyone will have the required
+package.  However, if you've got a test that works, by all means add it.
+Simply wrap the test in an appropriate test, add a notice that the test
+was skipped, and update the @code{skipped-test-reasons} hashtable.
+Here's an example from @file{syntax-tests.el}:
+
+@example
+;; Test forward-comment at buffer boundaries
+(with-temp-buffer
+
+  ;; try to use exactly what you need: featurep, boundp, fboundp
+  (if (not (fboundp 'c-mode))
+
+      ;; We should provide a standard function for this boilerplate,
+      ;; probably called `Skip-Test' -- check for that API with C-h f
+      (let* ((reason "c-mode unavailable")
+            (count (gethash reason skipped-test-reasons)))
+       (puthash reason (if (null count) 1 (1+ count))
+                skipped-test-reasons)
+       (Print-Skip "comment and parse-partial-sexp tests" reason))
+
+    ;; and here's the test code
+    (c-mode)
+    (insert "// comment\n")
+    (forward-comment -2)
+    (Assert (eq (point) (point-min)))
+    (let ((point (point)))
+      (insert "/* comment */")
+      (goto-char point)
+      (forward-comment 2)
+      (Assert (eq (point) (point-max)))
+      (parse-partial-sexp point (point-max)))))
+@end example
+
+@code{Skip-Test} is intended for use with features that are normally
+present in typical configurations.  For truly optional features, or
+tests that apply to one of several alternative implementations (eg, to
+GTK widgets, but not Athena, Motif, MS Windows, or Carbon), simply
+silently omit the test.
+
+
 @node A Summary of the Various XEmacs Modules, Allocation of Objects in XEmacs Lisp, Regression Testing XEmacs, Top
 @chapter A Summary of the Various XEmacs Modules
 @cindex modules, a summary of the various XEmacs
@@ -4359,6 +4416,27 @@ for example, to find the matching parenthesis in a command such as
 @code{forward-sexp}, and by @file{font-lock.c} to locate quoted strings,
 comments, etc.
 
+@c #### Break this out into a separate node somewhere!
+Syntax codes are implemented as bitfields in an int.  Bits 0-6 contain
+the syntax code itself, bit 7 is a special prefix flag used for Lisp,
+and bits 16-23 contain comment syntax flags.  From the Lisp programmer's
+point of view, there are 11 flags: 2 styles X 2 characters X @{start,
+end@} flags for two-character comment delimiters, 2 style flags for
+one-character comment delimiters, and the prefix flag.
+
+Internally, however, the characters used in multi-character delimiters
+will have non-comment-character syntax classes (@emph{e.g.}, the
+@samp{/} in C's @samp{/*} comment-start delimiter has ``punctuation''
+(here meaning ``operator-like'') class in C modes).  Thus in a mixed
+comment style, such as C++'s @samp{//} to end of line, is represented by
+giving @samp{/} the ``punctuation'' class and the ``style b first
+character of start sequence'' and ``style b second character of start
+sequence'' flags.  The fact that class is @emph{not} punctuation allows
+the syntax scanner to recognize that this is a multi-character
+delimiter.  The @samp{newline} character is given (single-character)
+``comment-end'' @emph{class} and the ``style b first character of end
+sequence'' @emph{flag}.  The ``comment-end'' class allows the scanner to
+determine that no second character is needed to terminate the comment.
 
 
 @example
index e6426ae..d3f3cbe 100644 (file)
@@ -41,6 +41,7 @@ byte compilation.
 @menu
 * Speed of Byte-Code::          An example of speedup from byte compilation.
 * Compilation Functions::       Byte compilation functions.
+* Compilation Options::         Controlling the byte compiler's behavior.
 * Docs and Compilation::        Dynamic loading of documentation strings.
 * Dynamic Loading::             Dynamic loading of individual functions.
 * Eval During Compile::        Code to be evaluated when you compile.
@@ -255,12 +256,18 @@ command line.
 
 @c XEmacs feature
 @defvar byte-recompile-directory-ignore-errors-p
-  If non-@code{nil}, this specifies that @code{byte-recompile-directory}
-will continue compiling even when an error occurs in a file.  This is
-normally @code{nil}, but is bound to @code{t} by
-@code{batch-byte-recompile-directory}.
+  When non-@code{nil}, @code{byte-recompile-directory} will continue
+compiling even when an error occurs in a file.  Default: @code{nil}, but
+bound to @code{t} by @code{batch-byte-recompile-directory}.
 @end defvar
 
+@c XEmacs feature (?)
+@defvar byte-recompile-directory-recursively
+   When non-@code{nil}, @code{byte-recompile-directory} will recurse on
+subdirectories.  Default: @code{t}.
+@end defvar
+
+
 @defun byte-code instructions constants stack-depth
 @cindex byte-code interpreter
 This function actually interprets byte-code.
@@ -275,6 +282,287 @@ of Emacs @code{byte-code} is only used to run isolated fragments of lisp
 code without an associated argument list.
 @end defun
 
+@node Compilation Options
+@section Options for the Byte Compiler
+@cindex compilation options
+
+Warning: this node is a quick draft based on docstrings.  There may be
+inaccuracies, as the docstrings occasionally disagree with each other.
+This has not been checked yet.
+
+The byte compiler and optimizer are controlled by the following
+variables.  The @code{byte-compiler-options} macro described below
+provides a convenient way to set most of them on a file-by-file basis.
+
+@defvar emacs-lisp-file-regexp
+Regexp which matches Emacs Lisp source files.
+You may want to redefine @code{byte-compile-dest-file} if you change
+this.  Default: @code{"\\.el$"}.
+@end defvar
+
+@defun byte-compile-dest-file filename
+Convert an Emacs Lisp source file name to a compiled file name.  This
+function may be redefined by the user, if necessary, for compatibility
+with @code{emacs-lisp-file-regexp}.
+@end defun
+
+@c ;; This can be the 'byte-compile property of any symbol.
+@c (autoload 'byte-compile-inline-expand "byte-optimize")
+
+@defvar byte-compile-verbose
+When non-@code{nil}, print messages describing progress of
+byte-compiler.  Default: @code{t} if interactive on a not-too-slow
+terminal (see @code{search-slow-speed}), otherwise @code{nil}.
+@end defvar
+
+@defvar byte-optimize
+Level of optimization in the byte compiler.
+
+@table @code
+@item nil
+Do no optimization.
+
+@item t
+Do all optimizations.
+
+@item source
+Do optimizations manipulating the source code only.
+
+@item byte
+Do optimizations manipulating the byte code (actually, LAP code) only.
+@end table
+Default: @code{t}.
+@end defvar
+
+@defvar byte-compile-delete-errors
+When non-@code{nil}, the optimizer may delete forms that may signal an
+error if that is the only change in the function's behavior.
+This includes variable references and calls to functions such as
+@code{car}.
+Default: @code{t}.
+@end defvar
+
+@defvar byte-optimize-log nil
+When non-@code{nil}, the byte-compiler logs optimizations into
+@file{*Compile-Log*}.
+
+@table @code
+@item nil
+Log no optimization.
+
+@item t
+Log all optimizations.
+
+@item source
+Log optimizations manipulating the source code only.
+
+@item byte
+Log optimizations manipulating the byte code (actually, LAP code) only.
+@end table
+Default: @code{nil}.
+@end defvar
+
+@defvar byte-compile-error-on-warn
+When non-@code{nil}, the byte-compiler reports warnings with @code{error}.
+Default:  @code{nil}.
+@end defvar
+
+@defvar byte-compile-default-warnings
+The warnings used when @code{byte-compile-warnings} is @code{t}.  Called
+@code{byte-compile-warning-types} in GNU Emacs.
+Default: @code{(redefine callargs subr-callargs free-vars unresolved
+unused-vars obsolete)}.
+@end defvar
+
+@defvar byte-compile-warnings
+
+List of warnings that the compiler should issue (@code{t} for the
+default set).  Elements of the list may be:
+
+@table @code
+@item free-vars
+References to variables not in the current lexical scope.
+
+@item unused-vars
+References to non-global variables bound but not referenced.
+
+@item unresolved
+Calls to unknown functions.
+
+@item callargs
+Lambda calls with args that don't match the definition.
+
+@item subr-callargs
+Calls to subrs with args that don't match the definition.
+
+@item redefine
+Function cell redefined from a macro to a lambda or vice
+versa, or redefined to take a different number of arguments.
+
+@item obsolete
+Use of an obsolete function or variable.
+
+@item pedantic
+Warn of use of compatible symbols.
+@end table
+
+The default set is specified by @code{byte-compile-default-warnings} and
+normally encompasses all possible warnings.
+
+See also the macro @code{byte-compiler-options}.  Default: @code{t}.
+@end defvar
+
+The compiler can generate a call graph, which gives information about
+which functions call which functions.
+
+@defvar byte-compile-generate-call-tree
+When non-@code{nil}, the compiler generates a call graph.  This records
+functions that were called and from where.  If the value is @code{t},
+compilation displays the call graph when it finishes.  If the value is
+neither @code{t} nor @code{nil}, compilation asks you whether to display
+the graph.
+
+The call tree only lists functions called, not macros used. Those
+functions which the byte-code interpreter knows about directly
+(@code{eq}, @code{cons}, etc.) are not reported.
+
+The call tree also lists those functions which are not known to be called
+(that is, to which no calls have been compiled).  Functions which can be
+invoked interactively are excluded from this list.  Default: @code{nil}.
+@end defvar
+
+@defvar byte-compile-call-tree nil
+
+Alist of functions and their call tree, used internally.
+Each element takes the form
+
+  (@var{function} @var{callers} @var{calls})
+
+where @var{callers} is a list of functions that call @var{function}, and
+@var{calls} is a list of functions for which calls were generated while
+compiling @var{function}.
+@end defvar
+
+@defvar byte-compile-call-tree-sort
+When non-@code{nil}, sort the call tree.  The values @code{name},
+@code{callers}, @code{calls}, and @code{calls+callers} specify different
+fields to sort on.")  Default: @code{name}.
+@end defvar
+
+@code{byte-compile-overwrite-file} controls treatment of existing
+compiled files.
+
+@defvar byte-compile-overwrite-file
+When non-@code{nil}, do not preserve backups of @file{.elc}s.
+Precisely, if @code{nil}, old @file{.elc} files are deleted before the
+new one is saved, and @file{.elc} files will have the same modes as the
+corresponding @file{.el} file.  Otherwise, existing @file{.elc} files
+will simply be overwritten, and the existing modes will not be changed.
+If this variable is @code{nil}, then an @file{.elc} file which is a
+symbolic link will be turned into a normal file, instead of the file
+which the link points to being overwritten.  Default: @code{t}.
+@end defvar
+
+Variables controlling recompiling directories are described elsewhere
+@xref{Compilation Functions}.  They are
+@code{byte-recompile-directory-ignore-errors-p} and
+@code{byte-recompile-directory-recursively}.
+
+The dynamic loading features are described elsewhere.  These are
+controlled by the variables @code{byte-compile-dynamic} (@pxref{Dynamic
+Loading}) and @code{byte-compile-dynamic-docstrings} (@pxref{Docs and
+Compilation}).
+
+The byte compiler is a relatively recent development, and has evolved
+significantly over the period covering Emacs versions 19 and 20.  The
+following variables control use of newer functionality by the byte
+compiler.  These are rarely needed since the release of XEmacs 21.
+
+Another set of compatibility issues arises between Mule and non-Mule
+XEmacsen; there are no known compatibility issues specific to the byte
+compiler.  There are also compatibility issues between XEmacs and GNU
+Emacs's versions of the byte compiler.  While almost all of the byte
+codes are the same, and code compiled by one version often runs
+perfectly well on the other, this is very dangerous, and can result in
+crashes or data loss.  Always recompile your Lisp when moving between
+XEmacs and GNU Emacs.
+
+@defvar byte-compile-single-version nil
+When non-@code{nil}, the choice of emacs version (v19 or v20) byte-codes
+will be hard-coded into bytecomp when it compiles itself.  If the
+compiler itself is compiled with optimization, this causes a speedup.
+Default: @code{nil}.
+@end defvar
+
+@defvar byte-compile-emacs19-compatibility
+When non-@code{nil} generate output that can run in Emacs 19.
+Default: @code{nil} when Emacs version is 20 or above, otherwise
+@code{t}.
+@end defvar
+
+@defvar byte-compile-print-gensym
+When non-@code{nil}, the compiler may generate code that creates unique
+symbols at run-time.  This is achieved by printing uninterned symbols
+using the @code{#:@var{}} notation, so that they will be read uninterned
+when run.
+
+With this feature, code that uses uninterned symbols in macros will
+not be runnable under pre-21.0 XEmacsen.
+
+Default: When @code{byte-compile-emacs19-compatibility} is non-nil, this
+variable is ignored and considered to be @code{nil}.  Otherwise
+@code{t}.
+@end defvar
+
+@defvar byte-compile-new-bytecodes
+This is completely ignored.  For backwards compatibility.
+@end defvar
+
+@defun byte-compiler-options &rest args
+Set some compilation-parameters for this file.  
+This will affect only the file in which it appears; this does nothing when
+evaluated, or when loaded from a @file{.el} file.
+
+Each argument to this macro must be a list of a key and a value.
+(#### Need to check whether the newer variables are settable here.)
+
+@example
+  Keys:                  Values:               Corresponding variable:
+
+  verbose        t, nil                byte-compile-verbose
+  optimize       t, nil, source, byte  byte-optimize
+  warnings       list of warnings      byte-compile-warnings
+  file-format    emacs19, emacs20      byte-compile-emacs19-compatibility
+@end example
+
+The value specified with the @code{warnings}option must be a list,
+containing some subset of the following flags:
+
+@example
+  free-vars    references to variables not in the current lexical scope.
+  unused-vars  references to non-global variables bound but not referenced.
+  unresolved   calls to unknown functions.
+  callargs     lambda calls with args that don't match the definition.
+  redefine     function cell redefined from a macro to a lambda or vice
+               versa, or redefined to take a different number of arguments.
+@end example
+
+If the first element if the list is @code{+} or `@code{} then the
+specified elements are added to or removed from the current set of
+warnings, instead of the entire set of warnings being overwritten.
+(#### Need to check whether the newer warnings are settable here.)
+
+For example, something like this might appear at the top of a source file:
+
+@example
+    (byte-compiler-options
+      (optimize t)
+      (warnings (- callargs))          ; Don't warn about arglist mismatch
+      (warnings (+ unused-vars))       ; Do warn about unused bindings
+      (file-format emacs19))
+@end example
+@end defun
+
 @node Docs and Compilation
 @section Documentation Strings and Compilation
 @cindex dynamic loading of documentation
@@ -327,6 +615,7 @@ file-local binding for the variable.  Here's one way to do that:
 @defvar byte-compile-dynamic-docstrings
 If this is non-@code{nil}, the byte compiler generates compiled files
 that are set up for dynamic loading of documentation strings.
+Default: t.
 @end defvar
 
 @cindex @samp{#@@@var{count}}
@@ -387,6 +676,7 @@ specific source files with file-local variable bindings, like this:
 @defvar byte-compile-dynamic
 If this is non-@code{nil}, the byte compiler generates compiled files
 that are set up for dynamic function loading.
+Default: nil.
 @end defvar
 
 @defun fetch-bytecode function
index 2b75bc0..67ed394 100644 (file)
@@ -42,7 +42,7 @@ list motion functions (@pxref{List Motion}) as well as the functions in
 this chapter.
 @end ifinfo
 
-  Under XEmacs 20, a syntax table is a particular subtype of the
+  Under XEmacs 20 and later, a syntax table is a particular subtype of the
 primitive char table type (@pxref{Char Tables}), and each element of the
 char table is an integer that encodes the syntax of the character in
 question, or a cons of such an integer and a matching character (for
@@ -133,11 +133,13 @@ comment-starter, second character of a comment-ender).
 their meanings, and examples of their use.
 
 @deffn {Syntax class} @w{whitespace character}
-@dfn{Whitespace characters} (designated with @w{@samp{@ }} or @samp{-})
+@dfn{Whitespace characters} (designated with @samp{-})
 separate symbols and words from each other.  Typically, whitespace
 characters have no other syntactic significance, and multiple whitespace
 characters are syntactically equivalent to a single one.  Space, tab,
-newline and formfeed are almost always classified as whitespace.
+newline and formfeed are almost always classified as whitespace.  (The
+designator @w{@samp{@ }} is accepted for backwards compatibility with
+older versions of XEmacs, but is deprecated.  It is invalid in GNU Emacs.)
 @end deffn
 
 @deffn {Syntax class} @w{word constituent}
@@ -268,99 +270,151 @@ designator for this syntax code is @samp{@@}.
 @subsection Syntax Flags
 @cindex syntax flags
 
+@c This is a bit inaccurate, the ``a'' and ``b'' flags actually don't
+@c exist in the internal implementation.  AFAICT it doesn't affect the
+@c semantics as perceived by the LISP programmer.
   In addition to the classes, entries for characters in a syntax table
-can include flags.  There are six possible flags, represented by the
-characters @samp{1}, @samp{2}, @samp{3}, @samp{4}, @samp{b} and
-@samp{p}.
-
-  All the flags except @samp{p} are used to describe multi-character
-comment delimiters.  The digit flags indicate that a character can
-@emph{also} be part of a comment sequence, in addition to the syntactic
-properties associated with its character class.  The flags are
+can include flags.  There are eleven possible flags, represented by the
+digits @samp{1}--@samp{8}, and the lowercase letters @samp{a}, @samp{b},
+and @samp{p}.
+
+  All the flags except @samp{p} are used to describe comment delimiters.
+The digit flags indicate that a character can @emph{also} be part of a
+multi-character comment sequence, in addition to the syntactic
+properties associated with its character class.  The flags must be
 independent of the class and each other for the sake of characters such
 as @samp{*} in C mode, which is a punctuation character, @emph{and} the
 second character of a start-of-comment sequence (@samp{/*}), @emph{and}
 the first character of an end-of-comment sequence (@samp{*/}).
 
+Emacs supports two comment styles simultaneously in any one syntax
+table.  This is for the sake of C++.  Each style of comment syntax has
+its own comment-start sequence and its own comment-end sequence.  Each
+comment must stick to one style or the other; thus, if it starts with
+the comment-start sequence of style ``b'', it must also end with the
+comment-end sequence of style ``b''.
+
+@c #### Compatibility note; index here.
+As an extension to GNU Emacs 19 and 20, XEmacs supports two arbitrary
+comment-start sequences and two arbitrary comment-end sequences.  (Thus
+the need for 8 flags.)  GNU Emacs restricts the comment-start sequences
+to start with the same character, XEmacs does not.  This means that for
+two-character sequences, where GNU Emacs uses the @samp{b} flag, XEmacs
+uses the digit flags @samp{5}--@samp{8}.
+
+A one character comment-end sequence applies to the ``b'' style if its
+first character has the @samp{b} flag set; otherwise, it applies to the
+``a'' style.  The @samp{a} flag is optional.  These flags have no effect
+on non-comment characters; two-character styles are determined by the
+digit flags.
+
 The flags for a character @var{c} are:
 
 @itemize @bullet
 @item
 @samp{1} means @var{c} is the start of a two-character comment-start
-sequence.
+sequence of style ``a''.
 
 @item
 @samp{2} means @var{c} is the second character of such a sequence.
 
 @item
 @samp{3} means @var{c} is the start of a two-character comment-end
-sequence.
+sequence of style ``a''.
 
 @item
 @samp{4} means @var{c} is the second character of such a sequence.
 
 @item
+@samp{5} means @var{c} is the start of a two-character comment-start
+sequence of style ``b''.
+
+@item
+@samp{6} means @var{c} is the second character of such a sequence.
+
+@item
+@samp{7} means @var{c} is the start of a two-character comment-end
+sequence of style ``b''.
+
+@item
+@samp{8} means @var{c} is the second character of such a sequence.
+
+@item
+@samp{a} means that @var{c} as a comment delimiter belongs to the
+default ``a'' comment style.  (This flag is optional.)
+
+@item
 @c Emacs 19 feature
 @samp{b} means that @var{c} as a comment delimiter belongs to the
-alternative ``b'' comment style.
+alternate ``b'' comment style.
 
-Emacs supports two comment styles simultaneously in any one syntax
-table.  This is for the sake of C++.  Each style of comment syntax has
-its own comment-start sequence and its own comment-end sequence.  Each
-comment must stick to one style or the other; thus, if it starts with
-the comment-start sequence of style ``b'', it must also end with the
-comment-end sequence of style ``b''.
+@item
+@c Emacs 19 feature
+@samp{p} identifies an additional ``prefix character'' for Lisp syntax.
+These characters are treated as whitespace when they appear between
+expressions.  When they appear within an expression, they are handled
+according to their usual syntax codes.
+
+The function @code{backward-prefix-chars} moves back over these
+characters, as well as over characters whose primary syntax class is
+prefix (@samp{'}).  @xref{Motion and Syntax}.
+@end itemize
+
+Lisp (as you would expect) has a simple comment syntax.
+
+@table @asis
+@item @samp{;}
+@samp{<}
+@item newline
+@samp{>}
+@end table
+
+Note that no flags are used.
+This defines two comment-delimiting sequences:
 
-The two comment-start sequences must begin with the same character; only
-the second character may differ.  Mark the second character of the
-``b''-style comment-start sequence with the @samp{b} flag.
+@table @asis
+@item @samp{;}
+This is a single-character comment-start sequence because the syntax
+class is @samp{<}.
 
-A comment-end sequence (one or two characters) applies to the ``b''
-style if its first character has the @samp{b} flag set; otherwise, it
-applies to the ``a'' style.
+@item newline
+This is a single character comment-end sequence because the syntax class
+is @samp{>} and the @samp{b} flag is not set.
+@end table
 
-The appropriate comment syntax settings for C++ are as follows:
+C++ (again, as you would expect) has a baroque, overrich, and
+excessively complex comment syntax.
 
 @table @asis
 @item @samp{/}
-@samp{124b}
+@samp{1456}
 @item @samp{*}
 @samp{23}
 @item newline
 @samp{>b}
 @end table
 
-This defines four comment-delimiting sequences:
+Note that the ``b'' style mixes one-character and two-character
+sequences.  The table above defines four comment-delimiting sequences:
 
 @table @asis
 @item @samp{/*}
-This is a comment-start sequence for ``a'' style because the
-second character, @samp{*}, does not have the @samp{b} flag.
+This is a comment-start sequence for ``a'' style because the @samp{1}
+flag is set on @samp{/} and the @samp{2} flag is set on @samp{*}.
 
 @item @samp{//}
-This is a comment-start sequence for ``b'' style because the second
-character, @samp{/}, does have the @samp{b} flag.
+This is a comment-start sequence for ``b'' style because both the @samp{5}
+and the @samp{6} flags are set on @samp{/}.
 
 @item @samp{*/}
-This is a comment-end sequence for ``a'' style because the first
-character, @samp{*}, does not have the @samp{b} flag
+This is a comment-end sequence for ``a'' style because the @samp{3}
+flag is set on @samp{*} and the @samp{4} flag is set on @samp{/}.
 
 @item newline
 This is a comment-end sequence for ``b'' style, because the newline
 character has the @samp{b} flag.
 @end table
 
-@item
-@c Emacs 19 feature
-@samp{p} identifies an additional ``prefix character'' for Lisp syntax.
-These characters are treated as whitespace when they appear between
-expressions.  When they appear within an expression, they are handled
-according to their usual syntax codes.
-
-The function @code{backward-prefix-chars} moves back over these
-characters, as well as over characters whose primary syntax class is
-prefix (@samp{'}).  @xref{Motion and Syntax}.
-@end itemize
 
 @node Syntax Table Functions
 @section Syntax Table Functions
index 5901e23..5fb21a0 100644 (file)
@@ -7,7 +7,7 @@
 @finalout
 @titlepage
 @title XEmacs FAQ
-@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2002/08/20 11:35:32 $
+@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2002/10/31 15:06:37 $
 @sp 1
 @author Tony Rossini <rossini@@biostat.washington.edu>
 @author Ben Wing <ben@@xemacs.org>
@@ -152,6 +152,7 @@ Installation and Trouble Shooting
 * Q2.0.13::     I don't need no steenkin' packages.  Do I? (NEW)
 * Q2.0.14::     How do I figure out which packages to install? (NEW)
 * Q2.0.15::     EFS fails with "500 AUTH not understood" (NEW)
+* Q2.0.16::     Cygwin XEmacs won't start: cygXpm-noX4.dll was not found (NEW)
 
 Trouble Shooting:
 * Q2.1.1::      XEmacs just crashed on me!
@@ -1275,6 +1276,7 @@ Installation:
 * Q2.0.13::     I don't need no steenkin' packages.  Do I? (NEW)
 * Q2.0.14::     I don't want to install a million .els one at a time! (NEW)
 * Q2.0.15::     EFS fails with "500 AUTH not understood" (NEW)
+* Q2.0.16::     Cygwin XEmacs won't start: cygXpm-noX4.dll was not found (NEW)
 
 Trouble Shooting:
 * Q2.1.1::      XEmacs just crashed on me!
@@ -1674,7 +1676,7 @@ As the Sumo tarballs are not regenerated as often as the individual
 packages, it is recommended that you use the automatic package tools
 afterwards to pick up any recent updates.
 
-@node Q2.0.15, Q2.1.1, Q2.0.14, Installation
+@node Q2.0.15, Q2.0.16, Q2.0.14, Installation
 @unnumberedsubsec Q2.0.15: EFS fails with "500 AUTH not understood" (NEW)
 
 A typical error: FTP Error: USER request failed; 500 AUTH not understood.
@@ -1689,7 +1691,25 @@ and notes that you need to add an element (often "-u") to
 `efs-ftp-program-args'.  Use M-x customize-variable, and verify the
 needed flag with `man ftp' or other local documentation.
 
-@node Q2.1.1, Q2.1.2, Q2.0.15, Installation
+@node Q2.0.16, Q2.1.1, Q2.0.15, Installation
+@unnumberedsubsec Q2.0.16: Cygwin XEmacs won't start: cygXpm-noX4.dll was not found (NEW)
+
+The Cygwin binary distributed with the netinstaller uses an external DLL
+to handle XPM images (such as toolbar buttons).  You may get an error like
+
+    This application has failed to start because cygXpm-noX4.dll was not found.
+    Re-installing the application may fix this problem.
+
+Andy Piper <andy@@xemacs.org> sez:
+
+    cygXpm-noX4 is part of the cygwin distribution under libraries or
+    graphics, but is not installed by default. You need to run the
+    cygwin setup again and select this package.
+
+Ie, reinstalling XEmacs won't help because it is not part of the XEmacs
+distribution.
+
+@node Q2.1.1, Q2.1.2, Q2.0.16, Installation
 @unnumberedsec 2.1: Trouble Shooting
 @unnumberedsubsec Q2.1.1: Help!  XEmacs just crashed on me!
 
@@ -6241,6 +6261,11 @@ TIFF, etc.
 If you want to compile under X, you will also need the X libraries; see
 @ref{Q6.1.6}.
 
+If you want to compile without X, you will need the @file{xpm-nox}
+library, which must be specifically selected in the Cygwin netinstaller;
+it is not selected by default.  The package has had various names.
+Currently it is called @file{cygXpm-noX4.dll}.
+
 
 @node Q6.1.4, Q6.1.5, Q6.1.3, MS Windows
 @unnumberedsubsec Q6.1.4: How do I compile under Cygwin?
@@ -6280,6 +6305,9 @@ versions.  So:
 /usr/lib/libXpm.dll.a -> /usr/lib/libXpm-noX.dll.a
 @end example
 
+(This advice may now be obsolete because of the availability of the
+cygXpm-noX4.dll package from Cygwin.  Send confirmation to
+@email{faq@@xemacs.org}.)
 
 @item
 Other problems are listed in the @file{PROBLEMS} file, in the top-level
index 6a9cba0..53db29e 100644 (file)
@@ -274,7 +274,7 @@ The package has been marked for installation/update.
 @end table
 
 If there is no character in the first column, the package has been
-installed and is up-to-date.
+installed and is up to date.
 
 From here, you can select or unselect packages for installation using
 the @key{RET} key, the @kbd{Mouse-2} button or selecting "Select" from
@@ -664,7 +664,7 @@ xemacs.org and it's mirrors.  If a particular package that you are
 looking for isn't here, please send a message to the
 @email{xemacs-beta@@xemacs.org, XEmacs Beta list}.
 
-This data is up-to-date as of August 8, 2002.
+This data is up to date as of September 22, 2002.
 
 @subsection Normal Packages
 A very broad selection of elisp packages.
@@ -769,11 +769,14 @@ Footnoting in mail message editing modes.
 @item forms
 Forms editing support (obsolete, use the built-in Widget instead).
 
+@item fortran-modes
+Fortran language support.
+
 @item frame-icon
 Provide a WM icon based on major mode.
 
 @item fsf-compat
-FSF Emacs compatibility files.
+GNU Emacs compatibility files.
 
 @item games
 Tetris, Sokoban, and Snake.
@@ -785,7 +788,7 @@ XEmacs bug reports.
 The Gnus Newsreader and Mailreader.
 
 @item haskell-mode
-Haskell editing support.
+Haskell language support.
 
 @item hm--html-menus
 HTML editing.
@@ -841,7 +844,7 @@ Miscellaneous single-file O/S utilities, for printing, archiving,
 compression, remote shells, etc.
 
 @item ocaml
-Objective Caml editing support.
+Objective Caml language support.
 
 @item pc
 PC style interface emulation.
@@ -852,6 +855,9 @@ CVS frontend.
 @item pcomplete
 Provides programmatic completion.
 
+@item perl-modes
+Perl language support.
+
 @item prog-modes
 Miscellaneous single-file lisp files for various programming languages.
 
@@ -861,12 +867,23 @@ Print buffers to PostScript printers.
 @item psgml
 Validated HTML/SGML editing.
 
+@item psgml-dtds
+A collection of DTDs for psgml.  Note that this package is deprecated
+and will be removed in the future, most likely Q2/2003.  Instead of using
+this, you should install needed DTDs yourself.
+
+@item python-modes
+Python language support.
+
 @item reftex
 Emacs support for LaTeX cross-references, citations.
 
 @item rmail
 An obsolete Emacs mailer.  If you do not already use it don't start.
 
+@item ruby-modes
+Ruby language support.
+
 @item sasl
 Simple Authentication and Security Layer (SASL) library.
 
index d64634e..b6f3c50 100644 (file)
@@ -1,3 +1,7 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
 
        * all: port from cygwin setup.
 
-%%% $Id: ChangeLog,v 1.2.2.16 2002/08/20 11:36:02 stephent Exp $
-$Revision: 1.2.2.16 $
+%%% $Id: ChangeLog,v 1.2.2.17 2002/08/23 16:44:34 stephent Exp $
+$Revision: 1.2.2.17 $
 
index 3b81c6f..dbf035a 100644 (file)
@@ -1,3 +1,18 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-13  Adrian Aichner  <adrian@xemacs.org>
+
+       * xemacs.mak (OS): Remove obsolete quoting of double-quote in the
+       Installation file to avoid unnecessary deviations from the UNIX
+       version in `describe-installation' and `build-report'.
+
+2002-10-08  Andy Piper  <andy@xemacs.org>
+
+       * xemacs.mak: set the stacksize to 8mb which seems to be the magic
+       number for regex.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index db8534b..d0aff62 100644 (file)
@@ -1385,8 +1385,10 @@ $(PROGNAME) : $(TEMACS) $(TEMACS_DIR)\NEEDTODUMP
 <<
 # Make the resource section read/write since almost all of it is the dump
 # data which needs to be writable.  This avoids having to copy it.
-       editbin -nologo -section:.rsrc,rw xemacs.exe
+       editbin -nologo -stack:0x800000 -section:.rsrc,rw xemacs.exe
        $(DEL) $(TEMACS_DIR)\xemacs.dmp
+!else
+       editbin -nologo -stack:0x800000 xemacs.exe
 !endif
        cd $(NT)
        @if not exist $(TEMACS_DIR)\SATISFIED nmake -nologo -f xemacs.mak $@
@@ -1497,14 +1499,14 @@ installation::
 OS: $(OS)
 !endif
 
-XEmacs $(XEMACS_VERSION_STRING) $(xemacs_codename:"=\") configured for `$(EMACS_CONFIGURATION)'.
+XEmacs $(XEMACS_VERSION_STRING) $(xemacs_codename) configured for `$(EMACS_CONFIGURATION)'.
 
-  Building XEmacs in \"$(MAKEDIR:\=\\)\".
+  Building XEmacs in "$(MAKEDIR:\=\\)".
 !if defined(CCV)
-  Using compiler \"$(CC) $(CFLAGS)\".
+  Using compiler "$(CC) $(CFLAGS)".
 !endif
-  Installing XEmacs in \"$(INSTALL_DIR:\=\\)\".
-  Package path is $(PATH_PACKAGEPATH:"=\").
+  Installing XEmacs in "$(INSTALL_DIR:\=\\)".
+  Package path is $(PATH_PACKAGEPATH).
 !if $(INFODOCK)
   Building InfoDock.
 !endif
index a9a6e65..f53dd09 100644 (file)
@@ -1,3 +1,252 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-17  Raymond Toy  <toy@rtp.ericsson.se>
+
+       * nas.c: Update for NAS 1.6 and later, from Jon Trulson.  Was
+       using the NAS private array SoundFileInfo that no longer exists in
+       NAS 1.6 and later.  Preserve backward compatibility with NAS 1.5a
+       and earlier.  This is broken for some versions between 1.5a and
+       1.5f.
+
+2002-10-10  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * realpath.c (win32_readlink): Try to fix truename of wildcard bug.
+
+       * emacs.c (shut_down_emacs): Improve crash message.
+
+2002-10-09  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * file-coding.c (determine_real_coding_system): Check for coding
+       cookie in first LINES_TO_CHECK lines (currently 2).  Cater to
+       shebangs and Python PEP 263.
+
+2002-10-08  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-widget.c (layout_query_geometry): only resize dynamically
+       if static sizes haven't been set.
+
+2002-08-30  Mike Alexander  <mta@arbortext.com>
+
+       * event-msw.c (winsock_closer): Use closesocket, not CloseHandle
+       to close a socket.
+
+2002-10-03  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * callproc.c (child_setup): 21.4 doesn't have retry_close.
+
+2002-09-20  Mike Sperber <mike@xemacs.org>
+
+       (This partially gets back my patch from 2002-07-20 without the
+       bug.)
+       * callproc.c (child_setup): Remove Ben's comment noting confusion
+       over the file descriptors >= 3: close_process_descs() doesn't
+       close those.  Fix fd range to go up to MAXDESC-1 instead of 64.
+       * process-unix.c (unix_create_process): Call
+       begin_dont_check_for_quit to inhibit unwanted interaction (and
+       thus breaking of X event synchronicity) in the child.
+
+2002-09-26  Golubev I. N.  <gin@mo.msk.ru>
+
+       * frame-x.c (x_delete_frame): do not call XtDisplay on a destroyed
+       widget.
+
+2002-08-20  Ben Sigelman  <bhsigelm@cs.brown.edu>
+
+       * event-Xt.c (drain_X_queue): loop over while(XEventsQueued())
+       instead of while(XtAppPending()&XtIMXEvent).  Upon a gdm logout,
+       the xemacs process did not exit, but looped infinitely here.  This
+       fixes that problem.
+
+2002-09-28  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * font-lock.c (SYNTAX_START_STYLE, SYNTAX_END_STYLE): Quiet GCC.
+       (find_context): Improve comments.
+
+       * regex.c (re_compile_fastmap):  Gratuitous #ifdef comment fixes.
+       (re_match_2): An XCHAR_TABLE operation was missing.
+
+       Many of the following changes were inspired by Andy Piper's (now
+       obsolete) patch to make syntax-table text property lookup optional.
+
+       [Documentation]
+
+       * syntax.h (top level): Document semantics of syntax flags.
+       * syntax.c (comstr_start, Fforward_comment): Improve comments.
+       * syntax.c, syntax.h (top level): Document syntax cache better in
+       comments.
+
+       [Instrument syntax caching (temporary change)]
+
+       * syntax.h (enum syntax_cache_statistics_functions, struct
+       syntax_cache_statistics, SCS_STATISTICS_SET_FUNCTION,
+       SYNTAX_CACHE_STATISTICS_COUNT_INIT): New types and macros.
+       * syntax.c (scan_words, Fforward_comment, scan_lists,
+       Fbackward_prefix_characters):
+       * font-lock.c (find_context):
+       Use them to instrument syntax caching. 
+       * syntax.c (struct syntax_cache_statistics, scs_statistics,
+       syntax_cache_statistics_function_names): New type and variables.
+       * syntax.c (update_syntax_cache): Update and report statistics.
+
+       [Major syntax cache optimizations]
+
+       syntax.c (lookup_syntax_properties): Default off.
+
+       * syntax.h (UPDATE_SYNTAX_INTERNAL): New, implements UPDATE_SYNTAX*.
+       * syntax.c (update_syntax_cache):
+       Move init test from update_syntax_cache to UPDATE_SYNTAX_INTERNAL.
+
+       [Minor syntax cache optimizations and code clarifications]
+
+       * syntax.h (SYNTAX_COMMENT_BITS, SYNTAX_START_P, SYNTAX_END_P,
+       SYNTAX_STYLES_MATCH_START_P, SYNTAX_STYLES_MATCH_1CHAR_P,
+       SYNTAX_STYLES_MATCH_END_P, STYLE_FOUND_1CHAR_P, STYLE_FOUND_P,
+       SYNTAX_COMMENT_MASK_END, SYNTAX_COMMENT_MASK_START,
+       SYNTAX_COMMENT_1CHAR_MASK): Remove redundant argument `table'.
+       (Code clarification.)
+
+       * syntax.c (scan_words, find_end_of_comment, scan_sexps_forward,
+       scan_lists): Compute code from syncode, use Boolean macros instead
+       of redundant masking operations.  (Code clarification; any decent
+       compiler can do this optimization.)
+
+       * syntax.c (scan_lists): Rearrange switches (case Sstring_fence)
+       for clarity.
+
+       * syntax.h, syntax.c (NEXT_SINGLE_PROPERTY_CHANGE,
+       PREVIOUS_SINGLE_PROPERTY_CHANGE, update_syntax_cache): Conditionally
+       use F*_single_property_change instead of F*_extent_change.
+       Currently F*_single_property_change is _much_ less efficient.
+
+       * dired.c (Fdirectory_files): Qt not valid in syntax_cache.object.
+       * syntax.h (SETUP_SYNTAX_CACHE_FOR_OBJECT):  Initialize
+       syntax_cache.object properly, don't leave Qt or Qnil.
+       (SYNTAX_CACHE_BYTE_TO_CHAR): Use SETUP_SYNTAX_CACHE_FOR_OBJECT.
+       * syntax.c (update_syntax_cache): Use BUFFERP and STRINGP, not
+       tests for Qt or Qnil.
+
+2002-09-21  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * redisplay.c (point_in_line_start_cache): 
+       * extents.c (print_extent_1):
+       Fix warnings.
+
+       * extents.c (Fset_extent_property): Document `syntax-table' property.
+
+       * extents.h (Fnext_single_property_change): EXFUN it.
+
+2002-09-09  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * search.c (clear_unused_search_regs): New static function.
+       (search_buffer): 
+       (simple_search): 
+       (boyer_moore):
+       Use it.  Fixes "stale match data" bug reported by Martin Stjernholm.
+       Minor clarifications in comments.
+
+       * regex.c (re_match_2_internal): Ensure no stale submatches.
+
+2002-09-09  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * event-Xt.c (enqueue_focus_event): Add missing prototype.
+
+2002-08-29  Jerry James  <james@xemacs.org>
+
+       * lisp.h: structrures -> structures.
+
+2002-06-03  Andy Piper  <andy@xemacs.org>
+
+       * frame.c (frame_conversion_internal): add conversion appropriate
+       for setting frame dimensions in pixels.
+
+       * console.h (struct console_methods): add device-specific widget
+       layout functions.
+
+       * emacs.c (main_1): initialize glyph vars.
+
+       * event-Xt.c (handle_focus_event_1): call handle_focus_event_2
+       (handle_focus_event_2): new function. Allow focus to
+       be set to a particular window and widget.
+       (enqueue_focus_event): new function. Create a
+       synthetic focus event.
+       (emacs_Xt_handle_magic_event): call
+       handle_focus_event_2.
+
+       * frame.c (Fset_frame_pixel_height): new function. Allow
+       pixel-based sizing. Does the right thing on character-oriented
+       displays.
+       (Fset_frame_pixel_width): ditto.
+       (Fset_frame_pixel_size): ditto.
+       (syms_of_frame): declare.
+
+       * general-slots.h: add :vertically-justify and
+       :horizontally-justify.
+
+       * glyphs-msw.c (xbm_create_bitmap_from_data): warning fix.
+       (mswindows_widget_border_width): new function.
+       (mswindows_combo_box_instantiate): set border widths.
+       (console_type_create_glyphs_mswindows): declare.
+
+       * glyphs-widget.c:
+       (check_valid_justification): allow vertical and horizontal
+       justification.
+       (widget_border_width): new function. Call device methods.
+       (widget_instance_border_width): ditto.
+       (logical_unit_height): new function. Determine the height of a
+       logical-unit. Logical units are intended to provide grid-like
+       layout for subcontrols in a layout. If the layout is
+       :vertically-justify top then subcontrols will be positioned on
+       logical-unit boundaries, thus allowing adjacent subcontrols to
+       line up.
+       (widget_logical_unit_height): ditto for widgets.
+       (redisplay_widget): misc cleanup.
+       (widget_spacing): new function. Call device specific
+       methods. Intended to be the default gap between adjacent widgets.
+       (widget_query_geometry): use new spacing functions to determine
+       appropriate geometry.
+       (initialize_widget_image_instance): initialize horizontal and
+       vertical justification.
+       (widget_instantiate): use logica-units where appropriate for
+       sizing large widgets.
+       (button_query_geometry): use widget_instance_border_width.
+       (tree_view_query_geometry): ditto.
+       (tab_control_query_geometry): ditto.
+       (edit_field_query_geometry): new function.
+       (layout_update): pick up :justify, :horizontally-justify and
+       :vertically-justify none of which worked previously. :justify is
+       used as a fallback for both horizontal and vertical justification.
+       (layout_query_geometry): use logical units to size appropriately.
+       (layout_layout): ditto.
+       (Fwidget_logical_to_character_width): new function. Allow users to
+       convert from logical units to characters so that frame sizes can
+       be set appropriately.
+       (Fwidget_logical_to_character_height): ditto.
+       (syms_of_glyphs_widget): declare.
+       (image_instantiator_edit_fields): add edit_field_query_geometry.
+       (VALID_LAYOUT_KEYWORDS): declare :vertically-justify and
+       :horizontally-justify.
+       (specifier_vars_of_glyphs_widget): new function. Declare
+       Vwidget_border_width which is not yet used.
+
+       * glyphs-x.c (x_map_subwindow): enqueue appropriate focus events.
+       (x_widget_border_width): new function.
+       (x_widget_instantiate): create a sensible name for widgets.
+       (console_type_create_glyphs_x): declare x_widget_border_width.
+
+       * glyphs.h (DEFAULT_WIDGET_BORDER_WIDTH): new macro.
+       (struct Lisp_Image_Instance): add :vertically-justify and
+       :horizontally-justify.
+       (LAYOUT_JUSTIFY_TOP): new.
+       (IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY): new.
+       (ROUND_UP): new macro. Round argument up to next integral
+       interval.
+
+       * redisplay-output.c (redisplay_output_layout): misc formatting.
+
+       * symsinit.h: declare specifier_vars_of_glyphs_widget.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index ff28a49..9b39b48 100644 (file)
@@ -772,13 +772,14 @@ child_setup (int in, int out, int err, char **new_argv,
   close (out);
   close (err);
 
-  /* I can't think of any reason why child processes need any more
-     than the standard 3 file descriptors.  It would be cleaner to
+  /* Close non-process-related file descriptors. It would be cleaner to
      close just the ones that need to be, but the following brute
      force approach is certainly effective, and not too slow. */
+
   {
     int fd;
-    for (fd=3; fd<=64; fd++)
+
+    for (fd = 3; fd < MAXDESC; fd++)
       close (fd);
   }
 #endif /* not WIN32_NATIVE */
index 6342ddc..9d9d65c 100644 (file)
@@ -261,6 +261,11 @@ struct console_methods
   void (*resize_subwindow_method) (Lisp_Image_Instance *, int w, int h);
   void (*redisplay_subwindow_method) (Lisp_Image_Instance *);
   void (*redisplay_widget_method) (Lisp_Image_Instance *);
+  /* Maybe this should be a specifier. Unfortunately specifiers don't
+     allow us to represent things at the toolkit level, which is what
+     is required here. */
+  int (*widget_border_width_method) (void);
+  int (*widget_spacing_method) (Lisp_Image_Instance *);
   int (*image_instance_equal_method) (Lisp_Image_Instance *,
                                      Lisp_Image_Instance *,
                                      int depth);
index e07049b..e0639f9 100644 (file)
@@ -124,7 +124,8 @@ If FILES-ONLY is the symbol t, then only the "files" in the directory
   if (!d)
     report_file_error ("Opening directory", list1 (directory));
 
-  regex_match_object = Qt;
+  /* #### In Matt's code, this was Qt.  Why? */
+  regex_match_object = Qnil;
   regex_emacs_buffer = current_buffer;
 
   record_unwind_protect (close_directory_unwind, make_opaque_ptr ((void *)d));
index d1922a9..6d04500 100644 (file)
@@ -1956,6 +1956,7 @@ main_1 (int argc, char **argv, char **envp, int restart)
         */
 
       specifier_vars_of_glyphs ();
+      specifier_vars_of_glyphs_widget ();
       specifier_vars_of_gutter ();
 #ifdef HAVE_MENUBARS
       specifier_vars_of_menubar ();
@@ -2948,28 +2949,26 @@ shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
        ("Your files have been auto-saved.\n"
         "Use `M-x recover-session' to recover them.\n"
         "\n"
-         "If you have access to the PROBLEMS file that came with your\n"
-         "version of XEmacs, please check to see if your crash is described\n"
-         "there, as there may be a workaround available.\n"
+         "Your version of XEmacs was distributed with a PROBLEMS file that  may describe\n"
+        "your crash, and with luck a workaround.  Please check it first, but do report\n"
+        "the crash anyway.  "
 #ifdef INFODOCK
-        "Otherwise, please report this bug by selecting `Report-Bug'\n"
-         "in the InfoDock menu.\n"
+        "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
+        "*BE SURE* to include the XEmacs configuration from M-x describe-installation,\n"
+        "or the file Installation in the top directory of the build tree.\n"
 #else
-        "Otherwise, please report this bug by running the send-pr\n"
-         "script included with XEmacs, or selecting `Send Bug Report'\n"
-         "from the help menu.\n"
-        "As a last resort send ordinary email to `crashes@xemacs.org'.\n"
+        "Please report this bug by invoking M-x report-emacs-bug,\n"
+        "or by selecting `Send Bug Report' from the Help menu.  If necessary, send\n"
+        "ordinary email to `crashes@xemacs.org'.  *MAKE SURE* to include the XEmacs\n"
+        "configuration from M-x describe-installation, or equivalently the file\n"
+        "Installation in the top of the build tree.\n"
 #endif
-        "*MAKE SURE* to include the information in the command\n"
-        "M-x describe-installation.\n"
 #ifndef _MSC_VER
         "\n"
-        "If at all possible, *please* try to obtain a C stack backtrace;\n"
-        "it will help us immensely in determining what went wrong.\n"
-        "To do this, locate the core file that was produced as a result\n"
-        "of this crash (it's usually called `core' and is located in the\n"
-        "directory in which you started the editor, or maybe in your home\n"
-        "directory), and type\n"
+        "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
+        "to be able to analyze the problem.  Locate the core file produced as a result\n"
+        "of this crash (often called `core' or `core.<process-id>', and located in\n"
+        "the directory in which you started XEmacs or your home directory), and type\n"
         "\n"
         "  gdb "
 #endif
@@ -2996,11 +2995,12 @@ shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
          stderr_out ("%s%s", dir, name);
       }
       stderr_out
-       (" core\n\n"
-        "then type `where' when the debugger prompt comes up.\n"
-        "(If you don't have GDB on your system, you might have DBX,\n"
-        "or XDB, or SDB.  A similar procedure should work for all of\n"
-        "these.  Ask your system administrator if you need more help.)\n");
+       (" core\n"
+        "\n"
+        "then type `where' at the debugger prompt.  No GDB on your system?  You may\n"
+        "have DBX, or XDB, or SDB.  (Ask your system administrator if you need help.)\n"
+        "If no core file was produced, enable them (often with `ulimit -c unlimited'\n"
+        "in case of future recurrance of the crash.\n");
 #endif /* _MSC_VER */
     }
 
index 4345bb1..eb7fd74 100644 (file)
@@ -67,7 +67,9 @@ Boston, MA 02111-1307, USA.  */
 
 #include "events-mod.h"
 
+void enqueue_focus_event (Widget wants_it, Lisp_Object frame, int in_p);
 static void handle_focus_event_1 (struct frame *f, int in_p);
+static void handle_focus_event_2 (Window w, struct frame *f, int in_p);
 
 static struct event_stream *Xt_event_stream;
 
@@ -1538,6 +1540,16 @@ x_event_to_emacs_event (XEvent *x_event, Lisp_Event *emacs_event)
 static void
 handle_focus_event_1 (struct frame *f, int in_p)
 {
+  handle_focus_event_2 (XtWindow (FRAME_X_TEXT_WIDGET (f)), f, in_p);
+}
+
+static void
+handle_focus_event_2 (Window win, struct frame *f, int in_p)
+{
+  /* Although this treats focus differently for all widgets (including
+     the frame) it seems to work ok. */
+  Widget needs_it = XtWindowToWidget (FRAME_X_DISPLAY (f), win);
+
 #if XtSpecificationRelease > 5
   widget_with_focus = XtGetKeyboardFocusWidget (FRAME_X_TEXT_WIDGET (f));
 #endif
@@ -1568,14 +1580,19 @@ handle_focus_event_1 (struct frame *f, int in_p)
      click in the frame. Why is this?  */
   if (in_p
 #if XtSpecificationRelease > 5
-      && FRAME_X_TEXT_WIDGET (f) != widget_with_focus
+      && needs_it != widget_with_focus
 #endif
       )
     {
-      lw_set_keyboard_focus (FRAME_X_SHELL_WIDGET (f),
-                            FRAME_X_TEXT_WIDGET (f));
+      lw_set_keyboard_focus (FRAME_X_SHELL_WIDGET (f), needs_it);
     }
 
+  /* If we are focusing on a native widget then record and exit. */
+  if (needs_it != FRAME_X_TEXT_WIDGET (f)) {
+    widget_with_focus = needs_it;
+    return;
+  }
+
   /* We have the focus now. See comment in
      emacs_Xt_handle_widget_losing_focus (). */
   if (in_p)
@@ -1597,9 +1614,26 @@ handle_focus_event_1 (struct frame *f, int in_p)
   }
 }
 
+/* Create a synthetic X focus event. */
+void
+enqueue_focus_event (Widget wants_it, Lisp_Object frame, int in_p)
+{
+  Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
+  Lisp_Event *ev          = XEVENT (emacs_event);
+  XEvent *x_event = &ev->event.magic.underlying_x_event;
+
+  x_event->type = in_p ? FocusIn : FocusOut;
+  x_event->xfocus.window = XtWindow (wants_it);
+
+  ev->channel              = frame;
+  ev->event_type           = magic_event;
+
+  enqueue_Xt_dispatch_event (emacs_event);
+}
+
 /* The idea here is that when a widget glyph gets unmapped we don't
    want the focus to stay with it if it has focus - because it may
-   well just get deleted next andthen we have lost the focus until the
+   well just get deleted next and then we have lost the focus until the
    user does something. So handle_focus_event_1 records the widget
    with keyboard focus when FocusOut is processed, and then, when a
    widget gets unmapped, it calls this function to restore focus if
@@ -1926,7 +1960,7 @@ emacs_Xt_handle_magic_event (Lisp_Event *emacs_event)
       if (FRAME_X_EXTERNAL_WINDOW_P (f))
        break;
 #endif
-      handle_focus_event_1 (f, event->type == FocusIn);
+      handle_focus_event_2 (event->xfocus.window, f, event->type == FocusIn);
       break;
 
     case ClientMessage:
@@ -2905,8 +2939,47 @@ emacs_Xt_quit_p (void)
 static void
 drain_X_queue (void)
 {
+  Lisp_Object devcons, concons;
+  CONSOLE_LOOP (concons)
+  {
+    struct console *con = XCONSOLE (XCAR (concons));
+    if (!con->input_enabled)
+      continue;
+
+    /* sjt sez: Have you tried the loop over devices with XtAppPending(),
+       not XEventsQueued()?
+       Ben Sigelman sez: No.
+       sjt sez: I'm guessing that the reason that your patch "works" is this:
+
+       +      struct device* d;
+       +      Display* display;
+       +      d = XDEVICE (XCAR (devcons));
+       +      if (DEVICE_X_P (d) && DEVICE_X_DISPLAY (d)) {
+
+       Ie, if the device goes down, XEmacs detects that and deletes it.
+       Then the if() fails (DEVICE_X_DISPLAY(d) is NULL), and we don't go
+       into the Xlib-of-no-return.  If you know different, I'd like to hear
+       about it. ;-)
+
+       These ideas haven't been tested; the code below works for Ben.
+    */
+    CONSOLE_DEVICE_LOOP (devcons, con)
+    {
+      struct device* d;
+      Display* display;
+      d = XDEVICE (XCAR (devcons));
+      if (DEVICE_X_P (d) && DEVICE_X_DISPLAY (d)) {
+        display = DEVICE_X_DISPLAY (d);
+        while (XEventsQueued (display, QueuedAfterReading))
+          XtAppProcessEvent (Xt_app_con, XtIMXEvent);
+      }
+    }
+  }
+  /* This is the old code, before Ben Sigelman's patch. */
+  /*
   while (XtAppPending (Xt_app_con) & XtIMXEvent)
     XtAppProcessEvent (Xt_app_con, XtIMXEvent);
+  */
 }
 
 static int
index aaeaa4f..09bfe6d 100644 (file)
@@ -812,7 +812,7 @@ winsock_closer (Lstream *lstr)
   else
     shutdown (str->s, 1);
 
-  CloseHandle ((HANDLE)str->s);
+  closesocket (str->s);
   if (str->pending_p)
     WaitForSingleObject (str->ov.hEvent, INFINITE);
 
index 5b00161..5bc0dc4 100644 (file)
@@ -2959,7 +2959,7 @@ print_extent_1 (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
   if (extent_detached_p (ext))
     strcpy (bp, "detached");
   else
-    sprintf (bp, "%d, %d",
+    sprintf (bp, "%ld, %ld",
             XINT (Fextent_start_position (obj)),
             XINT (Fextent_end_position (obj)));
   bp += strlen (bp);
@@ -5351,7 +5351,14 @@ The following symbols have predefined meanings:
                     `inside-margin', or `outside-margin') of the extent's
                     begin glyph.
 
- end-glyph-layout The layout policy of the extent's end glyph.
+ end-glyph-layout   The layout policy of the extent's end glyph.
+
+ syntax-table       A cons or a syntax table object.  If a cons, the car must
+                    be an integer (interpreted as a syntax code, applicable to
+                   all characters in the extent).  Otherwise, syntax of
+                   characters in the extent is looked up in the syntax table.
+                   You should use the text property API to manipulate this
+                   property.  (This may be required in the future.)
 */
        (extent, property, value))
 {
index e8d6707..ff3fd1c 100644 (file)
@@ -313,6 +313,7 @@ EXFUN (Fextent_end_position, 1);
 EXFUN (Fextent_object, 1);
 EXFUN (Fextent_start_position, 1);
 EXFUN (Fmake_extent, 3);
+EXFUN (Fnext_single_property_change, 4);
 EXFUN (Fprevious_single_property_change, 4);
 EXFUN (Fset_extent_endpoints, 4);
 EXFUN (Fnext_extent_change, 2);
index 8635316..fe42ebd 100644 (file)
@@ -1785,6 +1785,8 @@ coding_system_from_mask (int mask)
    that should be unnecessary with the explicit eol-type argument. */
 
 #define LENGTH(string_constant) (sizeof (string_constant) - 1)
+/* number of leading lines to check for a coding cookie */
+#define LINES_TO_CHECK 2
 
 void
 determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
@@ -1808,13 +1810,13 @@ determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
       Extbyte *p;
       Lstream_data_count nread = Lstream_read (stream, buf, sizeof (buf));
       Extbyte *scan_end;
+      int lines_checked = 0;
 
       /* Look for initial "-*-"; mode line prefix */
       for (p = buf,
             scan_end = buf + nread - LENGTH ("-*-coding:?-*-");
           p <= scan_end
-            && *p != '\n'
-            && *p != '\r';
+            && lines_checked < LINES_TO_CHECK;
           p++)
        if (*p == '-' && *(p+1) == '*' && *(p+2) == '-')
          {
@@ -1823,8 +1825,7 @@ determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
            for (p = local_vars_beg,
                   scan_end = buf + nread - LENGTH ("-*-");
                 p <= scan_end
-                  && *p != '\n'
-                  && *p != '\r';
+                  && lines_checked < LINES_TO_CHECK;
                 p++)
              if (*p == '-' && *(p+1) == '*' && *(p+2) == '-')
                {
@@ -1866,8 +1867,24 @@ determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
                      }
                  break;
                }
+             /* #### file must use standard EOLs or we miss 2d line */
+             /* #### not to mention this is broken for UTF-16 DOS files */
+             else if (*p == '\n' || *p == '\r')
+               {
+                 lines_checked++;
+                 /* skip past multibyte (DOS) newline */
+                 if (*p == '\r' && *(p+1) == '\n') p++;
+               }
            break;
          }
+       /* #### file must use standard EOLs or we miss 2d line */
+       /* #### not to mention this is broken for UTF-16 DOS files */
+       else if (*p == '\n' || *p == '\r')
+         {
+           lines_checked++;
+           /* skip past multibyte (DOS) newline */
+           if (*p == '\r' && *(p+1) == '\n') p++;
+         }
 
       if (NILP (coding_system))
        do
index ea40a1b..1cfd739 100644 (file)
@@ -391,28 +391,30 @@ setup_context_cache (struct buffer *buf, Bufpos pt)
   }
 }
 
+/* GCC 2.95.4 seems to need the casts */
 #define SYNTAX_START_STYLE(c1, c2)                                     \
-  (SYNTAX_CODES_MATCH_START_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ?       \
+  ((enum comment_style)                                                 \
+   (SYNTAX_CODES_MATCH_START_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ?      \
    comment_style_a :                                                   \
    SYNTAX_CODES_MATCH_START_P (c1, c2, SYNTAX_COMMENT_STYLE_B) ?       \
    comment_style_b :                                                   \
-   comment_style_none)
+   comment_style_none))
 
 #define SYNTAX_END_STYLE(c1, c2)                               \
-  (SYNTAX_CODES_MATCH_END_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ? \
+  ((enum comment_style)                                         \
+   (SYNTAX_CODES_MATCH_END_P (c1, c2, SYNTAX_COMMENT_STYLE_A) ?        \
    comment_style_a :                                           \
    SYNTAX_CODES_MATCH_END_P (c1, c2, SYNTAX_COMMENT_STYLE_B) ? \
    comment_style_b :                                           \
-   comment_style_none)
+   comment_style_none))
 
-/* GCC 2.95.4 seems to need the cast */
-#define SINGLE_SYNTAX_STYLE(c)                                         \
-  ((enum comment_style)                                                 \
-      (SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_A) ?       \
-       comment_style_a :                                               \
-       SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_B) ?       \
-       comment_style_b :                                               \
-       comment_style_none))
+#define SINGLE_SYNTAX_STYLE(c)                                 \
+  ((enum comment_style)                                         \
+   (SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_A) ?  \
+   comment_style_a :                                           \
+   SYNTAX_CODE_MATCHES_1CHAR_P (c, SYNTAX_COMMENT_STYLE_B) ?   \
+   comment_style_b :                                           \
+   comment_style_none))
 
 /* Set up context_cache for position PT in BUF. */
 
@@ -430,6 +432,7 @@ find_context (struct buffer *buf, Bufpos pt)
   setup_context_cache (buf, pt);
   pt = context_cache.cur_point;
 
+  SCS_STATISTICS_SET_FUNCTION (scs_find_context);
   SETUP_SYNTAX_CACHE (pt - 1, 1);
   if (pt > BUF_BEGV (buf))
     {
@@ -632,13 +635,18 @@ find_context (struct buffer *buf, Bufpos pt)
       else if ((SYNTAX_CODE_COMMENT_BITS (syncode) &
                SYNTAX_FIRST_CHAR_END) &&
               context_cache.context == context_block_comment &&
+#if 0
+              /* #### pre-Matt code had: */
+              (context_cache.style ==
+               SYNTAX_END_STYLE (c, BUF_FETCH_CHAR (buf, pt+1))) &&
+              /* why do these differ here?! */
+#endif
               context_cache.style == SINGLE_SYNTAX_STYLE (syncode) &&
               (context_cache.ccontext == ccontext_start2 ||
                context_cache.ccontext == ccontext_end1))
-       /* #### is it right to check for end1 here?? 
-          yes, because this might be a repetition of the first char
-          of a comment-end sequence. ie, '/xxx foo xxx/' or
-          '/xxx foo x/', where 'x' = '*' -- mct */
+       /* check end1, to detect a repetition of the first char of a
+          comment-end sequence. ie, '/xxx foo xxx/' or '/xxx foo x/',
+          where 'x' = '*' -- mct */
        {
          if (context_cache.style == comment_style_none) abort ();
          context_cache.ccontext = ccontext_end1;
index 37c596e..effa87d 100644 (file)
@@ -828,7 +828,7 @@ msprinter_init_frame_3 (struct frame *f)
   DOCINFO di;
   struct device *device = XDEVICE (FRAME_DEVICE (f));
   int frame_left, frame_top, frame_width, frame_height;
-
+  
   /* DC might be recreated in msprinter_apply_devmode,
      so do not initialize until now */
   HDC hdc = DEVICE_MSPRINTER_HDC (device);
index 23ef070..f174a06 100644 (file)
@@ -2673,14 +2673,14 @@ x_delete_frame (struct frame *f)
   dpy = XtDisplay (FRAME_X_SHELL_WIDGET (f));
 
 #ifdef EXTERNAL_WIDGET
-  expect_x_error (XtDisplay (FRAME_X_SHELL_WIDGET (f)));
+  expect_x_error (dpy);
   /* for obscure reasons having (I think) to do with the internal
      window-to-widget hierarchy maintained by Xt, we have to call
      XtUnrealizeWidget() here.  Xt can really suck. */
   if (f->being_deleted)
     XtUnrealizeWidget (FRAME_X_SHELL_WIDGET (f));
   XtDestroyWidget (FRAME_X_SHELL_WIDGET (f));
-  x_error_occurred_p (XtDisplay (FRAME_X_SHELL_WIDGET (f)));
+  x_error_occurred_p (dpy);
 #else
   XtDestroyWidget (FRAME_X_SHELL_WIDGET (f));
   /* make sure the windows are really gone! */
index c98d0c3..6c98955 100644 (file)
@@ -116,6 +116,10 @@ Lisp_Object Vframe_being_created;
 Lisp_Object Qframe_being_created;
 
 static void store_minibuf_frame_prop (struct frame *f, Lisp_Object val);
+static void frame_conversion_internal (struct frame *f, int pixel_to_char,
+                                      int *pixel_width, int *pixel_height,
+                                      int *char_width, int *char_height,
+                                      int real_face);
 static struct display_line title_string_display_line;
 /* Used by generate_title_string. Global because they get used so much that
    the dynamic allocation time adds up. */
@@ -2623,6 +2627,37 @@ but that the idea of the actual height of the frame should not be changed.
   return frame;
 }
 
+DEFUN ("set-frame-pixel-height", Fset_frame_pixel_height, 2, 3, 0, /*
+Specify that the frame FRAME is HEIGHT pixels tall.
+Optional third arg non-nil means that redisplay should be HEIGHT pixels tall
+but that the idea of the actual height of the frame should not be changed.
+*/
+       (frame, height, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int pheight, width;
+  XSETFRAME (frame, f);
+  CHECK_INT (height);
+
+  if (!window_system_pixelated_geometry (frame)) 
+    {
+      int h = XINT (height);
+      width = FRAME_WIDTH (f);
+      /* Simply using pixel_to_real_char_size here is not good
+        enough since we end up with a total frame size of HEIGHT
+        rather than a displayable height of HEIGHT. */
+      frame_conversion_internal (f, 2, 0, &h, 0, &pheight, 0);
+    }
+  else 
+    {
+      width = FRAME_PIXWIDTH (f);
+      pheight = XINT (height);
+    }
+
+  internal_set_frame_size (f, width, pheight, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-width", Fset_frame_width, 2, 3, 0, /*
 Specify that the frame FRAME has COLS columns.
 Optional third arg non-nil means that redisplay should use COLS columns
@@ -2650,6 +2685,37 @@ but that the idea of the actual width of the frame should not be changed.
   return frame;
 }
 
+DEFUN ("set-frame-pixel-width", Fset_frame_pixel_width, 2, 3, 0, /*
+Specify that the frame FRAME is WIDTH pixels wide.
+Optional third arg non-nil means that redisplay should be WIDTH wide
+but that the idea of the actual height of the frame should not be changed.
+*/
+       (frame, width, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int height, pwidth;
+  XSETFRAME (frame, f);
+  CHECK_INT (width);
+
+  if (!window_system_pixelated_geometry (frame))
+    {
+      int w = XINT (width);
+      height = FRAME_HEIGHT (f);
+      /* Simply using pixel_to_real_char_size here is not good
+        enough since we end up with a total frame size of WIDTH
+        rather than a displayable height of WIDTH. */
+      frame_conversion_internal (f, 2, &w, 0, &pwidth, 0, 0);
+    }
+  else
+    {
+      height = FRAME_PIXHEIGHT (f);
+      pwidth = XINT (width);
+    }
+
+  internal_set_frame_size (f, pwidth, height, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-size", Fset_frame_size, 3, 4, 0, /*
 Set the size of FRAME to COLS by ROWS, measured in characters.
 Optional fourth arg non-nil means that redisplay should use COLS by ROWS
@@ -2675,6 +2741,38 @@ but that the idea of the actual size of the frame should not be changed.
   return frame;
 }
 
+DEFUN ("set-frame-pixel-size", Fset_frame_pixel_size, 3, 4, 0, /*
+Set the size of FRAME to WIDTH by HEIGHT, measured in pixels.
+Optional fourth arg non-nil means that redisplay should use WIDTH by HEIGHT
+but that the idea of the actual size of the frame should not be changed.
+*/
+       (frame, width, height, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int pheight, pwidth;
+  XSETFRAME (frame, f);
+  CHECK_INT (width);
+  CHECK_INT (height);
+
+  if (!window_system_pixelated_geometry (frame)) 
+    {
+      int w = XINT (width);
+      int h = XINT (height);
+      /* Simply using pixel_to_real_char_size here is not good enough
+        since we end up with a total frame size of WIDTH x HEIGHT
+        rather than a displayable height of WIDTH x HEIGHT. */
+      frame_conversion_internal (f, 2, &w, &h, &pwidth, &pheight, 0);
+    }
+  else
+    {
+      pheight = XINT (height);
+      pwidth = XINT (width);
+    }
+
+  internal_set_frame_size (f, pwidth, pheight, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-position", Fset_frame_position, 3, 3, 0, /*
 Set position of FRAME in pixels to XOFFSET by YOFFSET.
 This is actually the position of the upper left corner of the frame.
@@ -2731,7 +2829,21 @@ frame_conversion_internal (struct frame *f, int pixel_to_char,
     2 * FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH (f) +
     2 * FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f);
 
-  if (pixel_to_char)
+  /* Convert to chars so that the displayable area is pixel_width x
+     pixel_height.
+
+     #### Consider rounding up to 0.5 characters to avoid adding too
+     much space. */
+  if (pixel_to_char > 1)
+    {
+      if (char_width)
+       *char_width = ROUND_UP (*pixel_width, cpw) / cpw;
+      if (char_height)
+       *char_height = ROUND_UP (*pixel_height, cph) / cph;
+    }
+  /* Convert to chars so that the total frame size is pixel_width x
+     pixel_height. */
+  else if (pixel_to_char)
     {
       if (char_width)
        *char_width = 1 + ((*pixel_width - egw) - bdr - obw) / cpw;
@@ -3293,6 +3405,9 @@ syms_of_frame (void)
   DEFSUBR (Fset_frame_height);
   DEFSUBR (Fset_frame_width);
   DEFSUBR (Fset_frame_size);
+  DEFSUBR (Fset_frame_pixel_height);
+  DEFSUBR (Fset_frame_pixel_width);
+  DEFSUBR (Fset_frame_pixel_size);
   DEFSUBR (Fset_frame_position);
   DEFSUBR (Fset_frame_pointer);
   DEFSUBR (Fprint_job_page_number);
index 5cc34a6..ebdec9b 100644 (file)
@@ -139,6 +139,8 @@ SYMBOL (Qinteger);
 SYMBOL (Qinternal);
 SYMBOL_KEYWORD (Q_items);
 SYMBOL_KEYWORD (Q_justify);
+SYMBOL_KEYWORD (Q_vertically_justify);
+SYMBOL_KEYWORD (Q_horizontally_justify);
 SYMBOL (Qkey);
 SYMBOL (Qkey_assoc);
 SYMBOL_KEYWORD (Q_key_sequence);
index 883ab53..80ef445 100644 (file)
@@ -1720,9 +1720,9 @@ xbm_create_bitmap_from_data (HDC hdc, char *data,
 
       for (j=0; j<old_width; j++)
        {
-         int byte = offset[j];
+         int bite = offset[j];
          new_offset[j] = ~ (unsigned char)
-           ((flip_table[byte & 0xf] << 4) + flip_table[byte >> 4]);
+           ((flip_table[bite & 0xf] << 4) + flip_table[bite >> 4]);
        }
     }
 
@@ -2368,6 +2368,13 @@ mswindows_redisplay_widget (Lisp_Image_Instance *p)
     }
 }
 
+/* Account for some of the limitations with widget images. */
+static int
+mswindows_widget_border_width (void)
+{
+  return DEFAULT_WIDGET_BORDER_WIDTH;
+}
+
 /* register widgets into our hashtable so that we can cope with the
    callbacks. The hashtable is weak so deregistration is handled
    automatically */
@@ -3078,7 +3085,7 @@ mswindows_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instant
   default_face_font_info (domain, 0, 0, &height, 0, 0);
   GET_LIST_LENGTH (items, len);
 
-  height = (height + WIDGET_BORDER_HEIGHT * 2 ) * len;
+  height = (height + DEFAULT_WIDGET_BORDER_WIDTH * 2 ) * len;
   IMAGE_INSTANCE_HEIGHT (ii) = height;
 
   /* Now create the widget. */
@@ -3236,6 +3243,7 @@ console_type_create_glyphs_mswindows (void)
   CONSOLE_HAS_METHOD (mswindows, image_instance_hash);
   CONSOLE_HAS_METHOD (mswindows, init_image_instance_from_eimage);
   CONSOLE_HAS_METHOD (mswindows, locate_pixmap_file);
+  CONSOLE_HAS_METHOD (mswindows, widget_border_width);
 
   /* image methods - printer */
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, print_image_instance);
index be7b5fa..91946b0 100644 (file)
@@ -1,5 +1,5 @@
 /* Widget-specific glyph objects.
-   Copyright (C) 1998, 1999, 2000 Andy Piper.
+   Copyright (C) 1998, 1999, 2000, 2002 Andy Piper.
 
 This file is part of XEmacs.
 
@@ -60,6 +60,12 @@ Lisp_Object Qnative_layout;
 
 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out;
 Lisp_Object Qmake_glyph;
+Lisp_Object Vwidget_border_width;
+
+static int
+widget_border_width (Lisp_Object domain);
+static int
+widget_spacing (Lisp_Object domain);
 
 #ifdef DEBUG_WIDGETS
 int debug_widget_instances;
@@ -118,7 +124,15 @@ check_valid_tab_orientation (Lisp_Object data)
 static void
 check_valid_justification (Lisp_Object data)
 {
-  if (!EQ (data, Qleft) && !EQ (data, Qright) && !EQ (data, Qcenter))
+  if (!EQ (data, Qleft) 
+      && 
+      !EQ (data, Qright) 
+      && 
+      !EQ (data, Qtop) 
+      && 
+      !EQ (data, Qbottom) 
+      && 
+      !EQ (data, Qcenter))
     invalid_argument ("unknown justification for layout", data);
 }
 
@@ -238,6 +252,56 @@ substitute_keyword_value (Lisp_Object inst, Lisp_Object key, Lisp_Object val)
     }
 }
 
+/* Determine the border with of the widget. */
+static int
+widget_border_width (Lisp_Object domain)
+{
+  /* #### FIXME -- need to use specifiers (Vwidget_border_width) for
+     some portion of this. */
+  if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain),
+                    widget_border_width))
+    return DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
+  else 
+    return DEFAULT_WIDGET_BORDER_WIDTH;
+}
+
+static int
+widget_instance_border_width (Lisp_Image_Instance* ii)
+{
+  return widget_border_width (IMAGE_INSTANCE_DOMAIN (ii));
+}
+
+/* #### Its not clear to me what the value of logical_unit_height should
+   be, or whether it should even depend on the current
+   image_instance. It really should probably only depend on the
+   default widget face and the domain, however you can envisage users
+   wanting different logical units for nested layouts - so using the
+   properties of the current lahyout is probably not so dumb. */
+static int
+logical_unit_height (Lisp_Object text, Lisp_Object face, Lisp_Object domain)
+{
+  int charheight = 0;
+  query_string_geometry (text, face, 
+                        0, &charheight, 0, domain);
+  /* For the returned value to be useful it needs to be big enough to
+     accomodate the largest single-height widget. This is currently
+     the edit-field. */
+  return charheight + 2 * widget_spacing (domain)
+    + 4 * widget_border_width (domain);
+}
+
+static int
+widget_logical_unit_height (Lisp_Image_Instance* ii)
+{
+  return logical_unit_height (NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)) ?
+                             NILP (IMAGE_INSTANCE_NAME (ii)) ?
+                             Fsymbol_name (Qwidget) 
+                             : IMAGE_INSTANCE_NAME (ii)
+                             : IMAGE_INSTANCE_WIDGET_TEXT (ii),
+                             IMAGE_INSTANCE_WIDGET_FACE (ii),
+                             IMAGE_INSTANCE_DOMAIN (ii));
+}
+
 /* Wire widget property invocations to specific widgets. The problem
    we are solving here is that when instantiators get converted to
    instances they lose some type information (they just become
@@ -424,7 +488,8 @@ redisplay_widget (Lisp_Object widget)
      from lisp does not result in synchronous updates. Do this last so
      that format-specific methods have an opportunity to prevent
      wholesale changes - e.g. rebuilding tabs. */
-  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), redisplay_widget, (ii));
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (IMAGE_INSTANCE_DOMAIN (ii)),
+                redisplay_widget, (ii));
 
   /* Pick up the items we recorded earlier. */
   if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
@@ -435,6 +500,17 @@ redisplay_widget (Lisp_Object widget)
     }
 }
 
+/* Determine the spacing of the widget. */
+static int
+widget_spacing (Lisp_Object domain)
+{
+  if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain), widget_spacing))
+    return DEVMETH (DOMAIN_XDEVICE (domain),
+                   widget_spacing, (0));
+  else 
+    return DEFAULT_WIDGET_SPACING;
+}
+
 /* Query for a widgets desired geometry. If no type specific method is
    provided then use the widget text to calculate sizes. */
 static void
@@ -483,9 +559,9 @@ widget_query_geometry (Lisp_Object image_instance,
                                     &w, &h, 0, domain);
              /* Adjust the size for borders. */
              if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
-               *width = w + 2 * WIDGET_BORDER_WIDTH;
+               *width = w + 2 * widget_instance_border_width (ii);
              if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
-               *height = h +  2 * WIDGET_BORDER_HEIGHT;
+               *height = h +  2 * widget_instance_border_width (ii);
            }
        }
       /* Finish off with dynamic sizing. */
@@ -597,7 +673,8 @@ initialize_widget_image_instance (Lisp_Image_Instance *ii, Lisp_Object type)
   IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 1;
   IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 1;
   IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_HORIZONTAL;
-  IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii) = 0;
+  IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = 0;
+  IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = 0;
 }
 
 /* Instantiate a button widget. Unfortunately instantiated widgets are
@@ -715,24 +792,44 @@ widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
      size in characters is probably as good as any since the widget
      face is more likely to be proportional and thus give inadequate
      results. Using character sizes can only ever be approximate
-     anyway. */
-  if (tw || th)
+     anyway. :height is measured in logical characters which take into
+     account the borders and spacing on widgets. */
+  if (tw)
     {
-      int charwidth, charheight;
-      default_face_font_info (domain, 0, 0, &charheight, &charwidth, 0);
-      if (tw)
-       pw = charwidth * tw;
-      if (th)
-       ph = charheight * th;
+      int charwidth;
+      default_face_font_info (domain, 0, 0, 0, &charwidth, 0);
+      pw = ROUND_UP (charwidth * tw + 4 * widget_instance_border_width (ii), charwidth);
+    }
+
+  /* For heights the widget face is more appropriate. */
+  if (th == 1) 
+    {
+      int charheight;
+      if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii))) 
+       {
+         query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
+                                IMAGE_INSTANCE_WIDGET_FACE (ii),
+                                0, &charheight, 0, domain);
+       }
+      else 
+       {
+         default_face_font_info (domain, 0, 0, &charheight, 0, 0);
+       }
+      ph = (charheight + 2 * widget_instance_border_width (ii)) * th;
+    }
+  /* For heights > 1 use logical units. */
+  else if (th > 1) 
+    {
+      ph = widget_logical_unit_height (ii) * th;
     }
 
   /* for a widget with an image pick up the dimensions from that */
   if (!NILP (glyph))
     {
       if (!pw)
-       pw = glyph_width (glyph, image_instance) + 2 * WIDGET_BORDER_WIDTH;
+       pw = glyph_width (glyph, image_instance) + 2 * widget_instance_border_width (ii);
       if (!ph)
-       ph = glyph_height (glyph, image_instance) + 2 * WIDGET_BORDER_HEIGHT;
+       ph = glyph_height (glyph, image_instance) + 2 * widget_instance_border_width (ii);
       IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
       IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
     }
@@ -779,7 +876,7 @@ button_query_geometry (Lisp_Object image_instance,
   /* Adjust the size for borders. */
   if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
     {
-      *width = w + 2 * WIDGET_BORDER_WIDTH;
+      *width = w + 3 * widget_instance_border_width (ii);
 
       if (EQ (XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (ii))->style, Qradio)
          ||
@@ -788,7 +885,25 @@ button_query_geometry (Lisp_Object image_instance,
        *width += 12;
     }
   if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
-    *height = h +  2 * WIDGET_BORDER_HEIGHT;
+    *height = h +  3 * widget_instance_border_width (ii);
+}
+
+/* Get the geometry of an edit field. */
+static void
+edit_field_query_geometry (Lisp_Object image_instance,
+                      int* width, int* height,
+                      enum image_instance_geometry disp, Lisp_Object domain)
+{
+  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  int w, h;
+  query_string_geometry (IMAGE_INSTANCE_WIDGET_TEXT (ii),
+                        IMAGE_INSTANCE_WIDGET_FACE (ii),
+                        &w, &h, 0, domain);
+  /* Adjust the size for borders. */
+  if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
+    *width = w + 4 * widget_instance_border_width (ii);
+  if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii))
+    *height = h + 4 * widget_instance_border_width (ii);
 }
 
 /* tree-view geometry - get the height right */
@@ -811,6 +926,7 @@ tree_view_query_geometry (Lisp_Object image_instance,
   if (*height)
     {
       int len, h;
+      /* #### widget face would be better here. */
       default_face_font_info (domain, 0, 0, &h, 0, 0);
       GET_LIST_LENGTH (items, len);
       *height = len * h;
@@ -836,9 +952,9 @@ tab_control_query_geometry (Lisp_Object image_instance,
       query_string_geometry (XGUI_ITEM (XCAR (rest))->name,
                             IMAGE_INSTANCE_WIDGET_FACE (ii),
                             &w, &h, 0, domain);
-      tw += 5 * WIDGET_BORDER_WIDTH; /* some bias */
+      tw += 5 * widget_instance_border_width (ii); /* some bias */
       tw += w;
-      th = max (th, h + 2 * WIDGET_BORDER_HEIGHT);
+      th = max (th, h + 2 * widget_instance_border_width (ii));
     }
 
   /* Fixup returned values depending on orientation. */
@@ -948,14 +1064,50 @@ layout_update (Lisp_Object image_instance, Lisp_Object instantiator)
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
   Lisp_Object border_inst = find_keyword_in_vector (instantiator, Q_border);
+  Lisp_Object justify = find_keyword_in_vector (instantiator, Q_justify);
+  Lisp_Object hjustify = find_keyword_in_vector (instantiator, Q_horizontally_justify);
+  Lisp_Object vjustify = find_keyword_in_vector (instantiator, Q_vertically_justify);
   Lisp_Object border = Qnil;
   Lisp_Object children = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii);
   int structure_changed = 0;
   struct gcpro gcpro1;
 
+  /* Pick up horizontal justification, left is the default.*/
+  if (!NILP (hjustify)) 
+    {
+      if (EQ (hjustify, Qright) || EQ (hjustify, Qbottom))
+       IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_RIGHT;
+      else if (EQ (hjustify, Qcenter))
+       IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
+    }
+  /* If not set use general justification. */
+  else if (!NILP (justify))
+    {
+      if (EQ (justify, Qright) || EQ (justify, Qbottom))
+       IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_RIGHT;
+      else if (EQ (justify, Qcenter))
+       IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
+    }
+
+  /* Pick up vertical justification, top is the default. */
+  if (!NILP (vjustify)) 
+    {
+      if (EQ (vjustify, Qright) || EQ (vjustify, Qbottom))
+       IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_BOTTOM;
+      else if (EQ (vjustify, Qcenter))
+       IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
+    }
+  /* If not set use general justification. */
+  else if (!NILP (justify)) 
+    {
+      if (EQ (justify, Qright) || EQ (justify, Qbottom))
+       IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_BOTTOM;
+      else if (EQ (justify, Qcenter))
+       IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY (ii) = LAYOUT_JUSTIFY_CENTER;
+    }
+
   /* We want to avoid consing if we can. This is quite awkward because
      we have to deal with the border as well as the items. */
-
   GCPRO1 (border);
 
   if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
@@ -1107,10 +1259,32 @@ layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
    glyphs are cached on a device basis like most other glyphs. Instead
    they should be cached per-window and then the instance would be
    fixed and we wouldn't have to mess around with font metrics and the
-   rest. */
-
-/* Query the geometry of a layout widget. We assume that we can only
-   get here if the size is not already fixed. */
+   rest. 
+
+   Another sizing problem is alignment. We provide layout widgets that
+   allow users to stack widgets vertically or horizontally. These
+   layouts also allow the widgets to be centered (space evenly
+   distributed), left or right justified (fixed spacing widgets
+   stacked against the left, righ, top or bottom edge). Unfortunately
+   this doesn't allow widgets in different layouts to be aligned. For
+   instance how should the search dialog be organized for alignment?
+   The obvious choice of two vertical columns does not work since the
+   size of individual widgets will affect where they get placed. The
+   same is true for several rows of widgets. To solve this problem we
+   introduce the notion of `logical_unit_height'. This is a size
+   quantity that is designed to be big enough to accomodate the
+   largest `single height unit'. The function
+   widget_logical_unit_height() determines the value of this in
+   pixels. It is dependent on the widget face and some combination of
+   spacing and border-width. Thus if users specify left or right
+   justification in a vertical layout they get something in logical
+   units. To simplify this the functions
+   `widget-logical-to-character-height' and
+   `widget-logical-to-character-width' allow conversion between
+   characters and logical units so that frames can be sized
+   appropriately. */
+
+/* Query the geometry of a layout widget. */
 static void
 layout_query_geometry (Lisp_Object image_instance, int* width,
                       int* height, enum image_instance_geometry disp,
@@ -1119,7 +1293,7 @@ layout_query_geometry (Lisp_Object image_instance, int* width,
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object items = IMAGE_INSTANCE_LAYOUT_CHILDREN (ii), rest;
   int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0;
-  int gheight, gwidth;
+  int gheight, gwidth, luh;
 
   /* If we are not initialized then we won't have any children. */
   if (!IMAGE_INSTANCE_INITIALIZED (ii))
@@ -1135,12 +1309,14 @@ layout_query_geometry (Lisp_Object image_instance, int* width,
       !IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
     return;
 
+  luh = widget_logical_unit_height (ii);
+
   /* Pick up the border text if we have one. */
   if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
     {
       glyph_query_geometry (XCAR (items), &gwidth, &gheight, disp,
                            image_instance);
-      ph_adjust = gheight / 2;
+      ph_adjust = gheight;
       items = XCDR (items);
     }
 
@@ -1151,8 +1327,7 @@ layout_query_geometry (Lisp_Object image_instance, int* width,
       glyph_query_geometry (glyph, &gwidth, &gheight, disp, image_instance);
 
       nitems ++;
-      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-         == LAYOUT_HORIZONTAL)
+      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
        {
          maxph = max (maxph, gheight);
          maxpw += gwidth;
@@ -1166,36 +1341,53 @@ layout_query_geometry (Lisp_Object image_instance, int* width,
 
   /* Work out minimum space we need to fit all the items. This could
      have been fixed by the user. */
-  if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
-    {
-      Lisp_Object dynamic_width =
-       Feval (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
-      if (INTP (dynamic_width))
-       *width = XINT (dynamic_width);
-    }
-  else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-          == LAYOUT_HORIZONTAL)
-    *width = maxpw + ((nitems + 1) * WIDGET_BORDER_WIDTH +
-                     IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
-  else
-    *width = maxpw + 2 * (WIDGET_BORDER_WIDTH * 2 +
-                         IMAGE_INSTANCE_MARGIN_WIDTH (ii));
+  if (IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii)) {
+    if (!NILP (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii)))
+      {
+       Lisp_Object dynamic_width =
+         Feval (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii));
+       if (INTP (dynamic_width))
+         *width = XINT (dynamic_width);
+      }
+    else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL) 
+      {
+       *width = maxpw + ((nitems + 1) * widget_instance_border_width (ii) +
+                         IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
+      }
+    else
+      {
+       *width = maxpw + 2 * (widget_instance_border_width (ii) * 2 +
+                             IMAGE_INSTANCE_MARGIN_WIDTH (ii));
+      }
+  }
 
   /* Work out vertical spacings. */
-  if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
-    {
-      Lisp_Object dynamic_height =
-       Feval (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
-      if (INTP (dynamic_height))
-       *height = XINT (dynamic_height);
-    }
-  else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-          == LAYOUT_VERTICAL)
-    *height = maxph + ((nitems + 1) * WIDGET_BORDER_HEIGHT +
-                      IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
-  else
-    *height = maxph + (2 * WIDGET_BORDER_HEIGHT +
-                      IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
+  if (IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii)) {
+    if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
+      {
+       Lisp_Object dynamic_height =
+         Feval (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii));
+       if (INTP (dynamic_height))
+         *height = XINT (dynamic_height);
+      }
+    else if (IMAGE_INSTANCE_SUBWINDOW_LOGICAL_LAYOUT (ii))
+      {
+       *height = nitems * luh + ph_adjust;
+      }
+    else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_VERTICAL)
+      {
+       *height = maxph + ((nitems + 1) * widget_instance_border_width (ii) +
+                          IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
+      }
+    else
+      {
+       *height = maxph + (2 * widget_instance_border_width (ii) +
+                          IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
+      }
+  }
+#ifdef DEBUG_WIDGET_OUTPUT
+  stderr_out ("layout wants %dx%d\n", *width, *height);
+#endif
 }
 
 int
@@ -1209,20 +1401,34 @@ layout_layout (Lisp_Object image_instance,
   int x, y, maxph = 0, maxpw = 0, nitems = 0,
     horiz_spacing, vert_spacing, ph_adjust = 0;
   int gheight, gwidth;
+  /* See comments in widget_logical_unit_height(). */
+  int luh = widget_logical_unit_height (ii);
 
   /* If we are not initialized then we won't have any children. */
   if (!IMAGE_INSTANCE_INITIALIZED (ii))
       return 0;
 
-  /* Pick up the border text if we have one. */
+#ifdef DEBUG_WIDGET_OUTPUT
+  stderr_out ("layout output %dx%d\n", width, height);
+#endif
+
+  /* Pick up the border text if we have one. A border can have the
+     values Qetched_in, Qetched_out, Qbevel_in, Qbevel_out or an
+     integer. The first four just affect the display properties of the
+     border that is drawn. The last is an offset and implies that the
+     first item in the list of subcontrols is a text control that
+     should be displayed on the border. */
   if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
     {
       Lisp_Object border = XCAR (items);
       items = XCDR (items);
       glyph_query_geometry (border, &gwidth, &gheight,
                            IMAGE_DESIRED_GEOMETRY, image_instance);
-      ph_adjust = gheight / 2;
-      IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (ph_adjust);
+      /* The vertical offset for subsequent items is the full height
+        of the border glyph. */
+      ph_adjust = gheight;
+      /* The offset for the border is half the glyph height. */
+      IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (gheight / 2);
 
       /* #### Really, what should this be? */
       glyph_do_layout (border, gwidth, gheight, 10, 0,
@@ -1254,10 +1460,10 @@ layout_layout (Lisp_Object image_instance,
   if (width < maxpw)
     /* The user wants a smaller space than the largest item, so we
        just provide default spacing and will let the output routines
-       clip.. */
-    horiz_spacing = WIDGET_BORDER_WIDTH * 2;
+       clip. */
+    horiz_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii));
   else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-          == LAYOUT_HORIZONTAL)
+          == LAYOUT_HORIZONTAL) 
     /* We have a larger area to display in so distribute the space
        evenly. */
     horiz_spacing = (width - (maxpw +
@@ -1267,18 +1473,30 @@ layout_layout (Lisp_Object image_instance,
     horiz_spacing = (width - maxpw) / 2
       - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
+  /* We are trying here to get widgets to line up when they are left
+     or right justified vertically. This means that we must position
+     widgets on logical unit boundaries, even though their height may
+     be greater or less than a logical unit. In order to avoid
+     clipping we need to determine how big the widget wants to be and
+     then allocate as many logical units as necessary in order to
+     accommodate it. */
   if (height < maxph)
-    vert_spacing = WIDGET_BORDER_HEIGHT * 2;
+    vert_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii)) * 2;
   else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
           == LAYOUT_VERTICAL)
-    vert_spacing = (height - (maxph + ph_adjust +
-                             IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
-      / (nitems + 1);
+    {
+      if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
+       vert_spacing = widget_spacing (IMAGE_INSTANCE_DOMAIN (ii)) * 2;
+      else
+       vert_spacing = (height - (maxph + ph_adjust +
+                                 IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2))
+         / (nitems + 1);
+    }
   else
     vert_spacing = (height - (maxph + ph_adjust)) / 2
       - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
-  y = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
+  y = yoffset = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
   x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
   /* Now flip through putting items where we want them, paying
@@ -1291,37 +1509,37 @@ layout_layout (Lisp_Object image_instance,
       glyph_query_geometry (glyph, &gwidth, &gheight,
                            IMAGE_DESIRED_GEOMETRY, image_instance);
 
-      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-         == LAYOUT_HORIZONTAL)
+      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
        {
-         if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
-             == LAYOUT_JUSTIFY_RIGHT)
+         if (IMAGE_INSTANCE_SUBWINDOW_BOTTOM_JUSTIFIED (ii))
            y = height - (gheight + vert_spacing);
-         if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
-             == LAYOUT_JUSTIFY_CENTER)
+         else if (IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
            y = (height - gheight) / 2;
        }
       else
        {
-         if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
-             == LAYOUT_JUSTIFY_RIGHT)
+         if (IMAGE_INSTANCE_SUBWINDOW_RIGHT_JUSTIFIED (ii))
            x = width - (gwidth + horiz_spacing);
-         if (IMAGE_INSTANCE_SUBWINDOW_JUSTIFY (ii)
-             == LAYOUT_JUSTIFY_CENTER)
+         else if (IMAGE_INSTANCE_SUBWINDOW_H_CENTERED (ii))
            x = (width - gwidth) / 2;
        }
 
       /* Now layout subwidgets if they require it. */
       glyph_do_layout (glyph, gwidth, gheight, x, y, image_instance);
 
-      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
-         == LAYOUT_HORIZONTAL)
+      if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) == LAYOUT_HORIZONTAL)
        {
          x += (gwidth + horiz_spacing);
        }
       else
        {
          y += (gheight + vert_spacing);
+         if (!IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (ii))
+           {
+             /* justified, vertical layout, try and align on logical unit
+                boundaries. */
+             y = ROUND_UP (y - yoffset, luh) + yoffset;
+           }
        }
 
     }
@@ -1386,6 +1604,67 @@ native_layout_layout (Lisp_Object image_instance,
   return 1;
 }
 
+DEFUN ("widget-logical-to-character-width", Fwidget_logical_to_character_width, 1, 3, 0, /*
+Convert the width in logical widget units to characters.
+Logical widget units do not take into account adjusments made for
+layout borders, so this adjusment is approximated.
+*/
+       (width, face, domain))
+{
+  int w, neww, charwidth;
+  int border_width = DEFAULT_WIDGET_BORDER_WIDTH;
+
+  if (NILP (domain))
+    domain = Fselected_frame (Qnil);
+
+  CHECK_INT (width);
+  w = XINT (width);
+  
+  if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain), widget_border_width))
+    border_width = DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
+
+  default_face_font_info (domain, 0, 0, 0, &charwidth, 0);
+  neww = ROUND_UP (charwidth * w + 4 * border_width + 2 * widget_spacing (domain), 
+               charwidth) / charwidth;
+  
+  return make_int (neww);
+}
+
+DEFUN ("widget-logical-to-character-height", Fwidget_logical_to_character_height, 1, 3, 0, /*
+Convert the height in logical widget units to characters.
+Logical widget units do not take into account adjusments made for
+layout borders, so this adjustment is approximated.
+
+If the components of a widget layout are justified to the top or the
+bottom then they are aligned in terms of `logical units'. This is a
+size quantity that is designed to be big enough to accomodate the
+largest `single height' widget. It is dependent on the widget face and
+some combination of spacing and border-width. Thus if you specify top
+or bottom justification in a vertical layout the subcontrols are laid
+out one per logical unit. This allows adjoining layouts to have
+identical alignment for their subcontrols.
+
+Since frame sizes are measured in characters, this function allows you
+to do appropriate conversion between logical units and characters.
+*/
+       (height, face, domain))
+{
+  int h, newh, charheight;
+  
+  CHECK_INT (height);
+  if (NILP (domain))
+    domain = Fselected_frame (Qnil);
+
+  h = XINT (height);
+
+  default_face_font_info (domain, 0, 0, &charheight, 0, 0);
+  newh = ROUND_UP (logical_unit_height (Fsymbol_name (Qwidget), 
+                                       Vwidget_face, domain) * h, charheight)
+    / charheight;
+
+  return make_int (newh);
+}
+
 \f
 /************************************************************************/
 /*                            initialization                            */
@@ -1399,6 +1678,9 @@ syms_of_glyphs_widget (void)
   DEFSYMBOL (Qbevel_in);
   DEFSYMBOL (Qbevel_out);
   DEFSYMBOL (Qmake_glyph);
+
+  DEFSUBR (Fwidget_logical_to_character_height);
+  DEFSUBR (Fwidget_logical_to_character_width);
 }
 
 #define VALID_GUI_KEYWORDS(type) do {                                        \
@@ -1462,6 +1744,7 @@ static void image_instantiator_edit_fields (void)
   IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget);
   IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget);
   IIFORMAT_HAS_SHARED_METHOD (edit_field, governing_domain, subwindow);
+  IIFORMAT_HAS_METHOD (edit_field, query_geometry);
   VALID_WIDGET_KEYWORDS (edit_field);
   VALID_GUI_KEYWORDS (edit_field);
 }
@@ -1559,6 +1842,8 @@ static void image_instantiator_labels (void)
   VALID_WIDGET_KEYWORDS (layout);                                         \
   IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation); \
   IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification);   \
+  IIFORMAT_VALID_KEYWORD (layout, Q_vertically_justify, check_valid_justification);   \
+  IIFORMAT_VALID_KEYWORD (layout, Q_horizontally_justify, check_valid_justification);   \
   IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border);          \
   IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int);       \
   IIFORMAT_VALID_KEYWORD (layout, Q_items,                                \
@@ -1627,3 +1912,15 @@ vars_of_glyphs_widget (void)
 {
   reinit_vars_of_glyphs_widget ();
 }
+
+
+void
+specifier_vars_of_glyphs_widget (void)
+{
+  DEFVAR_SPECIFIER ("widget-border-width",
+                   &Vwidget_border_width /*
+*Border width of widgets.
+This is a specifier; use `set-specifier' to change it.
+*/ );
+  Vwidget_border_width = Fmake_specifier (Qnatnum);
+}
index 5a71012..8c7b312 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) 1995 Tinker Systems
    Copyright (C) 1995, 1996 Ben Wing
    Copyright (C) 1995 Sun Microsystems
-   Copyright (C) 1999, 2000 Andy Piper
+   Copyright (C) 1999, 2000, 2002 Andy Piper
 
 This file is part of XEmacs.
 
@@ -158,6 +158,8 @@ update_tab_widget_face (widget_value* wv,
 #endif
 void
 emacs_Xt_handle_widget_losing_focus (struct frame* f, Widget losing_widget);
+void
+enqueue_focus_event (Widget wants_it, Lisp_Object frame, int in_p);
 
 #include "bitmaps.h"
 
@@ -2172,6 +2174,14 @@ x_map_subwindow (Lisp_Image_Instance *p, int x, int y,
                    -dga->xoffset, -dga->yoffset);
       if (!IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (p))
        XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
+      /* See comments in glyphs-msw.c about keyboard focus. */
+      if (IMAGE_INSTANCE_WANTS_INITIAL_FOCUS (p)) {
+       /* #### FIXME to pop-up the find dialog we map the text-field
+          seven times! This doesn't show on a fast linux box but does
+          under X on windows. */
+       enqueue_focus_event (IMAGE_INSTANCE_X_WIDGET_ID (p),
+                            IMAGE_INSTANCE_FRAME (p), 1);
+      }
     }
 }
 
@@ -2346,6 +2356,14 @@ x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win;
 }
 
+/* Account for some of the limitations with widget images. */
+static int
+x_widget_border_width (void)
+{
+  return DEFAULT_WIDGET_BORDER_WIDTH * 2;
+}
+
+
 #if 0
 /* #### Should this function exist? If there's any doubt I'm not implementing it --andyp */
 DEFUN ("change-subwindow-property", Fchange_subwindow_property, 3, 3, 0, /*
@@ -2508,6 +2526,10 @@ x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 
   free_widget_value_tree (clip_wv);
 
+  /* create a sensible name. */
+  if (wv->name == 0 || strcmp(wv->name, "") == 0)
+    wv->name = xstrdup (type);
+
   /* copy any args we were given */
   ac = 0;
   lw_add_value_args_to_args (wv, al, &ac);
@@ -2883,6 +2905,7 @@ console_type_create_glyphs_x (void)
   CONSOLE_HAS_METHOD (x, map_subwindow);
   CONSOLE_HAS_METHOD (x, redisplay_widget);
   CONSOLE_HAS_METHOD (x, redisplay_subwindow);
+  CONSOLE_HAS_METHOD (x, widget_border_width);
 }
 
 void
index 5903f1c..9ad7f3e 100644 (file)
@@ -97,8 +97,9 @@ enum image_instance_geometry
 #define IMAGE_UNSPECIFIED_GEOMETRY -1
 #define IMAGE_UNCHANGED_GEOMETRY -2
 
-#define WIDGET_BORDER_HEIGHT 4
-#define WIDGET_BORDER_WIDTH 4
+#define DEFAULT_WIDGET_BORDER_WIDTH 2
+#define DEFAULT_WIDGET_SPACING 3
+#define DEFAULT_WIDGET_SHADOW_WIDTH 2
 
 enum governing_domain
 {
@@ -587,7 +588,8 @@ struct Lisp_Image_Instance
       unsigned int v_resize : 1;       /* Whether the vsize is allowed to change. */
       unsigned int h_resize : 1;       /* Whether the hsize is allowed to change. */
       unsigned int orientation : 1; /* Vertical or horizontal. */
-      unsigned int justification : 2; /* Left, right or center. */
+      unsigned int h_justification : 2; /* left, right or center. */
+      unsigned int v_justification : 2; /* top, bottom or center. */
       /* Face for colors and font. We specify this here because we
         want people to be able to put :face in the instantiator
         spec. Using glyph-face is more inconvenient, although more
@@ -616,7 +618,9 @@ struct Lisp_Image_Instance
 #define LAYOUT_VERTICAL        1
 
 #define LAYOUT_JUSTIFY_LEFT 0
+#define LAYOUT_JUSTIFY_TOP 0
 #define LAYOUT_JUSTIFY_RIGHT 1
+#define LAYOUT_JUSTIFY_BOTTOM 1
 #define LAYOUT_JUSTIFY_CENTER 2
 
 #define IMAGE_INSTANCE_HASH_DEPTH 0
@@ -708,8 +712,26 @@ struct Lisp_Image_Instance
 ((i)->u.subwindow.h_resize)
 #define IMAGE_INSTANCE_SUBWINDOW_ORIENT(i) \
 ((i)->u.subwindow.orientation)
-#define IMAGE_INSTANCE_SUBWINDOW_JUSTIFY(i) \
-((i)->u.subwindow.justification)
+#define IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY(i) \
+((i)->u.subwindow.h_justification)
+#define IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY(i) \
+((i)->u.subwindow.v_justification)
+#define IMAGE_INSTANCE_SUBWINDOW_RIGHT_JUSTIFIED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY(i) == LAYOUT_JUSTIFY_RIGHT)
+#define IMAGE_INSTANCE_SUBWINDOW_LEFT_JUSTIFIED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY(i) == LAYOUT_JUSTIFY_LEFT)
+#define IMAGE_INSTANCE_SUBWINDOW_TOP_JUSTIFIED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY(i) == LAYOUT_JUSTIFY_TOP)
+#define IMAGE_INSTANCE_SUBWINDOW_BOTTOM_JUSTIFIED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY(i) == LAYOUT_JUSTIFY_BOTTOM)
+#define IMAGE_INSTANCE_SUBWINDOW_H_CENTERED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY(i) == LAYOUT_JUSTIFY_CENTER)
+#define IMAGE_INSTANCE_SUBWINDOW_V_CENTERED(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_V_JUSTIFY(i) == LAYOUT_JUSTIFY_CENTER)
+#define IMAGE_INSTANCE_SUBWINDOW_LOGICAL_LAYOUT(i) \
+ (IMAGE_INSTANCE_SUBWINDOW_ORIENT (i) \
+  == LAYOUT_VERTICAL && !IMAGE_INSTANCE_SUBWINDOW_V_CENTERED (i))
+
 #define IMAGE_INSTANCE_SUBWINDOW_FACE(i) \
 ((i)->u.subwindow.face)
 
@@ -1148,4 +1170,6 @@ struct expose_ignore
 int check_for_ignored_expose (struct frame* f, int x, int y, int width, int height);
 extern int hold_ignored_expose_registration;
 
+#define ROUND_UP(arg, unit) (((int)((arg) + (unit) - 1) / (int)(unit)) * (int)(unit))
+
 #endif /* INCLUDED_glyphs_h_ */
index 38bb287..a05b273 100644 (file)
@@ -1587,7 +1587,7 @@ XCHAR_OR_INT (Lisp_Object obj)
 #define C_READONLY(obj) (C_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
 #define LISP_READONLY(obj) (LISP_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
 
-/*----------------------------- structrures ----------------------------*/
+/*----------------------------- structures -----------------------------*/
 
 typedef struct structure_keyword_entry structure_keyword_entry;
 struct structure_keyword_entry
index eca204b..1663101 100644 (file)
@@ -737,7 +737,7 @@ unsafe_handle_wm_initmenupopup_1 (HMENU menu, struct frame *f)
 
   Lisp_Object path, desc;
   struct gcpro gcpro1;
-
+  
   /* Find which guy is going to explode */
   path = Fgethash (hmenu_to_lisp_object (menu), current_hash_table, Qunbound);
   assert (!UNBOUNDP (path));
index 7fe1295..3249218 100644 (file)
--- a/src/nas.c
+++ b/src/nas.c
  *      4/11/94, rjc    Added wait_for_sounds to be called when user wants to
  *                     be sure all play has finished.
  *      1998-10-01 rlt  Added support for WAVE files.
+ *      2002-10-16      Jon Trulson modifed this to work with NAS releases
+ *                      1.5f and higher.  We were using the private variable
+ *                      SoundFileInfo that doesn't exist anymore.  But preserve
+ *                      backward compatibility.  This will not work for some
+ *                      versions of NAS around 1.5b to 1.5f or so.  Known to
+ *                      work on 1.2p5 and 1.6.
  */
 
 #ifdef emacs
@@ -998,13 +1004,28 @@ SoundOpenDataForReading (unsigned char *data,
 
 {
   Sound s;
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+  SoundFileInfoProc toProc;
+#endif
 
   if (!(s = (Sound) malloc (sizeof (SoundRec))))
     return NULL;
 
   if ((s->formatInfo = SndOpenDataForReading ((char *) data, length)) != NULL)
     {
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+      if ((toProc = SoundFileGetProc(SoundFileFormatSnd, 
+                                    SoundFileInfoProcTo)) == NULL)
+       {
+         SndCloseFile ((SndInfo *) (s->formatInfo));
+         free (s);
+
+         return NULL;
+       }
+      if (!((*toProc)(s)))
+#else
       if (!((int(*)(Sound))(SoundFileInfo[SoundFileFormatSnd].toSound)) (s))
+#endif
        {
          SndCloseFile ((SndInfo *) (s->formatInfo));
          free (s);
@@ -1013,7 +1034,19 @@ SoundOpenDataForReading (unsigned char *data,
     }
   else if ((s->formatInfo = WaveOpenDataForReading ((char *) data, length)) != NULL)
     {
+#if (AudioLibraryVersionMajor >= 2 ) && (AudioLibraryVersionMinor >= 3)
+      if ((toProc = SoundFileGetProc(SoundFileFormatWave, 
+                                    SoundFileInfoProcTo)) == NULL)
+       {
+         WaveCloseFile ((WaveInfo *) (s->formatInfo));
+         free (s);
+
+         return NULL;
+       }
+      if (!((*toProc)(s)))
+#else
       if (!((int(*)(Sound))(SoundFileInfo[SoundFileFormatWave].toSound)) (s))
+#endif
        {
          WaveCloseFile ((WaveInfo *) (s->formatInfo));
          free (s);
index 00bb163..e7fcc3d 100644 (file)
@@ -914,6 +914,10 @@ unix_create_process (Lisp_Process *p,
        int xforkin = forkin;
        int xforkout = forkout;
 
+       /* Checking for quit in the child is bad because that will 
+          cause I/O, and that, in turn, can confuse the X connection. */
+       begin_dont_check_for_quit();
+
        /* Disconnect the current controlling terminal, pursuant to
           making the pty be the controlling terminal of the process.
           Also put us in our own process group. */
index da05446..442c3ff 100644 (file)
@@ -90,11 +90,18 @@ win32_readlink (const char * name, char * buf, int size)
   assert (*name);
   
   /* Sort of check we have a valid filename. */
-  if (strpbrk (name, "*?|<>\"") || strlen (name) >= MAX_PATH)
+  /* #### can we have escaped shell operators in a Windows filename? */
+  if (strpbrk (name, "|<>\"") || strlen (name) >= MAX_PATH)
     {
       errno = EIO;
       return -1;
     }
+  /* #### can we have escaped wildcards in a Windows filename? */
+  else if (strpbrk (name, "*?"))
+    {
+      errno = EINVAL;          /* this valid path can't be a symlink */
+      return -1;
+    }
   
   /* Find start of filename */
   lastname = name + strlen (name);
index 223a1a0..b19d74f 100644 (file)
@@ -2,7 +2,7 @@
    Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
    Copyright (C) 1995, 1996 Ben Wing.
    Copyright (C) 1996 Chuck Thompson.
-   Copyright (C) 1999 Andy Piper.
+   Copyright (C) 1999, 2002 Andy Piper.
 
 This file is part of XEmacs.
 
@@ -1353,17 +1353,22 @@ redisplay_output_layout (Lisp_Object domain,
          int edges = 0;
          enum edge_style style;
          int ypos = db->ypos;
+         int xpos = db->xpos;
          int height = dga->height;
+         int width = dga->width;
 
-         if (dga->xoffset >= 0)
+         /* The bevel_area routines always draw in from the specified
+            area so there is no need to adjust the displayed area to
+            make sure that the lines are visible. */
+         if (dga->xoffset >= 0) 
            edges |= EDGE_LEFT;
-         if (dga->width - dga->xoffset == layout_width)
+         if (dga->width - dga->xoffset == layout_width) 
            edges |= EDGE_RIGHT;
-         if (dga->yoffset >= 0)
+         if (dga->yoffset >= 0) 
            edges |= EDGE_TOP;
          if (dga->height - dga->yoffset == layout_height)
            edges |= EDGE_BOTTOM;
-
+         
          if (EQ (IMAGE_INSTANCE_LAYOUT_BORDER (p), Qetched_in))
            style = EDGE_ETCHED_IN;
          else if (EQ (IMAGE_INSTANCE_LAYOUT_BORDER (p), Qetched_out))
@@ -1383,9 +1388,8 @@ redisplay_output_layout (Lisp_Object domain,
            style = EDGE_BEVEL_OUT;
 
          MAYBE_DEVMETH (d, bevel_area,
-                        (w, findex, db->xpos,
-                         ypos,
-                         dga->width, height, 2, edges, style));
+                        (w, findex, xpos, ypos, width, height,
+                         DEFAULT_WIDGET_SHADOW_WIDTH, edges, style));
        }
     }
 
index c24f20f..e664075 100644 (file)
@@ -7603,7 +7603,7 @@ find_point_loop:
 
   while (1)
     {
-      unsigned int new_pos;
+      EMACS_INT new_pos;
       Bufpos start, end;
 
       pos = (bottom + top + 1) >> 1;
index 3ef8353..d70f7d6 100644 (file)
@@ -3649,7 +3649,7 @@ re_compile_fastmap (struct re_pattern_buffer *bufp)
          goto done;
 
 #ifdef emacs
-#if 0   /* Removed during syntax-table properties patch -- 2000/12/07 mct */
+#if 0  /* Removed during syntax-table properties patch -- 2000/12/07 mct */
         case syntaxspec:
          k = *p++;
 #endif
@@ -3692,7 +3692,7 @@ re_compile_fastmap (struct re_pattern_buffer *bufp)
          break;
 
 
-#if 0   /* Removed during syntax-table properties patch -- 2000/12/07 mct */
+#if 0  /* Removed during syntax-table properties patch -- 2000/12/07 mct */
        case notsyntaxspec:
          k = *p++;
 #endif
@@ -3752,7 +3752,7 @@ re_compile_fastmap (struct re_pattern_buffer *bufp)
        case at_dot:
        case after_dot:
           continue;
-#endif /* not emacs */
+#endif /* emacs */
 
 
         case no_op:
@@ -4716,16 +4716,24 @@ re_match_2_internal (struct re_pattern_buffer *bufp, re_char *string1,
                        = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
                     }
                }
-
-              /* If the regs structure we return has more elements than
-                 were in the pattern, set the extra elements to -1.  If
-                 we (re)allocated the registers, this is the case,
-                 because we always allocate enough to have at least one
-                 -1 at the end.  */
-              for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
-                regs->start[mcnt] = regs->end[mcnt] = -1;
            } /* regs && !bufp->no_sub */
 
+         /* If we have regs and the regs structure has more elements than
+             were in the pattern, set the extra elements to -1.  If we
+            (re)allocated the registers, this is the case, because we
+            always allocate enough to have at least one -1 at the end.
+
+            We do this even when no_sub is set because some applications
+             (XEmacs) reuse register structures which may contain stale
+            information, and permit attempts to access those registers.
+
+            It would be possible to require the caller to do this, but we'd
+            have to change the API for this function to reflect that, and
+            audit all callers. */
+         if (regs && regs->num_regs > 0)
+           for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
+             regs->start[mcnt] = regs->end[mcnt] = -1;
+
           DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
                         nfailure_points_pushed, nfailure_points_popped,
                         nfailure_points_pushed - nfailure_points_popped);
@@ -5711,7 +5719,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, re_char *string1,
 #endif
 
            emch = charptr_emchar ((const Bufbyte *) d);
-           matches = (SYNTAX_FROM_CACHE (regex_emacs_buffer->mirror_syntax_table,
+           matches = (SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
                        emch) == (enum syntaxcode) mcnt);
            INC_CHARPTR (d);
            if (matches != should_succeed)
index 8a496cb..7c5f447 100644 (file)
@@ -108,6 +108,7 @@ Lisp_Object Vforward_word_regexp, Vbackward_word_regexp;
 Lisp_Object Vskip_chars_range_table;
 
 static void set_search_regs (struct buffer *buf, Bufpos beg, Charcount len);
+static void clear_unused_search_regs (struct re_registers *regp, int no_sub);
 /* #### according to comment in 21.5, unnecessary */
 static void save_search_regs (void);
 static Bufpos simple_search (struct buffer *buf, Bufbyte *base_pat,
@@ -1173,10 +1174,11 @@ search_buffer (struct buffer *buf, Lisp_Object string, Bufpos bufpos,
   if (len == 0)
     {
       set_search_regs (buf, bufpos, 0);
+      clear_unused_search_regs (&search_regs, 0);
       return bufpos;
     }
 
-  /* Searching 0 times means don't move.  */
+  /* Searching 0 times means noop---don't move, don't touch registers.  */
   if (n == 0)
     return bufpos;
 
@@ -1223,6 +1225,8 @@ search_buffer (struct buffer *buf, Lisp_Object string, Bufpos bufpos,
                    search_regs.start[i] += j;
                    search_regs.end[i] += j;
                  }
+             /* re_match (called from re_search et al) does this for us */
+             /* clear_unused_search_regs (search_regs, bufp->no_sub);   */
              XSETBUFFER (last_thing_searched, buf);
              /* Set pos to the new position. */
              pos = search_regs.start[0];
@@ -1260,6 +1264,8 @@ search_buffer (struct buffer *buf, Lisp_Object string, Bufpos bufpos,
                    search_regs.start[i] += j;
                    search_regs.end[i] += j;
                  }
+             /* re_match (called from re_search et al) does this for us */
+             /* clear_unused_search_regs (search_regs, bufp->no_sub);   */
              XSETBUFFER (last_thing_searched, buf);
              /* Set pos to the new position. */
              pos = search_regs.end[0];
@@ -1460,6 +1466,7 @@ simple_search (struct buffer *buf, Bufbyte *base_pat, Bytecount len_byte,
          end = bytind_to_bufpos (buf, idx + buf_len);
        }
       set_search_regs (buf, beg, end - beg);
+      clear_unused_search_regs (&search_regs, 0);
 
       return retval;
     }
@@ -1821,6 +1828,7 @@ boyer_moore (struct buffer *buf, Bufbyte *base_pat, Bytecount len,
                    Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
 
                    set_search_regs (buf, bufstart, bufend - bufstart);
+                   clear_unused_search_regs (&search_regs, 0);
                  }
 
                  if ((n -= direction) != 0)
@@ -1910,6 +1918,7 @@ boyer_moore (struct buffer *buf, Bufbyte *base_pat, Bytecount len,
                    Bufpos bufend = bytind_to_bufpos (buf, bytstart + len);
 
                    set_search_regs (buf, bufstart, bufend - bufstart);
+                   clear_unused_search_regs (&search_regs, 0);
                  }
 
                  if ((n -= direction) != 0)
@@ -1929,8 +1938,8 @@ boyer_moore (struct buffer *buf, Bufbyte *base_pat, Bytecount len,
   return bytind_to_bufpos (buf, pos);
 }
 
-/* Record beginning BEG and end BEG + LEN
-   for a match just found in the current buffer.  */
+/* Record the whole-match data (beginning BEG and end BEG + LEN) and the
+   buffer for a match just found.  */
 
 static void
 set_search_regs (struct buffer *buf, Bufpos beg, Charcount len)
@@ -1950,6 +1959,24 @@ set_search_regs (struct buffer *buf, Bufpos beg, Charcount len)
   XSETBUFFER (last_thing_searched, buf);
 }
 
+/* Clear unused search registers so match data will be null.
+   REGP is a pointer to the register structure to clear, usually the global
+   search_regs.
+   NO_SUB is the number of subexpressions to allow for.  (Does not count
+   the whole match, ie, for a string search NO_SUB == 0.)
+   It is an error if NO_SUB > REGP.num_regs - 1. */
+
+static void
+clear_unused_search_regs (struct re_registers *regp, int no_sub)
+{
+  /* This function has been Mule-ized. */
+  int i;
+
+  assert (no_sub >= 0 && no_sub < regp->num_regs);
+  for (i = no_sub + 1; i < regp->num_regs; i++)
+    regp->start[i] = regp->end[i] = -1;
+}
+
 \f
 /* Given a string of words separated by word delimiters,
    compute a regexp that matches those exact words
index 8900507..e48f8d7 100644 (file)
@@ -388,6 +388,7 @@ void vars_of_gpmevent (void);
 /* Initialize specifier variables (dump-time only). */
 
 void specifier_vars_of_glyphs (void);
+void specifier_vars_of_glyphs_widget (void);
 void specifier_vars_of_gutter (void);
 void specifier_vars_of_menubar (void);
 void specifier_vars_of_redisplay (void);
index 3388e6d..42628c5 100644 (file)
@@ -104,7 +104,9 @@ struct lisp_parse_state
   Bufpos prevlevelstart;/* Char number of start of containing expression */
   Bufpos location;     /* Char number at which parsing stopped */
   int mindepth;                /* Minimum depth seen while scanning  */
-  Bufpos comstr_start; /* Position just after last comment/string starter  */
+  Bufpos comstr_start; /* Position just after last comment/string starter
+                          (if the 'syntax-table text property is not
+                          supported, used only for comment starts) */
   Lisp_Object levelstarts;     /* Char numbers of starts-of-expression
                                    of levels (starting from outermost).  */
 };
@@ -145,6 +147,7 @@ find_defun_start (struct buffer *buf, Bufpos pos)
   /* Back up to start of line.  */
   tem = find_next_newline (buf, pos, -1);
 
+  SCS_STATISTICS_SET_FUNCTION (scs_find_defun_start);
   SETUP_SYNTAX_CACHE (tem, 1);
   while (tem > BUF_BEGV (buf))
     {
@@ -254,84 +257,242 @@ struct syntax_cache syntax_cache;
    whatever is returned by get-char-property.
 
    It might be worth it at some point to merge provided syntax tables
-   outward to the current buffer. */
+   outward to the current buffer.
+
+   sjt sez:
+   This implementation has to rather inefficient, since it looks at
+   next-extent-change, and a heavily font-locked buffer will be rife
+   with irrelevant extents.  We could do a sledgehammer check on this
+   by looking at the distribution of extent lengths.  Also count up
+   cache hits and misses.
+
+   If we assume that syntax-table is a _text_ property (which also
+   deals with the issue of overlapping syntax-table properties), then
+   the following strategy recommends itself
+     o give the syntax cache a `valid' flag, to be reset whenever a
+       syntax-table property is added, changed, or removed; this could
+       be done by setting syntax_cache's prev_change > next_change
+       (but not compatible with using extents/markers here); if it's a
+       Lisp variable, doing it in Lisp shouldn't be too inefficient
+     o lazily initialize the cache whenever the object being examined
+       differs from the object the cache currently refers to
+     o by using {previous,next-single-property-change} we should be
+       able to get much bigger cache intervals (in most cases, the
+       whole buffer)
+     o cache markers instead of positions so the mere insertion or
+       deletion of text doesn't invalidate the cache, only if it
+       involves a syntax-table property (we could also cache the
+       extents carrying the syntax-table text-property; that gives us
+       another check for invalid cache).
+
+   If I understand this correctly, we need to invalidate the cache in the
+   following cases:
+     o If the referenced object changes (it's a global cache)
+     o If there are insertions or deletions of text (the positions are
+       absolute; fix: use markers or an extent instead?)
+     o If the syntax-table property is altered == added and different or
+       removed and the same (fix: probably computable from range overlap,
+       but is it worth it?  would interact with ins/del); this includes
+       detachment of extents with the same value (but only the boundary
+       extents, as otherwise the range coalesces across the deletion point)
+       and attachment of extents with a different value
+   Note: the above looks a lot like what Ben has implemented in 21.5, but
+   he goes one better by making the cache buffer-local.
+
+   Note: cperl mode uses the text property API, not extents/overlays.
+*/
+
+#ifdef SYNTAX_CACHE_STATISTICS
+struct syntax_cache_statistics scs_statistics =
+  { 0, 0, 0, 0, -1, -1, 0.0, 0.0, scs_no_function};
+
+char* syntax_cache_statistics_function_names[scs_number_of_functions] = {
+  "find_context",
+  "find_defun_start",
+  "scan_words",
+  "Fforward_comment",
+  "scan_lists",
+  "Fbackward_prefix_characters",
+  "scan_sexps_forward"
+};
+#endif /* SYNTAX_CACHE_STATISTICS */
 
 void
-update_syntax_cache (int pos, int count, int init)
+update_syntax_cache (int pos, int count)
 {
   Lisp_Object tmp_table;
 
-  if (init)
+#ifdef SYNTAX_CACHE_STATISTICS
+  if (scs_statistics.total_updates == 0)
     {
-      syntax_cache.prev_change = -1;
-      syntax_cache.next_change = -1;
+      int i;
+      for (i = 0; i < scs_number_of_functions; ++i)
+       scs_statistics.functions[i] = 0;
     }
-
-  if (pos > syntax_cache.prev_change &&
-      pos < syntax_cache.next_change)
+  if (syntax_cache.prev_change > syntax_cache.next_change)
+    scs_statistics.inits++;
+  else if (pos < syntax_cache.prev_change)
+    scs_statistics.misses_lo++;
+  else if (pos >= syntax_cache.next_change)
+    scs_statistics.misses_hi++;
+#endif /* SYNTAX_CACHE_STATISTICS */
+
+  /* #### Since font-lock undoes any narrowing, maybe the BUF_ZV and
+     BUF_BEGV below should be BUF_Z and BUF_BEG respectively? */
+  if (BUFFERP (syntax_cache.object))
     {
-      /* do nothing */
+      int get_change_before = pos + 1;
+
+      tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+                                     syntax_cache.object, Qnil);
+#if NEXT_SINGLE_PROPERTY_CHANGE
+      /* #### shouldn't we be using BUF_BEGV here? */
+      syntax_cache.next_change =
+       XINT (Fnext_single_property_change
+             (make_int (pos > 0 ? pos : 1), Qsyntax_table,
+              syntax_cache.object, make_int (BUF_ZV (syntax_cache.buffer))));
+#else
+      syntax_cache.next_change =
+       XINT (Fnext_extent_change (make_int (pos > 0 ? pos : 1),
+                                  syntax_cache.object));
+#endif
+
+      /* #### shouldn't we be using BUF_BEGV here? */
+      if (get_change_before < 1)
+       get_change_before = 1;
+      else if (get_change_before > BUF_ZV (syntax_cache.buffer))
+       get_change_before = BUF_ZV (syntax_cache.buffer);
+
+#if PREVIOUS_SINGLE_PROPERTY_CHANGE
+      /* #### shouldn't we be using BUF_BEGV here? */
+      syntax_cache.prev_change =
+       XINT (Fprevious_single_property_change
+             (make_int (get_change_before), Qsyntax_table,
+              syntax_cache.object, make_int(1)));
+#else
+      syntax_cache.prev_change =
+       XINT (Fprevious_extent_change (make_int (get_change_before),
+                                          syntax_cache.object));
+#endif
     }
-  else
+  else if (STRINGP (syntax_cache.object))
     {
-      if (NILP (syntax_cache.object) || EQ (syntax_cache.object, Qt))
-       {
-         int get_change_before = pos + 1;
-
-         tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
-                                         make_buffer (syntax_cache.buffer), Qnil);
-         syntax_cache.next_change =
-           XINT (Fnext_extent_change (make_int (pos > 0 ? pos : 1),
-                                      make_buffer (syntax_cache.buffer)));
-
-         if (get_change_before < 1)
-           get_change_before = 1;
-         else if (get_change_before > BUF_ZV (syntax_cache.buffer))
-           get_change_before = BUF_ZV (syntax_cache.buffer);
-
-         syntax_cache.prev_change =
-           XINT (Fprevious_extent_change (make_int (get_change_before),
-                                          make_buffer (syntax_cache.buffer)));
-       }
-      else
-       {
-         int get_change_before = pos + 1;
+      int get_change_before = pos + 1;
+
+      tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+                                     syntax_cache.object, Qnil);
+#if NEXT_SINGLE_PROPERTY_CHANGE
+      /* #### shouldn't we be using BUF_BEGV here? */
+      syntax_cache.next_change =
+       XINT (Fnext_single_property_change
+             (make_int (pos >= 0 ? pos : 0), Qsyntax_table,
+              syntax_cache.object,
+              make_int(XSTRING_LENGTH(syntax_cache.object))));
+#else
+      syntax_cache.next_change =
+       XINT (Fnext_extent_change (make_int (pos >= 0 ? pos : 0),
+                                  syntax_cache.object));
+#endif
 
-         tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
-                                         syntax_cache.object, Qnil);
-         syntax_cache.next_change =
-           XINT (Fnext_extent_change (make_int (pos >= 0 ? pos : 0),
+      if (get_change_before < 0)
+       get_change_before = 0;
+      else if (get_change_before > XSTRING_LENGTH(syntax_cache.object))
+       get_change_before = XSTRING_LENGTH(syntax_cache.object);
+
+#if PREVIOUS_SINGLE_PROPERTY_CHANGE
+      syntax_cache.prev_change =
+       XINT (Fprevious_single_property_change
+             (make_int (get_change_before), Qsyntax_table,
+              syntax_cache.object, make_int(0)));
+#else
+      syntax_cache.prev_change =
+       XINT (Fprevious_extent_change (make_int (get_change_before),
                                       syntax_cache.object));
+#endif
+    }
+  else
+    {
+      tmp_table = Qnil;        /* silence compiler */
+      /* Always aborts.  #### Is there another sensible thing to do here? */
+      assert (BUFFERP (syntax_cache.object) || STRINGP (syntax_cache.object));
+    }
 
-         if (get_change_before < 0)
-           get_change_before = 0;
-         else if (get_change_before > XSTRING_LENGTH(syntax_cache.object))
-           get_change_before = XSTRING_LENGTH(syntax_cache.object);
+  if (EQ (Fsyntax_table_p (tmp_table), Qt))
+    {
+      syntax_cache.use_code = 0;
+      syntax_cache.current_syntax_table =
+       XCHAR_TABLE (tmp_table)->mirror_table;
+    } 
+  else if (CONSP (tmp_table) && INTP (XCAR (tmp_table)))
+    {
+      syntax_cache.use_code = 1;
+      syntax_cache.syntax_code = XINT (XCAR(tmp_table));
+    }
+  else 
+    {
+      syntax_cache.use_code = 0;
+      syntax_cache.current_syntax_table =
+       syntax_cache.buffer->mirror_syntax_table;
+    }
 
-         syntax_cache.prev_change =
-           XINT (Fprevious_extent_change (make_int (pos >= 0 ? pos : 0),
-                                          syntax_cache.object));
-       }
+#ifdef SYNTAX_CACHE_STATISTICS
+  {
+    int length = syntax_cache.next_change - syntax_cache.prev_change;
+    int misses = scs_statistics.misses_lo +
+      scs_statistics.misses_hi + scs_statistics.inits;
+      
+    if (scs_statistics.min_length == -1 || scs_statistics.min_length > length)
+      scs_statistics.min_length = length;
+    if (scs_statistics.max_length == -1 || scs_statistics.max_length < length)
+         scs_statistics.max_length = length;
+    scs_statistics.mean_length_on_miss =
+      ((misses - 1) * scs_statistics.mean_length_on_miss + length) / misses;
+  }
+
+  scs_statistics.mean_length
+    = scs_statistics.total_updates*scs_statistics.mean_length
+      + syntax_cache.next_change - syntax_cache.prev_change;
+  scs_statistics.total_updates++;
+  scs_statistics.mean_length /= scs_statistics.total_updates;
+
+  if (scs_statistics.this_function != scs_no_function)
+    {
+      scs_statistics.functions[scs_statistics.this_function]++;
+      scs_statistics.this_function = scs_no_function;
+    }
 
-      if (EQ (Fsyntax_table_p (tmp_table), Qt))
-       {
-         syntax_cache.use_code = 0;
-         syntax_cache.current_syntax_table =
-           XCHAR_TABLE (tmp_table)->mirror_table;
-       } 
-      else if (CONSP (tmp_table) && INTP (XCAR (tmp_table)))
-       {
-         syntax_cache.use_code = 1;
-         syntax_cache.syntax_code = XINT (XCAR(tmp_table));
-       }
-      else 
-       {
-         syntax_cache.use_code = 0;
-         syntax_cache.current_syntax_table =
-           syntax_cache.buffer->mirror_syntax_table;
-       }
+  if (!(scs_statistics.total_updates % SYNTAX_CACHE_STATISTICS_REPORT_INTERVAL))
+    {
+      fprintf (stderr, "Syntax cache stats:\n  ");
+      fprintf (stderr, "updates %d, inits %d, misses low %d, misses high %d,",
+              scs_statistics.total_updates, scs_statistics.inits,
+              scs_statistics.misses_lo, scs_statistics.misses_hi);
+      fprintf (stderr, "\n ");
+
+#define REPORT_FUNCTION(i)                             \
+  fprintf (stderr, " %s %d,",                          \
+          syntax_cache_statistics_function_names[i],   \
+          scs_statistics.functions[i]);
+
+      REPORT_FUNCTION(scs_find_context);
+      REPORT_FUNCTION(scs_find_defun_start);
+      REPORT_FUNCTION(scs_scan_words);
+      REPORT_FUNCTION(scs_Fforward_comment);
+      fprintf (stderr, "\n ");
+      REPORT_FUNCTION(scs_scan_lists);
+      REPORT_FUNCTION(scs_Fbackward_prefix_characters);
+      REPORT_FUNCTION(scs_scan_sexps_forward);
+#undef REPORT_FUNCTION
+
+      fprintf (stderr, "\n  min length %d, max length %d,",
+              scs_statistics.min_length, scs_statistics.max_length);
+      fprintf (stderr, "\n  mean length %.1f, mean length on miss %.1f\n",
+              scs_statistics.mean_length,
+              scs_statistics.mean_length_on_miss);
     }
+#endif /* SYNTAX_CACHE_STATISTICS */
 }
+
 \f
 /* Convert a letter which signifies a syntax code
    into the code it signifies.
@@ -464,6 +625,7 @@ scan_words (struct buffer *buf, Bufpos from, int count)
   Emchar ch0, ch1;
   enum syntaxcode code;
 
+  SCS_STATISTICS_SET_FUNCTION (scs_scan_words);
   SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, from, count);
 
   /* #### is it really worth it to hand expand both cases? JV */
@@ -643,23 +805,23 @@ find_start_of_comment (struct buffer *buf, Bufpos from, Bufpos stop,
       UPDATE_SYNTAX_CACHE_BACKWARD (from);
 
       c = BUF_FETCH_CHAR (buf, from);
-      code = SYNTAX_FROM_CACHE (mirrortab, c);
       syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+      code = SYNTAX_FROM_CODE (syncode);
 
       /* is this a 1-char comment end sequence? if so, try
         to see if style matches previously extracted mask */
       if (code == Sendcomment)
        {
-         styles_match_p =
-           SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode) & mask;
+         /* MT had SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode) & mask
+            but (as a Boolean) that's just a complicated way to write: */
+         styles_match_p = SYNTAX_CODE_MATCHES_1CHAR_P (syncode, mask);
        }
 
       /* or are we looking at a 1-char comment start sequence
         of the style matching mask? */
       else if (code == Scomment)
        {
-         styles_match_p =
-           SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode) & mask;
+         styles_match_p = SYNTAX_CODE_MATCHES_1CHAR_P (syncode, mask);
        }
 
       /* otherwise, is this a 2-char comment end or start sequence? */
@@ -672,14 +834,14 @@ find_start_of_comment (struct buffer *buf, Bufpos from, Bufpos stop,
                int prev_syncode;
                UPDATE_SYNTAX_CACHE_BACKWARD (from - 1);
                prev_syncode =
-                 SYNTAX_CODE_FROM_CACHE (mirrortab, BUF_FETCH_CHAR (buf, from - 1));
+                 SYNTAX_CODE_FROM_CACHE (mirrortab,
+                                         BUF_FETCH_CHAR (buf, from - 1));
 
                if (SYNTAX_CODES_END_P (prev_syncode, syncode))
                  {
                    code = Sendcomment;
                    styles_match_p =
-                     SYNTAX_CODES_COMMENT_MASK_END (prev_syncode, syncode)
-                     & mask;
+                     SYNTAX_CODES_MATCH_END_P (prev_syncode, syncode, mask);
                    from--;
                    UPDATE_SYNTAX_CACHE_BACKWARD (from);
                    c = BUF_FETCH_CHAR (buf, from);
@@ -696,14 +858,14 @@ find_start_of_comment (struct buffer *buf, Bufpos from, Bufpos stop,
                int prev_syncode;
                UPDATE_SYNTAX_CACHE_BACKWARD (from - 1);
                prev_syncode =
-                 SYNTAX_CODE_FROM_CACHE (mirrortab, BUF_FETCH_CHAR (buf, from - 1));
+                 SYNTAX_CODE_FROM_CACHE (mirrortab,
+                                         BUF_FETCH_CHAR (buf, from - 1));
 
                if (SYNTAX_CODES_START_P (prev_syncode, syncode))
                  {
                    code = Scomment;
                    styles_match_p =
-                     SYNTAX_CODES_COMMENT_MASK_START (prev_syncode, syncode)
-                     & mask;
+                     SYNTAX_CODES_MATCH_START_P (prev_syncode, syncode, mask);
                    from--;
                    UPDATE_SYNTAX_CACHE_BACKWARD (from);
                    c = BUF_FETCH_CHAR (buf, from);
@@ -794,7 +956,8 @@ static Bufpos
 find_end_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int comstyle)
 {
   int c;
-  int prev_code;
+  int syncode;
+  enum syntaxcode code, next_code;
   /* mask to match comment styles against; for ST_COMMENT_STYLE, this
      will get set to SYNTAX_COMMENT_STYLE_B, but never get checked */
   int mask = comstyle ? SYNTAX_COMMENT_STYLE_B : SYNTAX_COMMENT_STYLE_A;
@@ -810,47 +973,32 @@ find_end_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int comstyle)
 
       UPDATE_SYNTAX_CACHE_FORWARD (from);
       c = BUF_FETCH_CHAR (buf, from);
+      syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+      code = SYNTAX_FROM_CODE (syncode);
 
-      /* Test for generic comments */
+      from++;
+      UPDATE_SYNTAX_CACHE_FORWARD (from);
+
+      /* At end of current generic comment? */
       if (comstyle == ST_COMMENT_STYLE)
        {
-         if (SYNTAX_FROM_CACHE (mirrortab, c) == Scomment_fence)
-           {
-             from++;
-             UPDATE_SYNTAX_CACHE_FORWARD (from);
-             break;
-           }
-         from++;
-         continue; /* No need to test other comment styles in a
-                       generic comment */
+         if (code == Scomment_fence)
+           break;              /* matched */
+         else
+           continue;           /* Ignore other styles in generic comments */
        }
-      else
-
-       if (SYNTAX_FROM_CACHE (mirrortab, c) == Sendcomment
-           && SYNTAX_CODE_MATCHES_1CHAR_P
-           (SYNTAX_CODE_FROM_CACHE (mirrortab, c), mask))
-       /* we have encountered a comment end of the same style
-          as the comment sequence which began this comment
-          section */
+      /* At end of current one-character comment of specified style? */
+      else if (code == Sendcomment &&
+              SYNTAX_CODE_MATCHES_1CHAR_P (syncode, mask))
          {
-           from++;
-           UPDATE_SYNTAX_CACHE_FORWARD (from);
+           /* pre-MT code effectively does from-- here, that seems wrong */
            break;
          }
 
-      prev_code = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
-      from++;
-      UPDATE_SYNTAX_CACHE_FORWARD (from);
-      if (from < stop
-         && SYNTAX_CODES_MATCH_END_P
-         (prev_code,
-          SYNTAX_CODE_FROM_CACHE (mirrortab, BUF_FETCH_CHAR (buf, from)),
-          mask)
-
-         )
-       /* we have encountered a comment end of the same style
-          as the comment sequence which began this comment
-          section */
+      /* At end of current two-character comment of specified style? */
+      c = BUF_FETCH_CHAR (buf, from);
+      next_code = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+      if (from < stop && SYNTAX_CODES_MATCH_END_P (syncode, next_code, mask))
        {
          from++;
          UPDATE_SYNTAX_CACHE_FORWARD (from);
@@ -897,6 +1045,7 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
 
   from = BUF_PT (buf);
 
+  SCS_STATISTICS_SET_FUNCTION (scs_Fforward_comment);
   SETUP_SYNTAX_CACHE (from, n);
   while (n > 0)
     {
@@ -905,7 +1054,8 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
       stop = BUF_ZV (buf);
       while (from < stop)
        {
-         int comstyle = 0;     /* mask for finding matching comment style */
+         int comstyle = 0;     /* Code for comment style: 0 for A, 1 for B,
+                                  or ST_COMMENT_STYLE */
 
          if (char_quoted (buf, from))
            {
@@ -915,8 +1065,8 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
 
          UPDATE_SYNTAX_CACHE_FORWARD (from);
          c = BUF_FETCH_CHAR (buf, from);
-         code = SYNTAX_FROM_CACHE (mirrortab, c);
          syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+         code = SYNTAX_FROM_CODE (syncode);
 
          if (code == Scomment)
            {
@@ -925,7 +1075,8 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
                 we must record the comment style this character begins
                 so that later, only a comment end of the same style actually
                 ends the comment section */
-             comstyle = SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode)
+             comstyle =
+               SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode)
                == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
            }
 
@@ -936,8 +1087,7 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
              comstyle = ST_COMMENT_STYLE;
            }
 
-         else if (from < stop
-                  && SYNTAX_CODE_START_FIRST_P (syncode))
+         else if (from < stop && SYNTAX_CODE_START_FIRST_P (syncode))
            {
              int next_syncode;
              UPDATE_SYNTAX_CACHE_FORWARD (from + 1);
@@ -995,7 +1145,8 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
       stop = BUF_BEGV (buf);
       while (from > stop)
        {
-          int comstyle = 0;     /* mask for finding matching comment style */
+          int comstyle = 0;     /* Code for comment style: 0 for A, 1 for B,
+                                  or ST_COMMENT_STYLE */
 
          from--;
          if (char_quoted (buf, from))
@@ -1005,15 +1156,16 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
            }
 
          c = BUF_FETCH_CHAR (buf, from);
-         code = SYNTAX_FROM_CACHE (mirrortab, c);
          syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+         code = SYNTAX_FROM_CODE (syncode);
 
          if (code == Sendcomment)
            {
              /* we have found a single char end comment. we must record
                 the comment style encountered so that later, we can match
                 only the proper comment begin sequence of the same style */
-             comstyle = SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode)
+             comstyle =
+               SYNTAX_CODE_COMMENT_1CHAR_MASK (syncode)
                == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
            }
 
@@ -1024,6 +1176,8 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
            }
 
          else if (from > stop
+                  /* #### This seems logical but it's not in 21.4.9 */
+                  /* && !char_quoted (buf, from - 1) */
                   && SYNTAX_CODE_END_SECOND_P (syncode))
            {
              int prev_syncode;
@@ -1037,8 +1191,9 @@ COUNT defaults to 1, and BUFFER defaults to the current buffer.
                     later, we can match only the proper comment begin
                     sequence of the same style.  */
                  code = Sendcomment;
-                 comstyle = SYNTAX_CODES_COMMENT_MASK_END
-                   (prev_syncode, syncode) == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
+                 comstyle =
+                   SYNTAX_CODES_COMMENT_MASK_END (prev_syncode, syncode)
+                   == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
                  from--;
                }
            }
@@ -1080,6 +1235,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
 
   if (depth > 0) min_depth = 0;
 
+  SCS_STATISTICS_SET_FUNCTION (scs_scan_lists);
   SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, from, count);
   while (count > 0)
     {
@@ -1089,11 +1245,12 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
       while (from < stop)
        {
           int comstyle = 0;     /* mask for finding matching comment style */
+         Emchar stringterm = '\0'; /* Used by Sstring case in switch */
 
          UPDATE_SYNTAX_CACHE_FORWARD (from);
          c = BUF_FETCH_CHAR (buf, from);
-         code = SYNTAX_FROM_CACHE (mirrortab, c);
          syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+         code = SYNTAX_FROM_CODE (syncode);
          from++;
 
          /* a 1-char comment start sequence */
@@ -1115,16 +1272,17 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
 
              if (SYNTAX_CODES_START_P (syncode, next_syncode))
                {
-             /* we have encountered a comment start sequence and we
-                are ignoring all text inside comments. we must record
-                the comment style this sequence begins so that later,
-                only a comment end of the same style actually ends
-                the comment section */
-             code = Scomment;
-                 comstyle = SYNTAX_CODES_COMMENT_MASK_START
-                   (syncode, next_syncode) == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
-             from++;
-           }
+                 /* we have encountered a comment start sequence and we
+                    are ignoring all text inside comments. we must record
+                    the comment style this sequence begins so that later,
+                    only a comment end of the same style actually ends
+                    the comment section */
+                 code = Scomment;
+                 comstyle =
+                   SYNTAX_CODES_COMMENT_MASK_START (syncode, next_syncode)
+                   == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
+                 from++;
+               }
            }
          UPDATE_SYNTAX_CACHE_FORWARD (from);
 
@@ -1166,6 +1324,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
 
            case Scomment_fence:
              comstyle = ST_COMMENT_STYLE;
+             /* falls through! */
            case Scomment:
              if (!parse_sexp_ignore_comments)
                break;
@@ -1212,52 +1371,45 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
              }
            break;
 
-           case Sstring_fence:
            case Sstring:
-              {
-               Emchar stringterm;
-
-               if (code != Sstring_fence)
-                 {
+             {
                /* XEmacs change: call syntax_match on character */
-                Emchar ch = BUF_FETCH_CHAR (buf, from - 1);
-                   Lisp_Object stermobj =
-                     syntax_match (syntax_cache.current_syntax_table, ch);
+               Emchar ch = BUF_FETCH_CHAR (buf, from - 1);
+               Lisp_Object stermobj =
+                 syntax_match (syntax_cache.current_syntax_table, ch);
 
                if (CHARP (stermobj))
                  stringterm = XCHAR (stermobj);
                else
                  stringterm = ch;
-                 }
-               else
-                 stringterm = '\0'; /* avoid compiler warnings */
+             }
+             /* falls through! */
+           case Sstring_fence:
+             while (1)
+               {
+                 if (from >= stop)
+                   goto lose;
+                 UPDATE_SYNTAX_CACHE_FORWARD (from);
+                 c = BUF_FETCH_CHAR (buf, from);
+                 if (code == Sstring
+                     ? c == stringterm
+                     : SYNTAX_FROM_CACHE (mirrortab, c) == Sstring_fence)
+                   break;
 
-                while (1)
-                 {
-                   if (from >= stop)
-                     goto lose;
-                   UPDATE_SYNTAX_CACHE_FORWARD (from);
-                   c = BUF_FETCH_CHAR (buf, from);
-                   if (code == Sstring
-                       ? c == stringterm
-                       : SYNTAX_FROM_CACHE (mirrortab, c) == Sstring_fence)
+                 switch (SYNTAX_FROM_CACHE (mirrortab, c))
+                   {
+                   case Scharquote:
+                   case Sescape:
+                     from++;
                      break;
-
-                   switch (SYNTAX_FROM_CACHE (mirrortab, c))
-                     {
-                     case Scharquote:
-                     case Sescape:
-                       from++;
-                       break;
-                     default:
-                       break;
-                     }
-                   from++;
-                 }
-                from++;
-                if (!depth && sexpflag) goto done;
-                break;
-              }
+                   default:
+                     break;
+                   }
+                 from++;
+               }
+             from++;
+             if (!depth && sexpflag) goto done;
+             break;
 
             default:
               break;
@@ -1283,6 +1435,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
       while (from > stop)
        {
           int comstyle = 0;     /* mask for finding matching comment style */
+         Emchar stringterm = '\0'; /* used by case Sstring in switch below */
 
          from--;
          UPDATE_SYNTAX_CACHE_BACKWARD (from);
@@ -1294,8 +1447,8 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
            }
 
          c = BUF_FETCH_CHAR (buf, from);
-         code = SYNTAX_FROM_CACHE (mirrortab, c);
          syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+         code = SYNTAX_FROM_CODE (syncode);
 
          if (code == Sendcomment && parse_sexp_ignore_comments)
            {
@@ -1318,14 +1471,15 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
 
              if (SYNTAX_CODES_END_P (prev_syncode, syncode))
                {
-             /* we must record the comment style encountered so that
-                later, we can match only the proper comment begin
-                sequence of the same style */
-             code = Sendcomment;
-                 comstyle = SYNTAX_CODES_COMMENT_MASK_END
-                   (prev_syncode, syncode) == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
-             from--;
-           }
+                 /* we must record the comment style encountered so that
+                    later, we can match only the proper comment begin
+                    sequence of the same style */
+                 code = Sendcomment;
+                 comstyle =
+                   SYNTAX_CODES_COMMENT_MASK_END (prev_syncode, syncode)
+                   == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
+                 from--;
+               }
            }
 
          if (SYNTAX_CODE_PREFIX (syncode))
@@ -1340,6 +1494,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
                 passing it. */
              while (from > stop)
                {
+                 /* enum syntaxcode syncode; */
                  UPDATE_SYNTAX_CACHE_BACKWARD (from);
                  quoted = char_quoted (buf, from - 1);
 
@@ -1386,52 +1541,45 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
 
            case Scomment_fence:
              comstyle = ST_COMMENT_STYLE;
+             /* falls through! */
            case Sendcomment:
              if (parse_sexp_ignore_comments)
                from = find_start_of_comment (buf, from, stop, comstyle);
              break;
 
-           case Sstring_fence:
            case Sstring:
               {
-               Emchar stringterm;
-
-               if (code != Sstring_fence)
-                 {
                /* XEmacs change: call syntax_match() on character */
                 Emchar ch = BUF_FETCH_CHAR (buf, from);
-                   Lisp_Object stermobj =
-                     syntax_match (syntax_cache.current_syntax_table, ch);
-
+               Lisp_Object stermobj =
+                 syntax_match (syntax_cache.current_syntax_table, ch);
                if (CHARP (stermobj))
                  stringterm = XCHAR (stermobj);
                else
                  stringterm = ch;
-                 }
-               else
-                 stringterm = '\0'; /* avoid compiler warnings */
-
-                while (1)
-                 {
-                   if (from == stop) goto lose;
-
-                   UPDATE_SYNTAX_CACHE_BACKWARD (from - 1);
-                   c = BUF_FETCH_CHAR (buf, from - 1);
+             }
 
-                   if ((code == Sstring
-                       ? c == stringterm
-                        : SYNTAX_FROM_CACHE (mirrortab, c) == Sstring_fence)
-                       && !char_quoted (buf, from - 1))
-                     {
+             /* falls through! */
+           case Sstring_fence:
+             while (1)
+               {
+                 if (from == stop) goto lose;
+
+                 UPDATE_SYNTAX_CACHE_BACKWARD (from - 1);
+                 c = BUF_FETCH_CHAR (buf, from - 1);
+                 if ((code == Sstring
+                      ? c == stringterm
+                      : SYNTAX_FROM_CACHE (mirrortab, c) == Sstring_fence)
+                     && !char_quoted (buf, from - 1))
+                   {
                      break;
-                     }
+                   }
 
-                   from--;
-                 }
-                from--;
-                if (!depth && sexpflag) goto done2;
-                break;
-              }
+                 from--;
+               }
+             from--;
+             if (!depth && sexpflag) goto done2;
+             break;
             }
        }
 
@@ -1555,11 +1703,13 @@ Optional arg BUFFER defaults to the current buffer.
   Emchar c = '\0'; /* initialize to avoid compiler warnings */
 
 
+  SCS_STATISTICS_SET_FUNCTION (scs_Fbackward_prefix_characters);
   SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, pos, -1);
 
   while (pos > beg && !char_quoted (buf, pos - 1)
         /* Previous statement updates syntax table.  */
         && (SYNTAX_FROM_CACHE (mirrortab, c = BUF_FETCH_CHAR (buf, pos - 1)) == Squote
+            /* equivalent to SYNTAX_PREFIX (mirrortab, c) */
             || SYNTAX_CODE_PREFIX (SYNTAX_CODE_FROM_CACHE (mirrortab, c))))
     pos--;
 
@@ -1572,7 +1722,8 @@ Optional arg BUFFER defaults to the current buffer.
    assuming that FROM has state OLDSTATE (nil means FROM is start of function),
    and return a description of the state of the parse at END.
    If STOPBEFORE is nonzero, stop at the start of an atom.
-   If COMMENTSTOP is nonzero, stop at the start of a comment.  */
+   If COMMENTSTOP is 1, stop at the start of a comment; if it is -1,
+     stop at the start of a comment or a string */
 
 static void
 scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
@@ -1596,6 +1747,7 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
   int boundary_stop = commentstop == -1;
   Lisp_Object tem;
 
+  SCS_STATISTICS_SET_FUNCTION (scs_scan_sexps_forward);
   SETUP_SYNTAX_CACHE (from, 1);
   if (NILP (oldstate))
     {
@@ -1634,6 +1786,8 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
         we are in a generic comment */
       oldstate = Fcdr (oldstate);
       oldstate = Fcdr (oldstate);
+      /* The code below was changed radically for syntax-table properties.
+         A reasonable place to look if a bug manifests. */
       tem = Fcar (oldstate);    /* elt 7, comment style a/b/fence */
       state.comstyle = NILP (tem) ? 0 : ( EQ (tem, Qsyntax_table)
                                          ? ST_COMMENT_STYLE : 1 );
@@ -1657,6 +1811,7 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
          curlevel->last = -1;
          tem = Fcdr (tem);
        }
+      /* end radical change section */
     }
   state.quoted = 0;
   mindepth = depth;
@@ -1683,8 +1838,8 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
 
       UPDATE_SYNTAX_CACHE_FORWARD (from);
       c = BUF_FETCH_CHAR (buf, from);
-      code = SYNTAX_FROM_CACHE (mirrortab, c);
       syncode = SYNTAX_CODE_FROM_CACHE (mirrortab, c);
+      code = SYNTAX_FROM_CODE (syncode);
       from++;
 
          /* record the comment style we have entered so that only the
@@ -1715,12 +1870,13 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
            SYNTAX_CODE_FROM_CACHE (mirrortab, BUF_FETCH_CHAR (buf, from));
 
          if (SYNTAX_CODES_START_P (syncode, next_syncode))
-       {
-         code = Scomment;
-             state.comstyle = SYNTAX_CODES_COMMENT_MASK_START
-               (syncode, next_syncode) == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
+           {
+             code = Scomment;
+             state.comstyle =
+               SYNTAX_CODES_COMMENT_MASK_START (syncode, next_syncode)
+               == SYNTAX_COMMENT_STYLE_A ? 0 : 1;
              state.comstr_start = from - 1;
-         from++;
+             from++;
              UPDATE_SYNTAX_CACHE_FORWARD (from);
            }
        }
@@ -1830,7 +1986,7 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
                state.instring = XCHAR (stermobj);
              else
                state.instring = ch;
-          }
+           }
          if (boundary_stop) goto done;
        startinstring:
          while (1)
@@ -2106,13 +2262,14 @@ Non-nil means `forward-sexp', etc., should treat comments as whitespace.
   parse_sexp_ignore_comments = 0;
 
   DEFVAR_BOOL ("lookup-syntax-properties", &lookup_syntax_properties /*
-Non-nil means `forward-sexp', etc., grant `syntax-table' property.
+Non-nil means `forward-sexp', etc., look up character syntax in the
+table that is the value of the `syntax-table' text property, if non-nil.
 The value of this property should be either a syntax table, or a cons
 of the form (SYNTAXCODE . MATCHCHAR), SYNTAXCODE being the numeric
 syntax code, MATCHCHAR being nil or the character to match (which is
 relevant only for open/close type.
 */ );
-  lookup_syntax_properties = 1;
+  lookup_syntax_properties = 0;        /* #### default off until optimized */
 
   DEFVAR_BOOL ("words-include-escapes", &words_include_escapes /*
 Non-nil means `forward-word', etc., should treat escape chars part of words.
index 75ac2c3..8ea4fcb 100644 (file)
@@ -151,10 +151,33 @@ WORD_SYNTAX_P (Lisp_Char_Table *table, Emchar c)
   6. first of a one or two character comment-end sequence of style b.
   7. second of a two-character comment-end sequence of style a.
   8. second of a two-character comment-end sequence of style b.
+
+From the internals manual:
+
+Syntax codes are implemented as bitfields in an int.  Bits 0-6 contain
+the syntax code itself, bit 7 is a special prefix flag used for Lisp,
+and bits 16-23 contain comment syntax flags.  From the Lisp programmer's
+point of view, there are 11 flags: 2 styles X 2 characters X @{start,
+end@} flags for two-character comment delimiters, 2 style flags for
+one-character comment delimiters, and the prefix flag.
+
+Internally, however, the characters used in multi-character delimiters
+will have non-comment-character syntax classes (@emph{e.g.}, the
+@samp{/} in C's @samp{/}@samp{*} comment-start delimiter has ``punctuation''
+\(here meaning ``operator-like'') class in C modes).  Thus in a mixed
+comment style, such as C++'s @samp{//} to end of line, is represented by
+giving @samp{/} the ``punctuation'' class and the ``style b first
+character of start sequence'' and ``style b second character of start
+sequence'' flags.  The fact that class is @emph{not} punctuation allows
+the syntax scanner to recognize that this is a multi-character
+delimiter.  The @samp{newline} character is given (single-character)
+``comment-end'' @emph{class} and the ``style b first character of end
+sequence'' @emph{flag}.  The ``comment-end'' class allows the scanner to
+determine that no second character is needed to terminate the comment.
  */
 
-#define SYNTAX_COMMENT_BITS(table, c) \
-  ((SYNTAX_CODE (table, c) >> 16) &0xff)
+#define SYNTAX_COMMENT_BITS(c) \
+  ((SYNTAX_CODE (mirrortab, c) >> 16) &0xff)
 
 #define SYNTAX_FIRST_OF_START_A  0x80
 #define SYNTAX_FIRST_OF_START_B  0x40
@@ -178,57 +201,57 @@ WORD_SYNTAX_P (Lisp_Char_Table *table, Emchar c)
 /* #### These are now more or less equivalent to
    SYNTAX_COMMENT_MATCH_START ...*/
 /* a and b must be first and second start chars for a common type */
-#define SYNTAX_START_P(table, a, b)                                     \
-  (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START) >> 2)    \
-   & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START))
+#define SYNTAX_START_P(a, b)                                     \
+  (((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) >> 2)    \
+   & (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START))
 
 /* ... and  SYNTAX_COMMENT_MATCH_END */
 /* a and b must be first and second end chars for a common type */
-#define SYNTAX_END_P(table, a, b)                                       \
-  (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END) >> 2)      \
-   & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END))
+#define SYNTAX_END_P(a, b)                                       \
+  (((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) >> 2)      \
+   & (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END))
 
-#define SYNTAX_STYLES_MATCH_START_P(table, a, b, mask)                     \
-  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START & (mask))     \
-   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START & (mask)))
+#define SYNTAX_STYLES_MATCH_START_P(a, b, mask)                        \
+  ((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask))        \
+   && (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START & (mask)))
 
-#define SYNTAX_STYLES_MATCH_END_P(table, a, b, mask)                     \
-  ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END & (mask))     \
-   && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END & (mask)))
+#define SYNTAX_STYLES_MATCH_END_P(a, b, mask)                  \
+  ((SYNTAX_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask))  \
+   && (SYNTAX_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END & (mask)))
 
-#define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask)    \
-  ((SYNTAX_COMMENT_BITS (table, a) & (mask)))
+#define SYNTAX_STYLES_MATCH_1CHAR_P(a, mask)   \
+  ((SYNTAX_COMMENT_BITS (a) & (mask)))
 
-#define STYLE_FOUND_P(table, a, b, startp, style)      \
-  ((SYNTAX_COMMENT_BITS (table, a) &                   \
+#define STYLE_FOUND_P(a, b, startp, style)             \
+  ((SYNTAX_COMMENT_BITS (a) &                          \
     ((startp) ? SYNTAX_FIRST_CHAR_START :              \
      SYNTAX_FIRST_CHAR_END) & (style))                 \
-   && (SYNTAX_COMMENT_BITS (table, b) &                        \
+   && (SYNTAX_COMMENT_BITS (b) &                       \
     ((startp) ? SYNTAX_SECOND_CHAR_START :             \
      SYNTAX_SECOND_CHAR_END) & (style)))
 
-#define SYNTAX_COMMENT_MASK_START(table, a, b)                 \
-  ((STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_A)     \
-    ? SYNTAX_COMMENT_STYLE_A                                   \
-    : (STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_B)  \
-         ? SYNTAX_COMMENT_STYLE_B                              \
+#define SYNTAX_COMMENT_MASK_START(a, b)                        \
+  ((STYLE_FOUND_P (a, b, 1, SYNTAX_COMMENT_STYLE_A)    \
+    ? SYNTAX_COMMENT_STYLE_A                           \
+    : (STYLE_FOUND_P (a, b, 1, SYNTAX_COMMENT_STYLE_B) \
+         ? SYNTAX_COMMENT_STYLE_B                      \
         : 0)))
 
-#define SYNTAX_COMMENT_MASK_END(table, a, b)                   \
-  ((STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_A)     \
-   ? SYNTAX_COMMENT_STYLE_A                                    \
-   : (STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_B)   \
-      ? SYNTAX_COMMENT_STYLE_B                                 \
+#define SYNTAX_COMMENT_MASK_END(a, b)                  \
+  ((STYLE_FOUND_P (a, b, 0, SYNTAX_COMMENT_STYLE_A)    \
+   ? SYNTAX_COMMENT_STYLE_A                            \
+   : (STYLE_FOUND_P (a, b, 0, SYNTAX_COMMENT_STYLE_B)  \
+      ? SYNTAX_COMMENT_STYLE_B                         \
       : 0)))
 
-#define STYLE_FOUND_1CHAR_P(table, a, style)   \
-  ((SYNTAX_COMMENT_BITS (table, a) & (style)))
+#define STYLE_FOUND_1CHAR_P(a, style)  \
+  ((SYNTAX_COMMENT_BITS (a) & (style)))
 
-#define SYNTAX_COMMENT_1CHAR_MASK(table, a)                    \
-  ((STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_A)     \
-   ? SYNTAX_COMMENT_STYLE_A                                    \
-   : (STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_B)   \
-      ? SYNTAX_COMMENT_STYLE_B                                 \
+#define SYNTAX_COMMENT_1CHAR_MASK(a)                   \
+  ((STYLE_FOUND_1CHAR_P (a, SYNTAX_COMMENT_STYLE_A)    \
+   ? SYNTAX_COMMENT_STYLE_A                            \
+   : (STYLE_FOUND_1CHAR_P (a, SYNTAX_COMMENT_STYLE_B)  \
+      ? SYNTAX_COMMENT_STYLE_B                         \
         : 0)))
 
 EXFUN (Fchar_syntax, 2);
@@ -259,13 +282,103 @@ Lisp_Object syntax_match (Lisp_Object table, Emchar ch);
 extern int no_quit_in_re_search;
 extern struct buffer *regex_emacs_buffer;
 
-/* This is the string or buffer in which we are matching.  It is used
-   for looking up syntax properties.  */
+/* Target text (string or buffer), used for syntax-table properties. */
 extern Lisp_Object regex_match_object;
 
 void update_syntax_table (Lisp_Char_Table *ct);
 
-#ifdef emacs
+/* The syntax table cache */
+
+/*
+   The *-single-property-change versions turn out to be unbearably slow.
+   Do not enable them in a production or distribution version.
+*/
+#define NEXT_SINGLE_PROPERTY_CHANGE            0
+#define PREVIOUS_SINGLE_PROPERTY_CHANGE                0
+
+/* Test instruments, used in macros below.
+   Define SYNTAX_CACHE_STATISTICS to enable them. */
+/* #undef SYNTAX_CACHE_STATISTICS */
+
+#ifdef SYNTAX_CACHE_STATISTICS
+#define SYNTAX_CACHE_STATISTICS_REPORT_INTERVAL        100000
+
+enum syntax_cache_statistics_functions {
+  scs_no_function = -1,
+  scs_find_context = 0,
+  scs_find_defun_start,
+  scs_scan_words,
+  scs_Fforward_comment,
+  scs_scan_lists,
+  scs_Fbackward_prefix_characters,
+  scs_scan_sexps_forward,
+  scs_number_of_functions
+};
+
+/* keep this in synch with syntax.c */
+extern char* syntax_cache_statistics_function_names[scs_number_of_functions];
+
+struct syntax_cache_statistics {
+  /* inits + misses_hi + misses_lo + #HITS = total_updates */
+  int total_updates;
+  int inits;
+  int misses_lo;
+  int misses_hi;
+  int min_length;
+  int max_length;
+  double mean_length;
+  double mean_length_on_miss;
+  enum syntax_cache_statistics_functions this_function;
+  int functions[scs_number_of_functions];
+};
+
+extern struct syntax_cache_statistics scs_statistics;
+
+#define SCS_STATISTICS_SET_FUNCTION(fndx) scs_statistics.this_function = fndx
+/* used in macros below */
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT scs_statistics.inits++
+
+#else
+
+#define SCS_STATISTICS_SET_FUNCTION(fndx)
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT
+
+#endif /* SYNTAX_CACHE_STATISTICS */
+
+/* Theory of the syntax table cache
+
+   This cache cooperates with but is conceptually different from the
+   mirror table.  The mirror table precomputes (and caches, if you like)
+   the syntax codes for characters in a given syntax table, taking into
+   account possible inheritance from a table given by a parent text object.
+   The syntax table cache checks for overriding tables defined by
+   _subobjects_.
+
+   This implementation defines the "subobjects" by _extent properties_.
+   We may restrict them to _text_ properties.  There are two lookup
+   styles for the cache, "single code" and "full table".  In the "single
+   code" style, a given syntax code, kept in the `syntax_code' member, is
+   applied to the entire range (#### check this).  In the "full table"
+   style, a syntax table kept in the `current_syntax_table' member is
+   checked for each character in the range.  If the flag `use_code' is
+   non-zero, the "single code" is used, otherwise the "full table".
+
+   The cache is valid for the range `[prev_change, next_change)' in the
+   text object (buffer or string) `object'.
+
+   If the current position is outside the range valid for the cache, the
+   cache is updated by checking for the text property `syntax-table'.  If
+   present, its value is either a syntax code or a syntax table, and the
+   appropriate member and `use_code' are updated accordingly.  If absent
+   or nil, the default syntax table from the `buffer' member is used.  The
+   extent of the property is used to reinitialize the cache's validity
+   range.  (We would like to improve this by checking the property value
+   against `old_prop', and if the same, extend the validity range of the
+   cache by the extent of the property.)
+
+   Note: the values Qt and Qnil for `object' are not supported in this
+   implementation.  GNU Emacs uses them for reasons not yet (####) clear.
+*/
 
 extern int lookup_syntax_properties;
 
@@ -273,8 +386,8 @@ struct syntax_cache
 {
   int use_code;                                /* Whether to use syntax_code
                                           or current_syntax_table. */
-  struct buffer* buffer;               /* The buffer the current syntax cache
-                                          applies to. */
+  struct buffer* buffer;               /* The buffer providing the default
+                                          syntax table to the cache. */
   Lisp_Object object;                  /* The buffer or string the current
                                           syntax cache applies to. */
   int syntax_code;                     /* Syntax code of current char. */
@@ -288,27 +401,54 @@ struct syntax_cache
 };
 extern struct syntax_cache syntax_cache;
 
-void update_syntax_cache (int pos, int count, int init);
+/*
+   The macros below handle the internal structure of the cache.
+   ALWAYS USE THE MACROS TO MANIPULATE THE CACHE.
+
+   o Use the SETUP_SYNTAX_CACHE* macros to set the object and buffer members.
 
+     OBJECT is either a Lisp buffer or a Lisp string.  BUFFER is a
+     pointer to struct buffer.  If OBJECT is a buffer, it must refer to
+     BUFFER.  If OBJECT is a string, then BUFFER will supply the default
+     syntax table when the `syntax-table' property is nil.
+
+     For convenience and backward compatibility, the values Qt and Qnil are
+     accepted for OBJECT.  These are taken to refer to the current buffer,
+     and that substitution is made immediately.  The value Qt is treated
+     specially in the *BYTE_TO_CHAR macros below.  This appears (####) to
+     be a GNU kludge related to `enable-multibyte-characters' and was used
+     only in dired.c.
+
+     FROM is the starting character position in OBJECT.
+     COUNT is currently used only as a flag.  If positive, we are proceeding
+     forward through OBJECT, otherwise in reverse.
+
+   o All other members are updated using the update_syntax_cache
+     function, normally wrapped in the UPDATE_SYNTAX_CACHE* macros.
+*/
+
+void update_syntax_cache (int pos, int count);
+
+/* in one example the high misses vastly outweigh the low ones
+   seems plausible, since we typically are moving forward through the buffer */
+#define UPDATE_SYNTAX_CACHE_INTERNAL(pos, dir) \
+   ((lookup_syntax_properties &&               \
+     (pos >= syntax_cache.next_change ||               \
+      pos < syntax_cache.prev_change))         \
+    ? (update_syntax_cache ((pos), dir), 1)    \
+    : 0)
+
+/* In the current implementation, all of the following are identical. */
 /* Make syntax cache state good for CHARPOS, assuming it is
    currently good for a position before CHARPOS.  */
-#define UPDATE_SYNTAX_CACHE_FORWARD(pos)       \
-   (lookup_syntax_properties                   \
-    ? (update_syntax_cache ((pos), 1, 0), 1)   \
-    : 0)
+#define UPDATE_SYNTAX_CACHE_FORWARD(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, 1)
 
 /* Make syntax cache state good for CHARPOS, assuming it is
    currently good for a position after CHARPOS.  */
-#define UPDATE_SYNTAX_CACHE_BACKWARD(pos)      \
-   (lookup_syntax_properties                   \
-    ? (update_syntax_cache ((pos), -1, 0), 1)  \
-    : 0)
+#define UPDATE_SYNTAX_CACHE_BACKWARD(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, -1)
 
 /* Make syntax cache state good for CHARPOS */
-#define UPDATE_SYNTAX_CACHE(pos)               \
-   (lookup_syntax_properties                   \
-    ? (update_syntax_cache ((pos), 0, 0), 1)   \
-    : 0)
+#define UPDATE_SYNTAX_CACHE(pos) UPDATE_SYNTAX_CACHE_INTERNAL(pos, 0)
 
 #define SYNTAX_FROM_CACHE(table, c)                    \
    SYNTAX_FROM_CODE (SYNTAX_CODE_FROM_CACHE (table, c))
@@ -321,21 +461,14 @@ void update_syntax_cache (int pos, int count, int init);
  )
 
 /* Convert the byte offset BYTEPOS into a character position,
-   for the object recorded in syntax_cache with SETUP_SYNTAX_TABLE_FOR_OBJECT.
-
-   The value is meant for use in the UPDATE_SYNTAX_TABLE... macros.
-   These macros do nothing when parse_sexp_lookup_properties is 0,
-   so we return 0 in that case, for speed.  */
-#define SYNTAX_CACHE_BYTE_TO_CHAR(bytepos)                                     \
-  (! lookup_syntax_properties                                                  \
-   ? 0                                                                         \
-   : STRINGP (syntax_cache.object)                                             \
-   ? bytecount_to_charcount (XSTRING_DATA (syntax_cache.object), bytepos)      \
-   : (BUFFERP (syntax_cache.object) || NILP (syntax_cache.object))             \
-   ? bytind_to_bufpos (syntax_cache.buffer,                                    \
-                      bytepos + BI_BUF_BEGV (syntax_cache.buffer))             \
-   : (bytepos))
+   for the object recorded in syntax_cache with SETUP_SYNTAX_CACHE*.
+
+   The value is meant for use in the UPDATE_SYNTAX_CACHE... macros.
+   These macros do nothing when lookup_syntax_properties is 0,
+   so we return 0 in that case, for speed.
 
+   The default case does no conversion; this seems (####) to be an
+   evil hangover from GNU Emacs. */
 #define SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR(obj, buf, bytepos)    \
   (! lookup_syntax_properties                                  \
    ? 0                                                         \
@@ -345,40 +478,15 @@ void update_syntax_cache (int pos, int count, int init);
    ? bytind_to_bufpos (buf, bytepos + BI_BUF_BEGV (buf))       \
    : (bytepos))
 
-#else  /* not emacs */
-
-#define update_syntax_cache(pos, count, init)
-#define UPDATE_SYNTAX_CACHE_FORWARD(pos)
-#define UPDATE_SYNTAX_CACHE_BACKWARD(pos)
-#define UPDATE_SYNTAX_CACHE(pos)
-#define SYNTAX_FROM_CACHE SYNTAX
-#define SYNTAX_CODE_FROM_CACHE SYNTAX_CODE
-
-#endif /* emacs */
+#define SYNTAX_CACHE_BYTE_TO_CHAR(bytepos)                                    \
+  SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR (syntax_cache.object, syntax_cache.buffer,  \
+                                   (bytepos))
 
 #define SETUP_SYNTAX_CACHE(FROM, COUNT)                                \
-  do {                                                         \
-    syntax_cache.buffer = current_buffer;                      \
-    syntax_cache.object = Qnil;                                        \
-    syntax_cache.current_syntax_table                          \
-      = current_buffer->mirror_syntax_table;                   \
-    syntax_cache.use_code = 0;                                 \
-    if (lookup_syntax_properties)                              \
-      update_syntax_cache ((COUNT) > 0 ? (FROM) : (FROM) - 1,  \
-                          (COUNT), 1);                         \
-  } while (0)
+  SETUP_SYNTAX_CACHE_FOR_BUFFER (current_buffer, (FROM), (COUNT))
 
 #define SETUP_SYNTAX_CACHE_FOR_BUFFER(BUFFER, FROM, COUNT)     \
-  do {                                                         \
-    syntax_cache.buffer = (BUFFER);                            \
-    syntax_cache.object = Qnil;                                        \
-    syntax_cache.current_syntax_table =                                \
-      syntax_cache.buffer->mirror_syntax_table;                        \
-    syntax_cache.use_code = 0;                                 \
-    if (lookup_syntax_properties)                              \
-      update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1),    \
-                          (COUNT), 1);                         \
-  } while (0)
+  SETUP_SYNTAX_CACHE_FOR_OBJECT (Qnil, (BUFFER), (FROM), (COUNT))
 
 #define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT)     \
   do {                                                                 \
@@ -386,11 +494,11 @@ void update_syntax_cache (int pos, int count, int init);
     syntax_cache.object = (OBJECT);                                    \
     if (NILP (syntax_cache.object))                                    \
       {                                                                        \
-        /* do nothing */;                                              \
+        XSETBUFFER (syntax_cache.object, syntax_cache.buffer);         \
       }                                                                        \
     else if (EQ (syntax_cache.object, Qt))                             \
       {                                                                        \
-        /* do nothing */;                                              \
+        XSETBUFFER (syntax_cache.object, syntax_cache.buffer);         \
       }                                                                        \
     else if (STRINGP (syntax_cache.object))                            \
       {                                                                        \
@@ -409,8 +517,10 @@ void update_syntax_cache (int pos, int count, int init);
       = syntax_cache.buffer->mirror_syntax_table;                      \
     syntax_cache.use_code = 0;                                         \
     if (lookup_syntax_properties)                                      \
-      update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1),            \
-                          (COUNT), 1);                                 \
+      {                                                                        \
+       SYNTAX_CACHE_STATISTICS_COUNT_INIT;                             \
+       update_syntax_cache ((FROM) + ((COUNT) > 0 ? 0 : -1), (COUNT)); \
+      }                                                                        \
   } while (0)
 
 #define SYNTAX_CODE_PREFIX(c) \
@@ -455,8 +565,7 @@ void update_syntax_cache (int pos, int count, int init);
 
 #define SYNTAX_CODES_MATCH_START_P(a, b, mask)                         \
   ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask))   \
-   && (SYNTAX_CODE_COMMENT_BITS (b)                                    \
-       & SYNTAX_SECOND_CHAR_START & (mask)))
+   && (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START & (mask)))
 
 #define SYNTAX_CODES_MATCH_END_P(a, b, mask)                           \
   ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask))     \
@@ -472,5 +581,30 @@ void update_syntax_cache (int pos, int count, int init);
        ? SYNTAX_COMMENT_STYLE_B                                        \
        : 0)))
 
+#if 0
+/* These are the things that need to be #defined away to create a
+   no syntax-table property version. */
+
+/* This should be entirely encapsulated in macros
+#define update_syntax_cache(pos, count)
+*/
+#define lookup_syntax_properties 0
+
+#define SETUP_SYNTAX_CACHE(FROM, COUNT)
+#define SETUP_SYNTAX_CACHE_FOR_BUFFER(BUFFER, FROM, COUNT)
+#define SETUP_SYNTAX_CACHE_FOR_OBJECT(OBJECT, BUFFER, FROM, COUNT)
+#define UPDATE_SYNTAX_CACHE_FORWARD(pos)
+#define UPDATE_SYNTAX_CACHE_BACKWARD(pos)
+#define UPDATE_SYNTAX_CACHE(pos)
+
+#define SYNTAX_FROM_CACHE SYNTAX
+#define SYNTAX_CODE_FROM_CACHE SYNTAX_CODE
+
+#define SYNTAX_CACHE_BYTE_TO_CHAR(x) 0
+
+/* cache statistics */
+#define SCS_STATISTICS_SET_FUNCTION(fndx)
+#define SYNTAX_CACHE_STATISTICS_COUNT_INIT
 
+#endif /* 0 */
 #endif /* INCLUDED_syntax_h_ */
index 6561e4e..f538ee5 100644 (file)
@@ -1,3 +1,28 @@
+2002-11-02  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-08-22  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * automated/test-harness.el (test-harness-from-buffer):
+       Print-Skip: new local function.
+
+       * automated/syntax-tests.el (forward-comment at buffer boundaries):
+       * automated/test-harness.el (Check-Message):
+       Warn, not barf, if required packages are unavailable.
+
+2002-09-12  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * automated/regexp-tests.el: Add word-boundary regexp tests.
+
+2002-09-09  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * automated/regexp-tests.el: Add test for stale subexpr match-data.
+       Thanks to Martin Stjernholm for the report.
+
+       * automated/syntax-tests.el: Conditionalize syntax-table property
+       tests on feature.  Enable feature if present.
+
 2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
        * XEmacs 21.4.9 "Informed Management" is released.
index 292abeb..b24296c 100644 (file)
   (looking-at "Unmatchable text")
   (replace-match "")
   (Assert (looking-at "^buffer.$")))
+
+;; Test that trivial regexps reset unused registers
+;; Thanks to Martin Sternholm for the report.
+;; xemacs-beta <5blm6h2ki5.fsf@lister.roxen.com>
+(with-temp-buffer
+  (insert "ab")
+  (goto-char (point-min))
+  (re-search-forward "\\(a\\)")
+  ;; test the whole-match data, too -- one try scotched that, too!
+  (Assert (string= (match-string 0) "a"))
+  (Assert (string= (match-string 1) "a"))
+  (re-search-forward "b")
+  (Assert (string= (match-string 0) "b"))
+  (Assert (not (match-string 1))))
+
+;; Test word boundaries
+(Assert (= (string-match " \\<a" " a") 0))
+(Assert (= (string-match "a\\> " "a ") 0))
+(Assert (= (string-match " \\ba" " a") 0))
+(Assert (= (string-match "a\\b " "a ") 0))
+(Assert (= (string-match "\\ba" " a") 1))
+(Assert (= (string-match "a\\b" "a ") 0))
+;; should work at target boundaries
+(Assert (= (string-match "\\<a" "a") 0))
+(Assert (= (string-match "a\\>" "a") 0))
+(Assert (= (string-match "\\ba" "a") 0))
+(Assert (= (string-match "a\\b" "a") 0))
+;; but not if the "word" would be on the null side of the boundary!
+(Assert (not (string-match "\\<" "")))
+(Assert (not (string-match "\\>" "")))
+(Assert (not (string-match " \\<" " ")))
+(Assert (not (string-match "\\> " " ")))
+(Assert (not (string-match "a\\<" "a")))
+(Assert (not (string-match "\\>a" "a")))
+;; Expect these to fail :-(
+(Assert (not (string-match "\\b" "")))
+(Assert (not (string-match " \\b" " ")))
+(Assert (not (string-match "\\b " " ")))
+
index f5a063c..1ebb9f1 100644 (file)
 ;; <apply-pos> can be in the form (start . end), or can be a
 ;; character position.
 (defun test-syntax-table (string apply-pos apply-syntax stop)
-  (goto-char (point-max))
-  (unless (consp apply-pos)
-       (setq apply-pos `(,apply-pos . ,(+ 1 apply-pos))))
-  (let ((point (point)))
-       (insert string)
-       (put-text-property (+ point (car apply-pos)) (+ point (cdr apply-pos))
-                                          'syntax-table apply-syntax)
-       (goto-char point)
-       (forward-word 1)
-       (Assert (eq (point) (+ point stop)))))
+  ;; We don't necessarily have syntax-table properties ...
+  (when (boundp 'lookup-syntax-properties) ; backwards compatible kludge
+    ;; ... and they may not be enabled by default if we do.
+    (setq lookup-syntax-properties t)
+    (goto-char (point-max))
+    (unless (consp apply-pos)
+      (setq apply-pos `(,apply-pos . ,(+ 1 apply-pos))))
+    (let ((point (point)))
+      (insert string)
+      (put-text-property (+ point (car apply-pos)) (+ point (cdr apply-pos))
+                        'syntax-table apply-syntax)
+      (goto-char point)
+      (forward-word 1)
+      (Assert (eq (point) (+ point stop))))))
 
 ;; test syntax-table extents
 (with-temp-buffer
   (test-syntax-table "W." 1 `(,(syntax-string-to-code "w")) 2))
 
 ;; Test forward-comment at buffer boundaries
+;; #### The second Assert fails (once interpreted, once compiled) on 21.4.9
+;; with sjt's version of Andy's syntax-text-property-killer patch.
 (with-temp-buffer
-  (c-mode)
-  (insert "// comment\n")
-  (forward-comment -2)
-  (Assert (eq (point) (point-min)))
-
-  (let ((point (point)))
-       (insert "/* comment */")
-       (goto-char point)
-       (forward-comment 2)
-       (Assert (eq (point) (point-max)))
-
-       ;; this last used to crash
-       (parse-partial-sexp point (point-max))))
+  (if (not (fboundp 'c-mode))
+      ;; #### This whole thing should go inside a macro Skip-Test
+      (let* ((reason "c-mode unavailable")
+            (count (gethash reason skipped-test-reasons)))
+       ;;(message "%S: %S" reason count)
+       (puthash reason (if (null count) 1 (1+ count))
+                skipped-test-reasons)
+       (Print-Skip "comment and parse-partial-sexp tests" reason))
+    (c-mode)
+    
+    (insert "// comment\n")
+    (forward-comment -2)
+    (Assert (eq (point) (point-min)))
+
+    (let ((point (point)))
+      (insert "/* comment */")
+      (goto-char point)
+      (forward-comment 2)
+      (Assert (eq (point) (point-max)))
+
+      ;; this last used to crash
+      (parse-partial-sexp point (point-max)))))
index e93046f..89852fc 100644 (file)
@@ -123,6 +123,11 @@ The output file's name is made by appending `c' to the end of FILENAME."
        (missing-message-failures 0)
        (other-failures 0)
 
+       ;; #### perhaps this should be a defvar, and output at the very end
+       ;; OTOH, this way AC types can use a null EMACSPACKAGEPATH to find
+       ;; what stuff is needed, and ways to avoid using them
+       (skipped-test-reasons (make-hash-table :test 'equal))
+
        (trick-optimizer nil)
        (unexpected-test-suite-failure nil)
        (debug-on-error t))
@@ -186,32 +191,44 @@ The output file's name is made by appending `c' to the end of FILENAME."
                             ,quoted-body ',expected-error error-info))
              (incf wrong-error-failures)))))
 
+      (defun Print-Skip (test reason &optional fmt &rest args)
+       (setq fmt (concat "SKIP: %S.  REASON: %S" fmt))
+       (princ (concat (apply #'format fmt test reason args) "\n")))
+
 
       (defmacro Check-Message (expected-message-regexp &rest body)
-       (let ((quoted-body (if (= 1 (length body))
-                              `(quote ,(car body)) `(quote (progn ,@body)))))
-         `(let ((messages ""))
-            (defadvice message (around collect activate)
-              (defvar messages)
-              (let ((msg-string (apply 'format (ad-get-args 0))))
-                (setq messages (concat messages msg-string))
-                msg-string))
-            (condition-case error-info
-                (progn
-                  (setq trick-optimizer (progn ,@body))
-                  (if (string-match ,expected-message-regexp messages)
-                      (progn
-                        (princ (format "PASS: %S ==> value %S, message %S, matching %S, as expected\n"
-                                       ,quoted-body trick-optimizer messages ',expected-message-regexp))
-                        (incf passes))
-                    (princ (format "FAIL: %S ==> value %S, message %S, NOT matching expected %S\n"
-                                   ,quoted-body  trick-optimizer messages ',expected-message-regexp))
-                    (incf missing-message-failures)))
-              (error
-               (princ (format "FAIL: %S ==> unexpected error %S\n"
-                              ,quoted-body error-info))
-               (incf other-failures)))
-            (ad-unadvise 'message))))
+       (if (not (fboundp 'defadvice))
+           ;; #### This whole thing should go inside a macro Skip-Test
+           (let* ((reason "advice unavailable")
+                  (count (gethash reason skipped-test-reasons)))
+             ;(message "%S: %S" reason count)
+             (puthash reason (if (null count) 1 (1+ count))
+                      skipped-test-reasons)
+             `(Print-Skip ,expected-message-regexp ,reason))
+         (let ((quoted-body (if (= 1 (length body))
+                                `(quote ,(car body)) `(quote (progn ,@body)))))
+           `(let ((messages ""))
+              (defadvice message (around collect activate)
+                (defvar messages)
+                (let ((msg-string (apply 'format (ad-get-args 0))))
+                  (setq messages (concat messages msg-string))
+                  msg-string))
+              (condition-case error-info
+                  (progn
+                    (setq trick-optimizer (progn ,@body))
+                    (if (string-match ,expected-message-regexp messages)
+                        (progn
+                          (princ (format "PASS: %S ==> value %S, message %S, matching %S, as expected\n"
+                                         ,quoted-body trick-optimizer messages ',expected-message-regexp))
+                          (incf passes))
+                      (princ (format "FAIL: %S ==> value %S, message %S, NOT matching expected %S\n"
+                                     ,quoted-body  trick-optimizer messages ',expected-message-regexp))
+                      (incf missing-message-failures)))
+                (error
+                 (princ (format "FAIL: %S ==> unexpected error %S\n"
+                                ,quoted-body error-info))
+                 (incf other-failures)))
+              (ad-unadvise 'message)))))
 
       (defmacro Ignore-Ebola (&rest body)
        `(let ((debug-issue-ebola-notices -42)) ,@body))
@@ -270,7 +287,19 @@ The output file's name is made by appending `c' to the end of FILENAME."
              (if (> total 0)
                  (format "%s: %d of %d (%d%%) tests successful."
                          basename passes total (/ (* 100 passes) total))
-               (format "%s: No tests run" basename))))
+               (format "%s: No tests run" basename)))
+            (reasons ""))
+       (maphash (lambda (key value)
+                  (setq reasons
+                        (concat reasons
+                                (format "\n    %d tests skipped because %s"
+                                        value key))))
+                skipped-test-reasons)
+       (when (> (length reasons) 1)
+         (setq summary-msg (concat summary-msg reasons "
+    Probably XEmacs cannot find your installed packages.  Set EMACSPACKAGEPATH
+    to the package hierarchy root or configure with --package-path to enable
+    the skipped tests.")))
        (message "%s" summary-msg))
       (when unexpected-test-suite-failure
        (message "Test suite execution failed unexpectedly."))
index 1a75201..ad0c9f1 100644 (file)
@@ -2,8 +2,8 @@
 emacs_is_beta=
 emacs_major_version=21
 emacs_minor_version=4
-emacs_beta_version=9
-xemacs_codename="Informed Management"
+emacs_beta_version=10
+xemacs_codename="Military Intelligence"
 emacs_kit_version=
 infodock_major_version=4
 infodock_minor_version=0