From ac7d0619aad74b1d57c4748ebb3ab29d9c32e3d8 Mon Sep 17 00:00:00 2001 From: tomo Date: Wed, 11 Dec 2002 17:39:38 +0000 Subject: [PATCH] XEmacs 21.4.10 "Military Intelligence". --- ChangeLog | 77 ++++++ INSTALL | 12 +- Makefile.in.in | 8 +- PROBLEMS | 46 ++- configure | 502 +++++++++++++++++---------------- configure.in | 14 + configure.usage | 386 ++++++++++++-------------- etc/BETA | 50 ++-- etc/Emacs.ad | 10 +- etc/OXYMORONS | 12 +- etc/TUTORIAL.fr | 2 +- lib-src/ChangeLog | 4 + lisp/ChangeLog | 67 +++++ lisp/auto-autoloads.el | 45 +-- lisp/bytecomp-runtime.el | 8 +- lisp/custom-load.el | 7 +- lisp/dialog-items.el | 30 +- lisp/dialog.el | 21 +- lisp/files.el | 10 +- lisp/font-lock.el | 34 ++- lisp/gutter-items.el | 11 +- lisp/keydefs.el | 1 + lisp/obsolete.el | 2 + lisp/package-get.el | 55 ++-- lwlib/ChangeLog | 4 + man/ChangeLog | 44 +++ man/internals/internals.texi | 84 +++++- man/lispref/compile.texi | 298 +++++++++++++++++++- man/lispref/syntax.texi | 146 +++++++--- man/xemacs-faq.texi | 34 ++- man/xemacs/packages.texi | 27 +- netinstall/ChangeLog | 8 +- nt/ChangeLog | 15 + nt/xemacs.mak | 14 +- src/ChangeLog | 249 +++++++++++++++++ src/callproc.c | 7 +- src/console.h | 5 + src/dired.c | 3 +- src/emacs.c | 44 +-- src/event-Xt.c | 83 +++++- src/event-msw.c | 2 +- src/extents.c | 11 +- src/extents.h | 1 + src/file-coding.c | 25 +- src/font-lock.c | 40 +-- src/frame-msw.c | 2 +- src/frame-x.c | 4 +- src/frame.c | 117 +++++++- src/general-slots.h | 2 + src/glyphs-msw.c | 14 +- src/glyphs-widget.c | 457 ++++++++++++++++++++++++------ src/glyphs-x.c | 25 +- src/glyphs.h | 34 ++- src/lisp.h | 2 +- src/menubar-msw.c | 2 +- src/nas.c | 33 +++ src/process-unix.c | 4 + src/realpath.c | 9 +- src/redisplay-output.c | 20 +- src/redisplay.c | 2 +- src/regex.c | 32 ++- src/search.c | 33 ++- src/symsinit.h | 1 + src/syntax.c | 585 +++++++++++++++++++++++++-------------- src/syntax.h | 342 ++++++++++++++++------- tests/ChangeLog | 25 ++ tests/automated/regexp-tests.el | 39 +++ tests/automated/syntax-tests.el | 61 ++-- tests/automated/test-harness.el | 79 ++++-- version.sh | 4 +- 70 files changed, 3307 insertions(+), 1179 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0615c59..b743ab6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,80 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-11-01 Stephen J. Turnbull + + * Makefile.in.in (lisp/custom-load.el): Depend on auto-autoloads.el. + +2002-10-31 Christopher Sekiya + + * etc/OXYMORONS: "Too much Mozart" is an oxymoron. + +2002-10-25 Steve Youngs + + * etc/TUTORIAL.fr (suivante): Typo fix. + From juergen stuber . + +2002-10-23 Stephen J. Turnbull + + * 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 + + * PROBLEMS (Running/Cygwin): "No cygXpm-noX" fatal error. + +2002-10-17 Stephen J. Turnbull + + * PROBLEMS (Missing charsets): Remove ambiguity. + +2002-10-10 Stephen J. Turnbull + + * INSTALL (PREREQUISITES): Recommend Texinfo 4.2. + +2002-10-09 Stephen J. Turnbull + + * etc/BETA: Improve descriptions of XEmacs Patches; mention Design. + +2002-10-08 Stephen J. Turnbull + + * 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 + + * Makefile.in.in (all-elcs): Depend on autoloads. + (autoloads): Depend on lib-src, lwlib, and src. + +2002-10-04 Stephen J. Turnbull + + * 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 + + * PROBLEMS (Running, General): Missing charset in FontSet warnings. + + * Emacs.ad: Add charsets to *menubar*FontSet and *popup*FontSet. + +2002-08-29 Ville Skyttä + + * Emacs.ad: Add *menubar*FontSet and *popup*FontSet entries, + (self-)obtained from Red Hat. + +2002-09-25 Stephen J. Turnbull + + * etc/OXYMORONS: A couple new ones. + +2002-09-03 Stephen J. Turnbull + + * configure.usage: Complete rewrite and reorganization. + 2002-08-23 Stephen J. Turnbull * XEmacs 21.4.9 "Informed Management" is released. diff --git a/INSTALL b/INSTALL index 8282e8b..3cbcd98 100644 --- 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. diff --git a/Makefile.in.in b/Makefile.in.in index ce005c3..bf5656f 100644 --- a/Makefile.in.in +++ b/Makefile.in.in @@ -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 diff --git a/PROBLEMS b/PROBLEMS index ccce14f..b6dd37a 100644 --- 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 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 diff --git a/configure b/configure index 890f809..8aad1af 100755 --- a/configure +++ b/configure @@ -10856,13 +10856,14 @@ fi 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 <&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 @@ -10913,14 +10914,23 @@ fi 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 <&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 <&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 <&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 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 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 <&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 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 <&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 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 <&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 @@ -11409,15 +11419,15 @@ fi 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 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 <&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 @@ -11499,16 +11509,16 @@ fi 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 < 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 @@ -11528,16 +11538,16 @@ fi 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 < 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 @@ -11557,11 +11567,11 @@ fi 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 < #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 <&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 @@ -11671,19 +11681,19 @@ fi 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 <&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 < 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 <&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 <&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 <&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 <&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 @@ -11963,15 +11973,15 @@ fi 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 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 < @@ -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 @@ -12123,10 +12133,10 @@ fi 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 < 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 @@ -12164,10 +12174,10 @@ fi 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 <&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 @@ -12218,10 +12228,10 @@ fi 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 <&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 @@ -12303,10 +12313,10 @@ fi 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 < #include @@ -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 < 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 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 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* @@ -12498,10 +12508,10 @@ fi 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 <&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 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 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 < @@ -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 < @@ -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 @@ -12671,10 +12681,10 @@ fi 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 <&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 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 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* @@ -12783,15 +12793,15 @@ fi 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 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 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* @@ -12859,15 +12869,15 @@ fi 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 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* @@ -12897,22 +12907,22 @@ fi 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 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* @@ -12960,12 +12970,12 @@ fi 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 <&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 @@ -13007,12 +13017,12 @@ fi 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 <&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 @@ -13068,15 +13078,15 @@ fi 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 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* @@ -13130,15 +13140,15 @@ fi 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 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 <&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 @@ -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. @@ -13271,10 +13281,10 @@ fi 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 <&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 <&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 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* @@ -13443,15 +13453,15 @@ fi 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 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* @@ -13481,15 +13491,15 @@ fi 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 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* @@ -13524,12 +13534,12 @@ fi 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 <&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 @@ -13565,12 +13575,12 @@ fi 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 <&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 @@ -13626,12 +13636,12 @@ fi 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 <&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 <&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 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* @@ -13755,12 +13765,12 @@ fi } 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 <&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 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* @@ -13864,12 +13874,12 @@ fi 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 <&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 @@ -13908,10 +13918,10 @@ fi 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 <&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 <&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 < @@ -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 < #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 < #if DB_VERSION_MAJOR > 2 @@ -14092,10 +14102,10 @@ fi 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 <&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 <&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 @@ -14217,12 +14227,12 @@ fi 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 <&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 @@ -14288,22 +14298,22 @@ fi 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 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 < 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 < 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 <&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 <&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 <&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 <&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 <&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 &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 <&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 <&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 diff --git a/configure.in b/configure.in index 9708606..0bf8449 100644 --- a/configure.in +++ b/configure.in @@ -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 ---------------------------------------------------------------- diff --git a/configure.usage b/configure.usage index 361a596..2b1e1a8 100644 --- a/configure.usage +++ b/configure.usage @@ -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 diff --git a/etc/BETA b/etc/BETA index 26a91fd..3670938 100644 --- 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 . -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 . 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. diff --git a/etc/Emacs.ad b/etc/Emacs.ad index 2dda0f9..1205b31 100644 --- a/etc/Emacs.ad +++ b/etc/Emacs.ad @@ -193,8 +193,16 @@ ! *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 ! diff --git a/etc/OXYMORONS b/etc/OXYMORONS index 91d8b12..da16190 100644 --- a/etc/OXYMORONS +++ b/etc/OXYMORONS @@ -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. diff --git a/etc/TUTORIAL.fr b/etc/TUTORIAL.fr index e78ae19..7dc64ac 100644 --- a/etc/TUTORIAL.fr +++ b/etc/TUTORIAL.fr @@ -711,7 +711,7 @@ cha >> Déplacez le curseur sur la ligne blanche en dessous de ce paragraphe, puis tapez - M-x replsRemarquezNotez. + M-x replsRemarquezNotez. 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 diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 72125a3..4c9d071 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,7 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + 2002-08-23 Stephen J. Turnbull * XEmacs 21.4.9 "Informed Management" is released. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e5af893..93e89a6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,70 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-10-07 Katsumi Yamaoka + + * font-lock.el (font-lock-fontify-keywords-region): Fix typo. + +2002-10-07 Katsumi Yamaoka + + * keydefs.el (global-map): Bind C-xrd to delete-rectangle per GNU. + +2001-05-10 Daiki Ueno + + * 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ä + + * package-get.el (package-get-download-sites): Bring sites list + up to date, prefer xx.xemacs.org addresses. + +2002-09-27 Andy Piper + + * dialog.el (make-dialog-box): for general dialogs only + delete-frame-hook will be run. + +2002-09-28 Stephen J. Turnbull + + * font-lock.el (font-lock-fontify-syntactically-region): Add + comment about lookup-syntax-properties, document LOUDLY as unused. + +2002-08-26 Andy Piper + + * gutter-items.el (set-progress-feedback-instantiator): Fix bad + merge. + +2002-09-02 Ville Skyttä + + * 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 + + * obsolete.el (parse-sexp-lookup-properties): new compatible alias + for `lookup-syntax-properties'. RFE from Alan Mackenzie. + +2002-08-28 Andy Piper + + * files.el (revert-buffer): propagate revert-without-query-status. + +2002-06-03 Andy Piper + + * 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 * XEmacs 21.4.9 "Informed Management" is released. diff --git a/lisp/auto-autoloads.el b/lisp/auto-autoloads.el index cd681c4..35096b5 100644 --- a/lisp/auto-autoloads.el +++ b/lisp/auto-autoloads.el @@ -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) ;;;*** @@ -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." ;;;### (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))) ;;;*** @@ -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) ;;;*** -;;;### (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. diff --git a/lisp/bytecomp-runtime.el b/lisp/bytecomp-runtime.el index f146c69..adbc4e1 100644 --- a/lisp/bytecomp-runtime.el +++ b/lisp/bytecomp-runtime.el @@ -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 diff --git a/lisp/custom-load.el b/lisp/custom-load.el index 4c635f6..90a3c79 100644 --- a/lisp/custom-load.el +++ b/lisp/custom-load.el @@ -17,12 +17,13 @@ (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")) @@ -82,11 +83,11 @@ (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 diff --git a/lisp/dialog-items.el b/lisp/dialog-items.el index 5d26ac1..9b12179 100644 --- a/lisp/dialog-items.el +++ b/lisp/dialog-items.el @@ -60,17 +60,18 @@ '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" @@ -92,10 +93,12 @@ :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) @@ -108,8 +111,9 @@ (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)) + ))) diff --git a/lisp/dialog.el b/lisp/dialog.el index 4b3f284..235d135 100644 --- a/lisp/dialog.el +++ b/lisp/dialog.el @@ -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) diff --git a/lisp/files.el b/lisp/files.el index 4d9562d..05d5011 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -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? " diff --git a/lisp/font-lock.el b/lisp/font-lock.el index b1cb31d..5ee4072 100644 --- a/lisp/font-lock.el +++ b/lisp/font-lock.el @@ -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." ;; 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 diff --git a/lisp/gutter-items.el b/lisp/gutter-items.el index 1f7c373..9feefa4 100644 --- a/lisp/gutter-items.el +++ b/lisp/gutter-items.el @@ -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 diff --git a/lisp/keydefs.el b/lisp/keydefs.el index c34c35d..b7296d0 100644 --- a/lisp/keydefs.el +++ b/lisp/keydefs.el @@ -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) diff --git a/lisp/obsolete.el b/lisp/obsolete.el index 3f83e0a..4970f11 100644 --- a/lisp/obsolete.el +++ b/lisp/obsolete.el @@ -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) diff --git a/lisp/package-get.el b/lisp/package-get.el index 058e827..5ae5de3 100644 --- a/lisp/package-get.el +++ b/lisp/package-get.el @@ -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). diff --git a/lwlib/ChangeLog b/lwlib/ChangeLog index 865149d..ec595a1 100644 --- a/lwlib/ChangeLog +++ b/lwlib/ChangeLog @@ -1,3 +1,7 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + 2002-08-23 Stephen J. Turnbull * XEmacs 21.4.9 "Informed Management" is released. diff --git a/man/ChangeLog b/man/ChangeLog index 78e5c97..751384a 100644 --- a/man/ChangeLog +++ b/man/ChangeLog @@ -1,3 +1,47 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-10-29 Stephen J. Turnbull + + * 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 + + * xemacs-faq.texi (Q2.0.16): Fix typo in previous commit. + +2002-10-18 Stephen J. Turnbull + + * 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 + + * internals/internals.texi (Regression Testing XEmacs): Document + how to skip and warn about tests that depend on packages. + +2002-09-22 Ville Skyttä + + * 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 + + * 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 * XEmacs 21.4.9 "Informed Management" is released. diff --git a/man/internals/internals.texi b/man/internals/internals.texi index 54a94a8..19563d4 100644 --- a/man/internals/internals.texi +++ b/man/internals/internals.texi @@ -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 diff --git a/man/lispref/compile.texi b/man/lispref/compile.texi index e6426ae..d3f3cbe 100644 --- a/man/lispref/compile.texi +++ b/man/lispref/compile.texi @@ -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 diff --git a/man/lispref/syntax.texi b/man/lispref/syntax.texi index 2b75bc0..67ed394 100644 --- a/man/lispref/syntax.texi +++ b/man/lispref/syntax.texi @@ -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 diff --git a/man/xemacs-faq.texi b/man/xemacs-faq.texi index 5901e23..5fb21a0 100644 --- a/man/xemacs-faq.texi +++ b/man/xemacs-faq.texi @@ -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 @author Ben Wing @@ -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 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 diff --git a/man/xemacs/packages.texi b/man/xemacs/packages.texi index 6a9cba0..53db29e 100644 --- a/man/xemacs/packages.texi +++ b/man/xemacs/packages.texi @@ -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. diff --git a/netinstall/ChangeLog b/netinstall/ChangeLog index d64634e..b6f3c50 100644 --- a/netinstall/ChangeLog +++ b/netinstall/ChangeLog @@ -1,3 +1,7 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + 2002-08-23 Stephen J. Turnbull * XEmacs 21.4.9 "Informed Management" is released. @@ -346,6 +350,6 @@ * 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 $ diff --git a/nt/ChangeLog b/nt/ChangeLog index 3b81c6f..dbf035a 100644 --- a/nt/ChangeLog +++ b/nt/ChangeLog @@ -1,3 +1,18 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-10-13 Adrian Aichner + + * 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 + + * xemacs.mak: set the stacksize to 8mb which seems to be the magic + number for regex. + 2002-08-23 Stephen J. Turnbull * XEmacs 21.4.9 "Informed Management" is released. diff --git a/nt/xemacs.mak b/nt/xemacs.mak index db8534b..d0aff62 100644 --- a/nt/xemacs.mak +++ b/nt/xemacs.mak @@ -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 diff --git a/src/ChangeLog b/src/ChangeLog index a9a6e65..f53dd09 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,252 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-10-17 Raymond Toy + + * 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 + + * 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 + + * 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 + + * glyphs-widget.c (layout_query_geometry): only resize dynamically + if static sizes haven't been set. + +2002-08-30 Mike Alexander + + * event-msw.c (winsock_closer): Use closesocket, not CloseHandle + to close a socket. + +2002-10-03 Stephen J. Turnbull + + * callproc.c (child_setup): 21.4 doesn't have retry_close. + +2002-09-20 Mike Sperber + + (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. + + * frame-x.c (x_delete_frame): do not call XtDisplay on a destroyed + widget. + +2002-08-20 Ben Sigelman + + * 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 + + * 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 + + * 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 + + * 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 + + * event-Xt.c (enqueue_focus_event): Add missing prototype. + +2002-08-29 Jerry James + + * lisp.h: structrures -> structures. + +2002-06-03 Andy Piper + + * 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 * XEmacs 21.4.9 "Informed Management" is released. diff --git a/src/callproc.c b/src/callproc.c index ff28a49..9b39b48 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -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 */ diff --git a/src/console.h b/src/console.h index 6342ddc..9d9d65c 100644 --- a/src/console.h +++ b/src/console.h @@ -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); diff --git a/src/dired.c b/src/dired.c index e07049b..e0639f9 100644 --- a/src/dired.c +++ b/src/dired.c @@ -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)); diff --git a/src/emacs.c b/src/emacs.c index d1922a9..6d04500 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -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.', 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 */ } diff --git a/src/event-Xt.c b/src/event-Xt.c index 4345bb1..eb7fd74 100644 --- a/src/event-Xt.c +++ b/src/event-Xt.c @@ -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 diff --git a/src/event-msw.c b/src/event-msw.c index aaeaa4f..09bfe6d 100644 --- a/src/event-msw.c +++ b/src/event-msw.c @@ -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); diff --git a/src/extents.c b/src/extents.c index 5b00161..5bc0dc4 100644 --- a/src/extents.c +++ b/src/extents.c @@ -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)) { diff --git a/src/extents.h b/src/extents.h index e8d6707..ff3fd1c 100644 --- a/src/extents.h +++ b/src/extents.h @@ -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); diff --git a/src/file-coding.c b/src/file-coding.c index 8635316..fe42ebd 100644 --- a/src/file-coding.c +++ b/src/file-coding.c @@ -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 diff --git a/src/font-lock.c b/src/font-lock.c index ea40a1b..1cfd739 100644 --- a/src/font-lock.c +++ b/src/font-lock.c @@ -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; diff --git a/src/frame-msw.c b/src/frame-msw.c index 37c596e..effa87d 100644 --- a/src/frame-msw.c +++ b/src/frame-msw.c @@ -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); diff --git a/src/frame-x.c b/src/frame-x.c index 23ef070..f174a06 100644 --- a/src/frame-x.c +++ b/src/frame-x.c @@ -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! */ diff --git a/src/frame.c b/src/frame.c index c98d0c3..6c98955 100644 --- a/src/frame.c +++ b/src/frame.c @@ -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); diff --git a/src/general-slots.h b/src/general-slots.h index 5cc34a6..ebdec9b 100644 --- a/src/general-slots.h +++ b/src/general-slots.h @@ -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); diff --git a/src/glyphs-msw.c b/src/glyphs-msw.c index 883ab53..80ef445 100644 --- a/src/glyphs-msw.c +++ b/src/glyphs-msw.c @@ -1720,9 +1720,9 @@ xbm_create_bitmap_from_data (HDC hdc, char *data, for (j=0; j> 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); diff --git a/src/glyphs-widget.c b/src/glyphs-widget.c index be7b5fa..91946b0 100644 --- a/src/glyphs-widget.c +++ b/src/glyphs-widget.c @@ -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); +} + /************************************************************************/ /* 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); +} diff --git a/src/glyphs-x.c b/src/glyphs-x.c index 5a71012..8c7b312 100644 --- a/src/glyphs-x.c +++ b/src/glyphs-x.c @@ -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 diff --git a/src/glyphs.h b/src/glyphs.h index 5903f1c..9ad7f3e 100644 --- a/src/glyphs.h +++ b/src/glyphs.h @@ -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_ */ diff --git a/src/lisp.h b/src/lisp.h index 38bb287..a05b273 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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 diff --git a/src/menubar-msw.c b/src/menubar-msw.c index eca204b..1663101 100644 --- a/src/menubar-msw.c +++ b/src/menubar-msw.c @@ -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)); diff --git a/src/nas.c b/src/nas.c index 7fe1295..3249218 100644 --- a/src/nas.c +++ b/src/nas.c @@ -50,6 +50,12 @@ * 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); diff --git a/src/process-unix.c b/src/process-unix.c index 00bb163..e7fcc3d 100644 --- a/src/process-unix.c +++ b/src/process-unix.c @@ -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. */ diff --git a/src/realpath.c b/src/realpath.c index da05446..442c3ff 100644 --- a/src/realpath.c +++ b/src/realpath.c @@ -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); diff --git a/src/redisplay-output.c b/src/redisplay-output.c index 223a1a0..b19d74f 100644 --- a/src/redisplay-output.c +++ b/src/redisplay-output.c @@ -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)); } } diff --git a/src/redisplay.c b/src/redisplay.c index c24f20f..e664075 100644 --- a/src/redisplay.c +++ b/src/redisplay.c @@ -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; diff --git a/src/regex.c b/src/regex.c index 3ef8353..d70f7d6 100644 --- a/src/regex.c +++ b/src/regex.c @@ -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) diff --git a/src/search.c b/src/search.c index 8a496cb..7c5f447 100644 --- a/src/search.c +++ b/src/search.c @@ -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; +} + /* Given a string of words separated by word delimiters, compute a regexp that matches those exact words diff --git a/src/symsinit.h b/src/symsinit.h index 8900507..e48f8d7 100644 --- a/src/symsinit.h +++ b/src/symsinit.h @@ -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); diff --git a/src/syntax.c b/src/syntax.c index 3388e6d..42628c5 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -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 */ } + /* 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. diff --git a/src/syntax.h b/src/syntax.h index 75ac2c3..8ea4fcb 100644 --- a/src/syntax.h +++ b/src/syntax.h @@ -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_ */ diff --git a/tests/ChangeLog b/tests/ChangeLog index 6561e4e..f538ee5 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,28 @@ +2002-11-02 Stephen J. Turnbull + + * XEmacs 21.4.10 "Military Intelligence" is released. + +2002-08-22 Stephen J. Turnbull + + * 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 + + * automated/regexp-tests.el: Add word-boundary regexp tests. + +2002-09-09 Stephen J. Turnbull + + * 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 * XEmacs 21.4.9 "Informed Management" is released. diff --git a/tests/automated/regexp-tests.el b/tests/automated/regexp-tests.el index 292abeb..b24296c 100644 --- a/tests/automated/regexp-tests.el +++ b/tests/automated/regexp-tests.el @@ -213,3 +213,42 @@ (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 ") 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") 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 " " "))) + diff --git a/tests/automated/syntax-tests.el b/tests/automated/syntax-tests.el index f5a063c..1ebb9f1 100644 --- a/tests/automated/syntax-tests.el +++ b/tests/automated/syntax-tests.el @@ -107,16 +107,20 @@ ;; 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 @@ -126,17 +130,28 @@ (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))))) diff --git a/tests/automated/test-harness.el b/tests/automated/test-harness.el index e93046f..89852fc 100644 --- a/tests/automated/test-harness.el +++ b/tests/automated/test-harness.el @@ -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.")) diff --git a/version.sh b/version.sh index 1a75201..ad0c9f1 100644 --- a/version.sh +++ b/version.sh @@ -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 -- 1.7.10.4