+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-11-01 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * Makefile.in.in (lisp/custom-load.el): Depend on auto-autoloads.el.
+
+2002-10-31 Christopher Sekiya <wileyc@rezrov.net>
+
+ * etc/OXYMORONS: "Too much Mozart" is an oxymoron.
+
+2002-10-25 Steve Youngs <youngs@xemacs.org>
+
+ * etc/TUTORIAL.fr (suivante): Typo fix.
+ From juergen stuber <stuberj@mines.inpl-nancy.fr>.
+
+2002-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * Makefile.in.in (lisp/auto-autoloads.el):
+ (lisp/custom-load.el):
+ Use -no-autoloads for these targets; can't load 'em if they ain't.
+
+2002-10-18 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * PROBLEMS (Running/Cygwin): "No cygXpm-noX" fatal error.
+
+2002-10-17 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * PROBLEMS (Missing charsets): Remove ambiguity.
+
+2002-10-10 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * INSTALL (PREREQUISITES): Recommend Texinfo 4.2.
+
+2002-10-09 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * etc/BETA: Improve descriptions of XEmacs Patches; mention Design.
+
+2002-10-08 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * PROBLEMS (MacOS/X): Describe stack limitation.
+ (Digital Unix): Generalize to all regexp-using applications.
+ * INSTALL (PREQUISITES): Mention MacOS/X stack limitation.
+ (PROBLEMS): Point to PROBLEMS file for build notes.
+ Thanks to Skip Montanaro for the report.
+
+2002-10-07 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * Makefile.in.in (all-elcs): Depend on autoloads.
+ (autoloads): Depend on lib-src, lwlib, and src.
+
+2002-10-04 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * configure.in (Check for POSIX functions): New section head.
+ getaddrinfo is detected on HP-UX 11.XX, but appears to be
+ non-functional. Disable it. Based on work by Darryl Okahata.
+
+2002-09-27 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * PROBLEMS (Running, General): Missing charset in FontSet warnings.
+
+ * Emacs.ad: Add charsets to *menubar*FontSet and *popup*FontSet.
+
+2002-08-29 Ville Skyttä <ville.skytta@xemacs.org>
+
+ * Emacs.ad: Add *menubar*FontSet and *popup*FontSet entries,
+ (self-)obtained from Red Hat.
+
+2002-09-25 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * etc/OXYMORONS: A couple new ones.
+
+2002-09-03 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * configure.usage: Complete rewrite and reorganization.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
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
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
================
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.
## 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
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
* 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.
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.
** 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()
** Cygwin
+*** XEmacs fails to start because cygXpm-noX4.dll was not found.
+
+Andy Piper <andy@xemacs.org> sez:
+
+ cygXpm-noX4 is part of the cygwin distribution under libraries or
+ graphics, but is not installed by default. You need to run the
+ cygwin setup again and select this package.
+
*** Subprocesses do not work.
You do not have "tty" in your CYGWIN environment variable. This must
fi
+
for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strerror tzset ulimit usleep waitpid vsnprintf fsync ftruncate umask
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10863: checking for $ac_func" >&5
+echo "configure:10864: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 10866 "configure"
+#line 10867 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:10889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
done
+if test "$ac_cv_func_getaddrinfo" != "no" ; then
+ case "$opsys" in
+ hpux11 )
+ echo "configure: warning: Use of getaddrinfo is disabled for HP-UX 11.XX." 1>&2
+ ac_cv_func_getaddrinfo=no
+ ;;
+ esac
+fi
+
for ac_func in getpt _getpty grantpt unlockpt ptsname killpg tcgetpgrp
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10921: checking for $ac_func" >&5
+echo "configure:10931: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 10924 "configure"
+#line 10934 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:10947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10957: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking for openpty""... $ac_c" 1>&6
-echo "configure:10976: checking for openpty" >&5
+echo "configure:10986: checking for openpty" >&5
cat > conftest.$ac_ext <<EOF
-#line 10979 "configure"
+#line 10989 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char openpty(); below. */
; return 0; }
EOF
-if { (eval echo configure:11002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_openpty=yes"
else
echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6
-echo "configure:11021: checking for openpty in -lutil" >&5
+echo "configure:11031: checking for openpty in -lutil" >&5
ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'`
xe_check_libs=" -lutil "
cat > conftest.$ac_ext <<EOF
-#line 11026 "configure"
+#line 11036 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
openpty()
; return 0; }
EOF
-if { (eval echo configure:11037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11072: checking for $ac_hdr" >&5
+echo "configure:11082: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11075 "configure"
+#line 11085 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11080: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11090: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11116: checking for $ac_hdr" >&5
+echo "configure:11126: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11119 "configure"
+#line 11129 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11124: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for ac_func in isastream
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11157: checking for $ac_func" >&5
+echo "configure:11167: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 11160 "configure"
+#line 11170 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:11183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11214: checking for $ac_hdr" >&5
+echo "configure:11224: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11217 "configure"
+#line 11227 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11222: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11232: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for ac_func in getloadavg
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11259: checking for $ac_func" >&5
+echo "configure:11269: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 11262 "configure"
+#line 11272 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:11285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11318: checking for $ac_hdr" >&5
+echo "configure:11328: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11321 "configure"
+#line 11331 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11326: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11336: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6
-echo "configure:11362: checking for kstat_open in -lkstat" >&5
+echo "configure:11372: checking for kstat_open in -lkstat" >&5
ac_lib_var=`echo kstat'_'kstat_open | sed 'y%./+-%__p_%'`
xe_check_libs=" -lkstat "
cat > conftest.$ac_ext <<EOF
-#line 11367 "configure"
+#line 11377 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
kstat_open()
; return 0; }
EOF
-if { (eval echo configure:11378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11413: checking for $ac_hdr" >&5
+echo "configure:11423: checking for $ac_hdr" >&5
cat > conftest.$ac_ext <<EOF
-#line 11416 "configure"
+#line 11426 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11431: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6
-echo "configure:11453: checking for kvm_read in -lkvm" >&5
+echo "configure:11463: checking for kvm_read in -lkvm" >&5
ac_lib_var=`echo kvm'_'kvm_read | sed 'y%./+-%__p_%'`
xe_check_libs=" -lkvm "
cat > conftest.$ac_ext <<EOF
-#line 11458 "configure"
+#line 11468 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
kvm_read()
; return 0; }
EOF
-if { (eval echo configure:11469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
-echo "configure:11503: checking whether netdb declares h_errno" >&5
+echo "configure:11513: checking whether netdb declares h_errno" >&5
cat > conftest.$ac_ext <<EOF
-#line 11505 "configure"
+#line 11515 "configure"
#include "confdefs.h"
#include <netdb.h>
int main() {
return h_errno;
; return 0; }
EOF
-if { (eval echo configure:11512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
{ test "$extra_verbose" = "yes" && cat << \EOF
rm -f conftest*
echo $ac_n "checking for sigsetjmp""... $ac_c" 1>&6
-echo "configure:11532: checking for sigsetjmp" >&5
+echo "configure:11542: checking for sigsetjmp" >&5
cat > conftest.$ac_ext <<EOF
-#line 11534 "configure"
+#line 11544 "configure"
#include "confdefs.h"
#include <setjmp.h>
int main() {
sigjmp_buf bar; sigsetjmp (bar, 0);
; return 0; }
EOF
-if { (eval echo configure:11541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11551: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
{ test "$extra_verbose" = "yes" && cat << \EOF
rm -f conftest*
echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
-echo "configure:11561: checking whether localtime caches TZ" >&5
+echo "configure:11571: checking whether localtime caches TZ" >&5
if test "$ac_cv_func_tzset" = "yes"; then
cat > conftest.$ac_ext <<EOF
-#line 11565 "configure"
+#line 11575 "configure"
#include "confdefs.h"
#include <time.h>
#if STDC_HEADERS
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
if test "$HAVE_TIMEVAL" = "yes"; then
echo $ac_n "checking whether gettimeofday accepts one or two arguments""... $ac_c" 1>&6
-echo "configure:11630: checking whether gettimeofday accepts one or two arguments" >&5
+echo "configure:11640: checking whether gettimeofday accepts one or two arguments" >&5
cat > conftest.$ac_ext <<EOF
-#line 11632 "configure"
+#line 11642 "configure"
#include "confdefs.h"
#ifdef TIME_WITH_SYS_TIME
; return 0; }
EOF
-if { (eval echo configure:11653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
echo "$ac_t""two" 1>&6
else
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:11675: checking for inline" >&5
+echo "configure:11685: checking for inline" >&5
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF
-#line 11680 "configure"
+#line 11690 "configure"
#include "confdefs.h"
int main() {
} $ac_kw foo() {
; return 0; }
EOF
-if { (eval echo configure:11687: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11697: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_inline=$ac_kw; break
else
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:11728: checking for working alloca.h" >&5
+echo "configure:11738: checking for working alloca.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11731 "configure"
+#line 11741 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:11738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:11762: checking for alloca" >&5
+echo "configure:11772: checking for alloca" >&5
cat > conftest.$ac_ext <<EOF
-#line 11765 "configure"
+#line 11775 "configure"
#include "confdefs.h"
#ifdef __GNUC__
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:11793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:11832: checking whether alloca needs Cray hooks" >&5
+echo "configure:11842: checking whether alloca needs Cray hooks" >&5
cat > conftest.$ac_ext <<EOF
-#line 11835 "configure"
+#line 11845 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11859: checking for $ac_func" >&5
+echo "configure:11869: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 11862 "configure"
+#line 11872 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:11885: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:11915: checking stack direction for C alloca" >&5
+echo "configure:11925: checking stack direction for C alloca" >&5
cat > conftest.$ac_ext <<EOF
-#line 11918 "configure"
+#line 11928 "configure"
#include "confdefs.h"
find_stack_direction ()
{
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:11937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_c_stack_direction=1
else
ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:11967: checking for vfork.h" >&5
+echo "configure:11977: checking for vfork.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 11970 "configure"
+#line 11980 "configure"
#include "confdefs.h"
#include <vfork.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11975: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11985: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
fi
echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:12003: checking for working vfork" >&5
+echo "configure:12013: checking for working vfork" >&5
cat > conftest.$ac_ext <<EOF
-#line 12006 "configure"
+#line 12016 "configure"
#include "confdefs.h"
/* Thanks to Paul Eggert for this test. */
#include <stdio.h>
}
}
EOF
-if { (eval echo configure:12101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_func_vfork_works=yes
else
echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
-echo "configure:12127: checking for working strcoll" >&5
+echo "configure:12137: checking for working strcoll" >&5
cat > conftest.$ac_ext <<EOF
-#line 12130 "configure"
+#line 12140 "configure"
#include "confdefs.h"
#include <string.h>
main ()
strcoll ("123", "456") >= 0);
}
EOF
-if { (eval echo configure:12140: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_func_strcoll_works=yes
else
for ac_func in getpgrp
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12168: checking for $ac_func" >&5
+echo "configure:12178: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 12171 "configure"
+#line 12181 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:12194: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
done
echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:12222: checking whether getpgrp takes no argument" >&5
+echo "configure:12232: checking whether getpgrp takes no argument" >&5
cat > conftest.$ac_ext <<EOF
-#line 12225 "configure"
+#line 12235 "configure"
#include "confdefs.h"
/*
}
EOF
-if { (eval echo configure:12280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:12290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
ac_cv_func_getpgrp_void=yes
else
echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:12307: checking for working mmap" >&5
+echo "configure:12317: checking for working mmap" >&5
case "$opsys" in ultrix* ) have_mmap=no ;; *)
cat > conftest.$ac_ext <<EOF
-#line 12310 "configure"
+#line 12320 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <unistd.h>
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
if test "$rel_alloc $have_mmap" = "default yes"; then
if test "$doug_lea_malloc" = "yes"; then
echo $ac_n "checking for M_MMAP_THRESHOLD""... $ac_c" 1>&6
-echo "configure:12372: checking for M_MMAP_THRESHOLD" >&5
+echo "configure:12382: checking for M_MMAP_THRESHOLD" >&5
cat > conftest.$ac_ext <<EOF
-#line 12374 "configure"
+#line 12384 "configure"
#include "confdefs.h"
#include <malloc.h>
int main() {
; 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
ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for termios.h""... $ac_c" 1>&6
-echo "configure:12411: checking for termios.h" >&5
+echo "configure:12421: checking for termios.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12414 "configure"
+#line 12424 "configure"
#include "confdefs.h"
#include <termios.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12419: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12429: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "$ac_t""no" 1>&6
ac_safe=`echo "termio.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for termio.h""... $ac_c" 1>&6
-echo "configure:12462: checking for termio.h" >&5
+echo "configure:12472: checking for termio.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12465 "configure"
+#line 12475 "configure"
#include "confdefs.h"
#include <termio.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12470: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12480: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:12502: checking for socket" >&5
+echo "configure:12512: checking for socket" >&5
cat > conftest.$ac_ext <<EOF
-#line 12505 "configure"
+#line 12515 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char socket(); below. */
; return 0; }
EOF
-if { (eval echo configure:12528: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_socket=yes"
else
echo "$ac_t""yes" 1>&6
ac_safe=`echo "netinet/in.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for netinet/in.h""... $ac_c" 1>&6
-echo "configure:12543: checking for netinet/in.h" >&5
+echo "configure:12553: checking for netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12546 "configure"
+#line 12556 "configure"
#include "confdefs.h"
#include <netinet/in.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12561: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
ac_safe=`echo "arpa/inet.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for arpa/inet.h""... $ac_c" 1>&6
-echo "configure:12568: checking for arpa/inet.h" >&5
+echo "configure:12578: checking for arpa/inet.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12571 "configure"
+#line 12581 "configure"
#include "confdefs.h"
#include <arpa/inet.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12576: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12586: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
}
echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:12601: checking "for sun_len member in struct sockaddr_un"" >&5
+echo "configure:12611: checking "for sun_len member in struct sockaddr_un"" >&5
cat > conftest.$ac_ext <<EOF
-#line 12603 "configure"
+#line 12613 "configure"
#include "confdefs.h"
#include <sys/types.h>
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
fi
rm -f conftest*
echo $ac_n "checking "for ip_mreq struct in netinet/in.h"""... $ac_c" 1>&6
-echo "configure:12632: checking "for ip_mreq struct in netinet/in.h"" >&5
+echo "configure:12642: checking "for ip_mreq struct in netinet/in.h"" >&5
cat > conftest.$ac_ext <<EOF
-#line 12634 "configure"
+#line 12644 "configure"
#include "confdefs.h"
#include <sys/types.h>
static struct ip_mreq x;
; return 0; }
EOF
-if { (eval echo configure:12644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
Defining HAVE_MULTICAST
echo $ac_n "checking for msgget""... $ac_c" 1>&6
-echo "configure:12675: checking for msgget" >&5
+echo "configure:12685: checking for msgget" >&5
cat > conftest.$ac_ext <<EOF
-#line 12678 "configure"
+#line 12688 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char msgget(); below. */
; return 0; }
EOF
-if { (eval echo configure:12701: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_msgget=yes"
else
echo "$ac_t""yes" 1>&6
ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:12716: checking for sys/ipc.h" >&5
+echo "configure:12726: checking for sys/ipc.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12719 "configure"
+#line 12729 "configure"
#include "confdefs.h"
#include <sys/ipc.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12724: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6
-echo "configure:12741: checking for sys/msg.h" >&5
+echo "configure:12751: checking for sys/msg.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12744 "configure"
+#line 12754 "configure"
#include "confdefs.h"
#include <sys/msg.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12749: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dirent.h""... $ac_c" 1>&6
-echo "configure:12787: checking for dirent.h" >&5
+echo "configure:12797: checking for dirent.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12790 "configure"
+#line 12800 "configure"
#include "confdefs.h"
#include <dirent.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12795: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12805: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "$ac_t""no" 1>&6
ac_safe=`echo "sys/dir.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/dir.h""... $ac_c" 1>&6
-echo "configure:12822: checking for sys/dir.h" >&5
+echo "configure:12832: checking for sys/dir.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12825 "configure"
+#line 12835 "configure"
#include "confdefs.h"
#include <sys/dir.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12830: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for nlist.h""... $ac_c" 1>&6
-echo "configure:12863: checking for nlist.h" >&5
+echo "configure:12873: checking for nlist.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12866 "configure"
+#line 12876 "configure"
#include "confdefs.h"
#include <nlist.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12871: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12881: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "checking "for sound support"" 1>&6
-echo "configure:12901: checking "for sound support"" >&5
+echo "configure:12911: checking "for sound support"" >&5
test -z "$with_native_sound" -a -n "$native_sound_lib" && with_native_sound=yes
if test "$with_native_sound" != "no"; then
if test -n "$native_sound_lib"; then
ac_safe=`echo "multimedia/audio_device.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for multimedia/audio_device.h""... $ac_c" 1>&6
-echo "configure:12908: checking for multimedia/audio_device.h" >&5
+echo "configure:12918: checking for multimedia/audio_device.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 12911 "configure"
+#line 12921 "configure"
#include "confdefs.h"
#include <multimedia/audio_device.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12926: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test -z "$native_sound_lib"; then
echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6
-echo "configure:12964: checking for ALopenport in -laudio" >&5
+echo "configure:12974: checking for ALopenport in -laudio" >&5
ac_lib_var=`echo audio'_'ALopenport | sed 'y%./+-%__p_%'`
xe_check_libs=" -laudio "
cat > conftest.$ac_ext <<EOF
-#line 12969 "configure"
+#line 12979 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
ALopenport()
; return 0; }
EOF
-if { (eval echo configure:12980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test -z "$native_sound_lib"; then
echo $ac_n "checking for AOpenAudio in -lAlib""... $ac_c" 1>&6
-echo "configure:13011: checking for AOpenAudio in -lAlib" >&5
+echo "configure:13021: checking for AOpenAudio in -lAlib" >&5
ac_lib_var=`echo Alib'_'AOpenAudio | sed 'y%./+-%__p_%'`
xe_check_libs=" -lAlib "
cat > conftest.$ac_ext <<EOF
-#line 13016 "configure"
+#line 13026 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
AOpenAudio()
; return 0; }
EOF
-if { (eval echo configure:13027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for dir in "machine" "sys" "linux"; do
ac_safe=`echo "${dir}/soundcard.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ${dir}/soundcard.h""... $ac_c" 1>&6
-echo "configure:13072: checking for ${dir}/soundcard.h" >&5
+echo "configure:13082: checking for ${dir}/soundcard.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13075 "configure"
+#line 13085 "configure"
#include "confdefs.h"
#include <${dir}/soundcard.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13080: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13090: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test "$with_nas_sound" != "no"; then
ac_safe=`echo "audio/audiolib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for audio/audiolib.h""... $ac_c" 1>&6
-echo "configure:13134: checking for audio/audiolib.h" >&5
+echo "configure:13144: checking for audio/audiolib.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13137 "configure"
+#line 13147 "configure"
#include "confdefs.h"
#include <audio/audiolib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13142: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13152: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for AuOpenServer in -laudio""... $ac_c" 1>&6
-echo "configure:13160: checking for AuOpenServer in -laudio" >&5
+echo "configure:13170: checking for AuOpenServer in -laudio" >&5
ac_lib_var=`echo audio'_'AuOpenServer | sed 'y%./+-%__p_%'`
xe_check_libs=" -laudio "
cat > conftest.$ac_ext <<EOF
-#line 13165 "configure"
+#line 13175 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
AuOpenServer()
; return 0; }
EOF
-if { (eval echo configure:13176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13186: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
fi
libs_x="-laudio $libs_x" && if test "$extra_verbose" = "yes"; then echo " Prepending \"-laudio\" to \$libs_x"; fi
cat > conftest.$ac_ext <<EOF
-#line 13215 "configure"
+#line 13225 "configure"
#include "confdefs.h"
#include <audio/Xtutil.h>
EOF
# Extract the first word of "esd-config", so it can be a program name with args.
set dummy esd-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:13246: checking for $ac_word" >&5
+echo "configure:13256: checking for $ac_word" >&5
if test -n "$have_esd_config"; then
ac_cv_prog_have_esd_config="$have_esd_config" # Let the user override the test.
c_switch_site="$c_switch_site `esd-config --cflags`" && if test "$extra_verbose" = "yes"; then echo " Appending \"`esd-config --cflags`\" to \$c_switch_site"; fi
LIBS="`esd-config --libs` $LIBS" && if test "$extra_verbose" = "yes"; then echo " Prepending \"`esd-config --libs`\" to \$LIBS"; fi
echo $ac_n "checking for esd_play_stream""... $ac_c" 1>&6
-echo "configure:13275: checking for esd_play_stream" >&5
+echo "configure:13285: checking for esd_play_stream" >&5
cat > conftest.$ac_ext <<EOF
-#line 13278 "configure"
+#line 13288 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char esd_play_stream(); below. */
; return 0; }
EOF
-if { (eval echo configure:13301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_esd_play_stream=yes"
else
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
if test -z "$with_ncurses"; then
echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:13368: checking for tgetent in -lncurses" >&5
+echo "configure:13378: checking for tgetent in -lncurses" >&5
ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
xe_check_libs=" -lncurses "
cat > conftest.$ac_ext <<EOF
-#line 13373 "configure"
+#line 13383 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:13384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:13417: checking for ncurses/curses.h" >&5
+echo "configure:13427: checking for ncurses/curses.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13420 "configure"
+#line 13430 "configure"
#include "confdefs.h"
#include <ncurses/curses.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13425: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13435: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6
-echo "configure:13447: checking for ncurses/term.h" >&5
+echo "configure:13457: checking for ncurses/term.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13450 "configure"
+#line 13460 "configure"
#include "confdefs.h"
#include <ncurses/term.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13455: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13465: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
c_switch_site="$c_switch_site -I/usr/include/ncurses"
ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:13485: checking for ncurses/curses.h" >&5
+echo "configure:13495: checking for ncurses/curses.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13488 "configure"
+#line 13498 "configure"
#include "confdefs.h"
#include <ncurses/curses.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13493: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for lib in curses termlib termcap; do
echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6
-echo "configure:13528: checking for tgetent in -l$lib" >&5
+echo "configure:13538: checking for tgetent in -l$lib" >&5
ac_lib_var=`echo $lib'_'tgetent | sed 'y%./+-%__p_%'`
xe_check_libs=" -l$lib "
cat > conftest.$ac_ext <<EOF
-#line 13533 "configure"
+#line 13543 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:13544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else if test -n "$libs_termcap" -a "$opsys" = "openbsd"; then
echo $ac_n "checking for tgoto in -ltermcap""... $ac_c" 1>&6
-echo "configure:13569: checking for tgoto in -ltermcap" >&5
+echo "configure:13579: checking for tgoto in -ltermcap" >&5
ac_lib_var=`echo termcap'_'tgoto | sed 'y%./+-%__p_%'`
xe_check_libs=" -ltermcap "
cat > conftest.$ac_ext <<EOF
-#line 13574 "configure"
+#line 13584 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgoto()
; return 0; }
EOF
-if { (eval echo configure:13585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:13630: checking for tgetent in -lcurses" >&5
+echo "configure:13640: checking for tgetent in -lcurses" >&5
ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
xe_check_libs=" -lcurses "
cat > conftest.$ac_ext <<EOF
-#line 13635 "configure"
+#line 13645 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:13646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:13664: checking for tgetent in -ltermcap" >&5
+echo "configure:13674: checking for tgetent in -ltermcap" >&5
ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
xe_check_libs=" -ltermcap "
cat > conftest.$ac_ext <<EOF
-#line 13669 "configure"
+#line 13679 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:13680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test -z "$with_gpm" && { ac_safe=`echo "gpm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for gpm.h""... $ac_c" 1>&6
-echo "configure:13728: checking for gpm.h" >&5
+echo "configure:13738: checking for gpm.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13731 "configure"
+#line 13741 "configure"
#include "confdefs.h"
#include <gpm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13746: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
}
test -z "$with_gpm" && {
echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:13759: checking for Gpm_Open in -lgpm" >&5
+echo "configure:13769: checking for Gpm_Open in -lgpm" >&5
ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
xe_check_libs=" -lgpm "
cat > conftest.$ac_ext <<EOF
-#line 13764 "configure"
+#line 13774 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
Gpm_Open()
; return 0; }
EOF
-if { (eval echo configure:13775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
test "$with_database_gdbm $with_database_dbm $with_database_berkdb" \
!= "no no no" && echo "checking for database support" 1>&6
-echo "configure:13825: checking for database support" >&5
+echo "configure:13835: checking for database support" >&5
if test "$with_database_gdbm $with_database_dbm" != "no no"; then
ac_safe=`echo "ndbm.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for ndbm.h""... $ac_c" 1>&6
-echo "configure:13830: checking for ndbm.h" >&5
+echo "configure:13840: checking for ndbm.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 13833 "configure"
+#line 13843 "configure"
#include "confdefs.h"
#include <ndbm.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13838: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test "$with_database_gdbm" != "no"; then
echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6
-echo "configure:13868: checking for dbm_open in -lgdbm" >&5
+echo "configure:13878: checking for dbm_open in -lgdbm" >&5
ac_lib_var=`echo gdbm'_'dbm_open | sed 'y%./+-%__p_%'`
xe_check_libs=" -lgdbm "
cat > conftest.$ac_ext <<EOF
-#line 13873 "configure"
+#line 13883 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dbm_open()
; return 0; }
EOF
-if { (eval echo configure:13884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_database_dbm" != "no"; then
echo $ac_n "checking for dbm_open""... $ac_c" 1>&6
-echo "configure:13912: checking for dbm_open" >&5
+echo "configure:13922: checking for dbm_open" >&5
cat > conftest.$ac_ext <<EOF
-#line 13915 "configure"
+#line 13925 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char dbm_open(); below. */
; return 0; }
EOF
-if { (eval echo configure:13938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_dbm_open=yes"
else
echo $ac_n "checking for dbm_open in -ldbm""... $ac_c" 1>&6
-echo "configure:13957: checking for dbm_open in -ldbm" >&5
+echo "configure:13967: checking for dbm_open in -ldbm" >&5
ac_lib_var=`echo dbm'_'dbm_open | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldbm "
cat > conftest.$ac_ext <<EOF
-#line 13962 "configure"
+#line 13972 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dbm_open()
; return 0; }
EOF
-if { (eval echo configure:13973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_database_berkdb" != "no"; then
echo $ac_n "checking for Berkeley db.h""... $ac_c" 1>&6
-echo "configure:14014: checking for Berkeley db.h" >&5
+echo "configure:14024: checking for Berkeley db.h" >&5
for header in "db/db.h" "db.h"; do
cat > conftest.$ac_ext <<EOF
-#line 14017 "configure"
+#line 14027 "configure"
#include "confdefs.h"
#include <stdlib.h>
; 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
if test "$with_database_berkdb" != "no"; then
echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6
-echo "configure:14055: checking for Berkeley DB version" >&5
+echo "configure:14065: checking for Berkeley DB version" >&5
cat > conftest.$ac_ext <<EOF
-#line 14057 "configure"
+#line 14067 "configure"
#include "confdefs.h"
#include <$db_h_file>
#if DB_VERSION_MAJOR > 1
egrep "yes" >/dev/null 2>&1; then
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 14069 "configure"
+#line 14079 "configure"
#include "confdefs.h"
#include <$db_h_file>
#if DB_VERSION_MAJOR > 2
rm -f conftest*
echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6
-echo "configure:14096: checking for $dbfunc" >&5
+echo "configure:14106: checking for $dbfunc" >&5
cat > conftest.$ac_ext <<EOF
-#line 14099 "configure"
+#line 14109 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $dbfunc(); below. */
; return 0; }
EOF
-if { (eval echo configure:14122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$dbfunc=yes"
else
echo $ac_n "checking for $dbfunc in -ldb""... $ac_c" 1>&6
-echo "configure:14141: checking for $dbfunc in -ldb" >&5
+echo "configure:14151: checking for $dbfunc in -ldb" >&5
ac_lib_var=`echo db'_'$dbfunc | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldb "
cat > conftest.$ac_ext <<EOF
-#line 14146 "configure"
+#line 14156 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
$dbfunc()
; return 0; }
EOF
-if { (eval echo configure:14157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_socks" = "yes"; then
echo $ac_n "checking for SOCKSinit in -lsocks""... $ac_c" 1>&6
-echo "configure:14221: checking for SOCKSinit in -lsocks" >&5
+echo "configure:14231: checking for SOCKSinit in -lsocks" >&5
ac_lib_var=`echo socks'_'SOCKSinit | sed 'y%./+-%__p_%'`
xe_check_libs=" -lsocks "
cat > conftest.$ac_ext <<EOF
-#line 14226 "configure"
+#line 14236 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
SOCKSinit()
; return 0; }
EOF
-if { (eval echo configure:14237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$with_modules" != "no"; then
echo "checking for module support" 1>&6
-echo "configure:14292: checking for module support" >&5
+echo "configure:14302: checking for module support" >&5
if test "$with_msw" = "yes"; then
have_dl=yes;
else
ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
-echo "configure:14299: checking for dlfcn.h" >&5
+echo "configure:14309: checking for dlfcn.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 14302 "configure"
+#line 14312 "configure"
#include "confdefs.h"
#include <dlfcn.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14307: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:14317: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6
-echo "configure:14324: checking for dlopen in -lc" >&5
+echo "configure:14334: checking for dlopen in -lc" >&5
cat > conftest.$ac_ext <<EOF
-#line 14326 "configure"
+#line 14336 "configure"
#include "confdefs.h"
#include <dlfcn.h>
int main() {
dlopen ("", 0);
; return 0; }
EOF
-if { (eval echo configure:14333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
have_dl=yes
else
rm -rf conftest*
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:14342: checking for dlopen in -ldl" >&5
+echo "configure:14352: checking for dlopen in -ldl" >&5
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 14346 "configure"
+#line 14356 "configure"
#include "confdefs.h"
#include <dlfcn.h>
int main() {
dlopen ("", 0);
; return 0; }
EOF
-if { (eval echo configure:14353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
have_dl=yes
else
else
echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "configure:14382: checking for shl_load in -ldld" >&5
+echo "configure:14392: checking for shl_load in -ldld" >&5
ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldld "
cat > conftest.$ac_ext <<EOF
-#line 14387 "configure"
+#line 14397 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
shl_load()
; return 0; }
EOF
-if { (eval echo configure:14398: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6
-echo "configure:14425: checking for dld_init in -ldld" >&5
+echo "configure:14435: checking for dld_init in -ldld" >&5
ac_lib_var=`echo dld'_'dld_init | sed 'y%./+-%__p_%'`
xe_check_libs=" -ldld "
cat > conftest.$ac_ext <<EOF
-#line 14430 "configure"
+#line 14440 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dld_init()
; return 0; }
EOF
-if { (eval echo configure:14441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
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*) ;;
XEGCC=yes
else
echo $ac_n "checking checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:14514: checking checking whether we are using GNU C" >&5
+echo "configure:14524: checking checking whether we are using GNU C" >&5
cat > conftest.$ac_ext <<EOF
-#line 14516 "configure"
+#line 14526 "configure"
#include "confdefs.h"
#ifdef __GNUC__
fi
echo $ac_n "checking how to produce PIC code""... $ac_c" 1>&6
-echo "configure:14538: checking how to produce PIC code" >&5
+echo "configure:14548: checking how to produce PIC code" >&5
wl=
can_build_shared=yes
# Check to make sure the dll_cflags actually works.
echo $ac_n "checking if PIC flag ${dll_cflags} really works""... $ac_c" 1>&6
-echo "configure:14639: checking if PIC flag ${dll_cflags} really works" >&5
+echo "configure:14649: checking if PIC flag ${dll_cflags} really works" >&5
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $dll_cflags -DPIC"
cat > conftest.$ac_ext <<EOF
-#line 14643 "configure"
+#line 14653 "configure"
#include "confdefs.h"
int main() {
int x=0;
; return 0; }
EOF
-if { (eval echo configure:14650: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
# On HP-UX, the stripped-down bundled CC doesn't accept +Z, but also
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"
xe_libs=
ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
cat > conftest.$ac_ext <<EOF
-#line 14732 "configure"
+#line 14742 "configure"
#include "confdefs.h"
int main() {
int x=0;
; return 0; }
EOF
-if { (eval echo configure:14739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
cc_produces_so=yes
else
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.
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
# Check to see if it really is or isn't GNU ld.
echo $ac_n "checking if the linker is GNU ld""... $ac_c" 1>&6
-echo "configure:14828: checking if the linker is GNU ld" >&5
+echo "configure:14838: checking if the linker is GNU ld" >&5
# I'd rather use --version here, but apparently some GNU ld's only accept -v.
if $LTLD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
xe_gnu_ld=yes
# 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
for ac_func in dlerror _dlerror
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:15067: checking for $ac_func" >&5
+echo "configure:15077: checking for $ac_func" >&5
cat > conftest.$ac_ext <<EOF
-#line 15070 "configure"
+#line 15080 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:15093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
fi
cat > conftest.$ac_ext <<EOF
-#line 15132 "configure"
+#line 15142 "configure"
#include "confdefs.h"
int main(int c,char *v[]){return 0;}
EOF
-if { (eval echo configure:15136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:15146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
then
:
else
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 ----------------------------------------------------------------
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:
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.
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
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
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
------------------------------------------
** Creating patches for submission
==================================
-Patches to XEmacs should be mailed to <xemacs-patches@xemacs.org>.
-Each patch will be reviewed by the patches review board, and will be
+All patches to XEmacs that are seriously proposed for inclusion (eg,
+bug fixes) should be mailed to <xemacs-patches@xemacs.org>. Each
+patch will be reviewed by the patches review board, and will be
acknowledged and added to the distribution, or rejected with an
explanation. Progress of the patch is tracked on the XEmacs Patches
-mailing list, which is open subscription.
+mailing list, which is open subscription. (If a patch is simply
+intended to facilitate discussion, "I mean something that works like
+this but this is really rough", a CC to XEmacs Patches is optional,
+but doesn't hurt.)
Patches to XEmacs Lisp packages should be sent to the maintainer of
the package. If the maintainer is listed as `XEmacs Development Team'
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
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.
! *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
!
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.
>> Déplacez le curseur sur la ligne blanche en dessous de ce
paragraphe, puis tapez
- M-x repls<Return>Remarquez<Return>Notez<Return>.
+ M-x repl<Return>s<Return>Remarquez<Return>Notez<Return>.
Remarquez comme cette ligne a changé: le mot R-e-m-a-r-q-u-e-z a
été remplacé par N-o-t-e-z partout où il est apparu après le
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * font-lock.el (font-lock-fontify-keywords-region): Fix typo.
+
+2002-10-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * keydefs.el (global-map): Bind C-xrd to delete-rectangle per GNU.
+
+2001-05-10 Daiki Ueno <ueno@unixuser.org>
+
+ * font-lock.el (font-lock-compile-keywords): Rewrite as a side
+ effect free function.
+ (font-lock-fontify-keywords-region): Supply the argument to
+ font-lock-compile-keywords.
+
+2002-09-22 Ville Skyttä <ville.skytta@xemacs.org>
+
+ * package-get.el (package-get-download-sites): Bring sites list
+ up to date, prefer xx.xemacs.org addresses.
+
+2002-09-27 Andy Piper <andy@xemacs.org>
+
+ * dialog.el (make-dialog-box): for general dialogs only
+ delete-frame-hook will be run.
+
+2002-09-28 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * font-lock.el (font-lock-fontify-syntactically-region): Add
+ comment about lookup-syntax-properties, document LOUDLY as unused.
+
+2002-08-26 Andy Piper <andy@xemacs.org>
+
+ * gutter-items.el (set-progress-feedback-instantiator): Fix bad
+ merge.
+
+2002-09-02 Ville Skyttä <ville.skytta@xemacs.org>
+
+ * bytecomp-runtime.el (make-obsolete): Docstring argument nit.
+ (make-obsolete-variable): Ditto.
+ (make-compatible): Ditto.
+ (make-compatible-variable): Ditto.
+
+2002-09-16 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * obsolete.el (parse-sexp-lookup-properties): new compatible alias
+ for `lookup-syntax-properties'. RFE from Alan Mackenzie.
+
+2002-08-28 Andy Piper <andy@xemacs.org>
+
+ * files.el (revert-buffer): propagate revert-without-query-status.
+
+2002-06-03 Andy Piper <andy@xemacs.org>
+
+ * dialog-items.el (make-search-dialog): align various subcontrols
+ in visually pleasing ways, allow frame to autosize to the dialog
+ size.
+ * dialog.el (make-dialog-box): add a border inside the frame. Add
+ :autosize property, if t then reset the frame size appropriately
+ before the frame is mapped.
+ * gutter-items.el (set-progress-feedback-instantiator): align
+ various subcontrols.
+ * gutter-items.el (set-progress-abort-instantiator): ditto.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
;;;### (autoloads (build-report) "build-report" "lisp/build-report.el")
(autoload 'build-report "build-report" "\
-Composes a fresh mail message with the contents of the built XEmacs
-Installation file and excerpts from XEmacs make output.
-`compose-mail' is used to create the mail message. Point is left at
-the beginning of the mail text. You may add some personal notes if
-you like and send the report.
-See also
- `compose-mail', `mail-user-agent',
- `build-report-destination',
- `build-report-keep-regexp',
- `build-report-delete-regexp',
- `build-report-make-output-dir',
- `build-report-make-output-files', and
- `build-report-installation-file'." t nil)
+Report build information including Installation and make output.
+
+Prompts for status (usually \"Success\" or \"Failure\"). Then uses
+`compose-mail' to create a mail message. The Subject header contains
+status and version information. Point is left at the beginning of the
+mail text. Add some notes if you like, and send the report.
+
+Looks for Installation and the make output file (`beta.err' by
+default, customizable via `build-report-make-output-files') in the
+build directory of the running XEmacs by default (customizable via
+`build-report-make-output-dir'). The output from make is filtered
+through `build-report-keep-regexp' and `build-report-delete-regexp'
+before including in the message.
+
+See also `mail-user-agent', `build-report-destination', and
+`build-report-installation-file'." t nil)
;;;***
\f
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:
\f
;;;### (autoloads (x-font-build-cache font-default-size-for-device font-default-encoding-for-device font-default-registry-for-device font-default-family-for-device font-default-object-for-device font-default-font-for-device font-create-object) "font" "lisp/font.el")
-(autoload 'font-create-object "font" nil nil nil)
+(autoload 'font-create-object "font" "\
+Return a font descriptor object for FONTNAME, appropriate for DEVICE." nil nil)
(autoload 'font-default-font-for-device "font" nil nil nil)
when they are selected for the first time. If you add fonts to your system,
or if you change your font path, you can call this to re-initialize the menus." nil nil)
-(defun* mswindows-font-menu-font-data (face dcache) (let* ((case-fold-search t) (domain (if font-menu-this-frame-only-p (selected-frame) (selected-device))) (name (font-instance-name (face-font-instance face domain))) (truename (font-instance-truename (face-font-instance face domain (if (featurep 'mule) 'ascii)))) family size weight entry slant) (when (string-match mswindows-font-regexp name) (setq family (match-string 1 name)) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match mswindows-font-regexp truename)) (setq family (match-string 1 truename)) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from mswindows-font-menu-font-data (make-vector 5 nil))) (when (string-match mswindows-font-regexp name) (setq weight (match-string 2 name)) (setq size (string-to-int (match-string 4 name)))) (when (string-match mswindows-font-regexp truename) (when (not (member weight (aref entry 1))) (setq weight (match-string 2 truename))) (when (not (member size (aref entry 2))) (setq size (string-to-int (match-string 4 truename)))) (setq slant (match-string 5 truename))) (vector entry family size weight slant)))
+(defun* mswindows-font-menu-font-data (face dcache) (let* ((case-fold-search t) (domain (if font-menu-this-frame-only-p (selected-frame) (selected-device))) (name (font-instance-name (face-font-instance face domain))) (truename (font-instance-truename (face-font-instance face domain (if (featurep 'mule) 'ascii)))) family size weight entry slant) (when (string-match mswindows-font-regexp name) (setq family (match-string 1 name)) (setq entry (vassoc family (aref dcache 0)))) (when (and (null entry) (string-match mswindows-font-regexp truename)) (setq family (match-string 1 truename)) (setq entry (vassoc family (aref dcache 0)))) (when (null entry) (return-from mswindows-font-menu-font-data (make-vector 5 nil))) (when (string-match mswindows-font-regexp name) (setq weight (match-string 2 name)) (setq size (string-to-int (or (match-string 4 name) "0")))) (when (string-match mswindows-font-regexp truename) (when (not (member weight (aref entry 1))) (setq weight (match-string 2 truename))) (when (not (member size (aref entry 2))) (setq size (string-to-int (or (match-string 4 truename) "0")))) (setq slant (match-string 5 truename))) (vector entry family size weight slant)))
;;;***
\f
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)
;;;***
\f
-;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "lisp/rect.el")
+;;;### (autoloads (clear-rectangle replace-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "lisp/rect.el")
(autoload 'delete-rectangle "rect" "\
Delete the text in the region-rectangle without saving it.
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.
; ''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: ")
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
;; 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: ")
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
(custom-add-loads 'menu '("menubar-items"))
(custom-add-loads 'minibuffer '("simple" "minibuf"))
(custom-add-loads 'log-message '("simple"))
-(custom-add-loads 'environment '("frame" "keydefs" "minibuf" "modeline" "window-xemacs" "menubar" "gutter" "toolbar-items" "cus-edit" "gnuserv" "sound" "x-init"))
+(custom-add-loads 'environment '("frame" "keydefs" "minibuf" "modeline" "window-xemacs" "menubar" "gutter" "toolbar-items" "x-init" "cus-edit" "gnuserv" "sound"))
(custom-add-loads 'sound '("sound"))
(custom-add-loads 'pui '("package-ui"))
(custom-add-loads 'terminals '("gnuserv"))
(custom-add-loads 'auto-save '("files" "auto-save"))
(custom-add-loads 'mail '("simple" "startup"))
+(custom-add-loads 'lpr '("printer"))
(custom-add-loads 'custom-menu '("cus-edit"))
(custom-add-loads 'docs '("hyper-apropos" "info"))
(custom-add-loads 'tools '("etags" "hyper-apropos"))
(custom-add-loads 'isearch '("isearch-mode"))
(custom-add-loads 'font-lock-faces '("font-lock"))
(custom-add-loads 'modeline '("modeline"))
-(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "dragdrop" "cus-edit"))
+(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "cus-edit" "dragdrop"))
(custom-add-loads 'matching '("simple" "isearch-mode" "hyper-apropos"))
(custom-add-loads 'i18n '("cus-edit"))
(custom-add-loads 'info '("toolbar-items" "info"))
-(custom-add-loads 'x '("gtk-faces" "x-faces"))
+(custom-add-loads 'x '("x-faces" "gtk-faces"))
(custom-add-loads 'buffers-tab '("gutter-items"))
;;; custom-load.el ends here
'general
:parent parent
:title "Search"
+ :autosize t
:spec
(setq search-dialog
(make-glyph
`[layout
- :orientation horizontal :justify left
- ;; neither the following height/width nor the identical one
- ;; below should be necessary! (see below)
- :height 11 :width 40
+ :orientation horizontal
+ :vertically-justify top
+ :horizontally-justify center
:border [string :data "Search"]
:items
- ([layout :orientation vertical :justify left
+ ([layout :orientation vertical
+ :justify top ; implies left also
:items
([string :data "Search for:"]
[button :descriptor "Match Case"
:selected (not search-dialog-direction)
:callback (setq search-dialog-direction nil)]
)]
- [layout :orientation vertical :justify left
- :items
+ [layout :orientation vertical
+ :vertically-justify top
+ :horizontally-justify right
+ :items
([edit-field :width 15 :descriptor "" :active t
- :face default :initial-focus t]
+ :initial-focus t]
[button :width 10 :descriptor "Find Next"
:callback-ex
(lambda (image-instance event)
(isearch-dehighlight)
(delete-frame
(event-channel event)))])])]))
- ;; neither this height/width nor the identical one above should
- ;; be necessary! (in fact, if you omit the one above, the layout
- ;; sizes itself correctly; but the frame as a whole doesn't use
- ;; the layout's size, as it should.)
- :properties '(height 11 width 40))))
+ ;; These are no longer strictly necessary, but not setting a size
+ ;; at all yields a much more noticeable resize since the initial
+ ;; frame is so big.
+ :properties `(height ,(widget-logical-to-character-height 6)
+ width ,(widget-logical-to-character-width 39))
+ )))
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.
---------------------------------------------------------------------------
'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
(:parent (selected-frame))
:modal
:properties
+ :autosize
:spec)
()
(flet ((create-dialog-box-frame ()
vertical-scrollbar-visible-p nil
horizontal-scrollbar-visible-p nil
unsplittable t
+ internal-border-width 8
left ,(+ fleft (- (/ fwidth 2)
(/ (* dfwidth
fontw)
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)
(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)
(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))
(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? "
;; 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
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)
\f
;; Various functions.
-(defun font-lock-compile-keywords (&optional keywords)
- "Compile KEYWORDS into the form (t KEYWORD ...).
-Here KEYWORD is of the form (MATCHER HIGHLIGHT ...) as shown in the
-`font-lock-keywords' doc string."
- (let ((keywords (or keywords font-lock-keywords)))
- (setq font-lock-keywords
- (if (eq (car-safe keywords) t)
- keywords
- (cons t (mapcar 'font-lock-compile-keyword keywords))))))
+(defun font-lock-compile-keywords (keywords)
+ "Compile KEYWORDS (a list) and return the list of compiled keywords.
+Each keyword has the form (MATCHER HIGHLIGHT ...). See `font-lock-keywords'."
+ (if (eq (car-safe keywords) t)
+ keywords
+ (cons t (mapcar 'font-lock-compile-keyword keywords))))
(defun font-lock-compile-keyword (keyword)
(cond ((nlistp keyword) ; Just MATCHER
(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)
(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
(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
(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)
(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)
;; 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).
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-29 Stephen J. Turnbull <steve@tleepslib.sk.tsukuba.ac.jp>
+
+ * lispref/compile.texi (Compilation Options): New node.
+ (Byte Compilation): Add it to menu.
+ (Compilation Functions): Minor mods.
+ (Docs and Compilation):
+ (Dynamic Loading):
+ Document some variable defaults.
+
+2002-10-23 Norbert Koch <nk@viteno.net>
+
+ * xemacs-faq.texi (Q2.0.16): Fix typo in previous commit.
+
+2002-10-18 Stephen J. Turnbull <steve@tleepslib.sk.tsukuba.ac.jp>
+
+ * xemacs-faq.texi (Q2.0.16): New FAQ on "no cygXpm-noX" fatal error.
+ (Q6.1.4): Document cygXpm-noX.
+
+2002-08-22 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * internals/internals.texi (Regression Testing XEmacs): Document
+ how to skip and warn about tests that depend on packages.
+
+2002-09-22 Ville Skyttä <ville.skytta@xemacs.org>
+
+ * xemacs/packages.texi (Available Packages): Add fortran-modes,
+ perl-modes, psgml-dtds, python-modes and ruby-modes.
+ Some consistency tweaks.
+
+2002-09-20 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * internals/internals.texi (Techniques for XEmacs Developers):
+ More performance optimization hints.
+ (Modules for Other Aspects of the Lisp Interpreter and Object System):
+ Describe syntax code internals.
+
+ * lispref/syntax.texi (Syntax Basics): XEmacs "20" -> "20 and later".
+ (Syntax Class Table): Deprecate SPC as whitespace designator.
+ (Syntax Flags): Rewrite for `8-bit' comment syntax flags.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
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
@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
@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
@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
@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.
@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.
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
@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}}
@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
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
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}
@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
@finalout
@titlepage
@title XEmacs FAQ
-@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2002/08/20 11:35:32 $
+@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2002/10/31 15:06:37 $
@sp 1
@author Tony Rossini <rossini@@biostat.washington.edu>
@author Ben Wing <ben@@xemacs.org>
* 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!
* 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!
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.
`efs-ftp-program-args'. Use M-x customize-variable, and verify the
needed flag with `man ftp' or other local documentation.
-@node Q2.1.1, Q2.1.2, Q2.0.15, Installation
+@node Q2.0.16, Q2.1.1, Q2.0.15, Installation
+@unnumberedsubsec Q2.0.16: Cygwin XEmacs won't start: cygXpm-noX4.dll was not found (NEW)
+
+The Cygwin binary distributed with the netinstaller uses an external DLL
+to handle XPM images (such as toolbar buttons). You may get an error like
+
+ This application has failed to start because cygXpm-noX4.dll was not found.
+ Re-installing the application may fix this problem.
+
+Andy Piper <andy@@xemacs.org> sez:
+
+ cygXpm-noX4 is part of the cygwin distribution under libraries or
+ graphics, but is not installed by default. You need to run the
+ cygwin setup again and select this package.
+
+Ie, reinstalling XEmacs won't help because it is not part of the XEmacs
+distribution.
+
+@node Q2.1.1, Q2.1.2, Q2.0.16, Installation
@unnumberedsec 2.1: Trouble Shooting
@unnumberedsubsec Q2.1.1: Help! XEmacs just crashed on me!
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?
/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
@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
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.
@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.
The Gnus Newsreader and Mailreader.
@item haskell-mode
-Haskell editing support.
+Haskell language support.
@item hm--html-menus
HTML editing.
compression, remote shells, etc.
@item ocaml
-Objective Caml editing support.
+Objective Caml language support.
@item pc
PC style interface emulation.
@item pcomplete
Provides programmatic completion.
+@item perl-modes
+Perl language support.
+
@item prog-modes
Miscellaneous single-file lisp files for various programming languages.
@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.
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
* all: port from cygwin setup.
-%%% $Id: ChangeLog,v 1.2.2.16 2002/08/20 11:36:02 stephent Exp $
-$Revision: 1.2.2.16 $
+%%% $Id: ChangeLog,v 1.2.2.17 2002/08/23 16:44:34 stephent Exp $
+$Revision: 1.2.2.17 $
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-13 Adrian Aichner <adrian@xemacs.org>
+
+ * xemacs.mak (OS): Remove obsolete quoting of double-quote in the
+ Installation file to avoid unnecessary deviations from the UNIX
+ version in `describe-installation' and `build-report'.
+
+2002-10-08 Andy Piper <andy@xemacs.org>
+
+ * xemacs.mak: set the stacksize to 8mb which seems to be the magic
+ number for regex.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
<<
# 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 $@
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
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-10-17 Raymond Toy <toy@rtp.ericsson.se>
+
+ * nas.c: Update for NAS 1.6 and later, from Jon Trulson. Was
+ using the NAS private array SoundFileInfo that no longer exists in
+ NAS 1.6 and later. Preserve backward compatibility with NAS 1.5a
+ and earlier. This is broken for some versions between 1.5a and
+ 1.5f.
+
+2002-10-10 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * realpath.c (win32_readlink): Try to fix truename of wildcard bug.
+
+ * emacs.c (shut_down_emacs): Improve crash message.
+
+2002-10-09 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * file-coding.c (determine_real_coding_system): Check for coding
+ cookie in first LINES_TO_CHECK lines (currently 2). Cater to
+ shebangs and Python PEP 263.
+
+2002-10-08 Andy Piper <andy@xemacs.org>
+
+ * glyphs-widget.c (layout_query_geometry): only resize dynamically
+ if static sizes haven't been set.
+
+2002-08-30 Mike Alexander <mta@arbortext.com>
+
+ * event-msw.c (winsock_closer): Use closesocket, not CloseHandle
+ to close a socket.
+
+2002-10-03 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * callproc.c (child_setup): 21.4 doesn't have retry_close.
+
+2002-09-20 Mike Sperber <mike@xemacs.org>
+
+ (This partially gets back my patch from 2002-07-20 without the
+ bug.)
+ * callproc.c (child_setup): Remove Ben's comment noting confusion
+ over the file descriptors >= 3: close_process_descs() doesn't
+ close those. Fix fd range to go up to MAXDESC-1 instead of 64.
+ * process-unix.c (unix_create_process): Call
+ begin_dont_check_for_quit to inhibit unwanted interaction (and
+ thus breaking of X event synchronicity) in the child.
+
+2002-09-26 Golubev I. N. <gin@mo.msk.ru>
+
+ * frame-x.c (x_delete_frame): do not call XtDisplay on a destroyed
+ widget.
+
+2002-08-20 Ben Sigelman <bhsigelm@cs.brown.edu>
+
+ * event-Xt.c (drain_X_queue): loop over while(XEventsQueued())
+ instead of while(XtAppPending()&XtIMXEvent). Upon a gdm logout,
+ the xemacs process did not exit, but looped infinitely here. This
+ fixes that problem.
+
+2002-09-28 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * font-lock.c (SYNTAX_START_STYLE, SYNTAX_END_STYLE): Quiet GCC.
+ (find_context): Improve comments.
+
+ * regex.c (re_compile_fastmap): Gratuitous #ifdef comment fixes.
+ (re_match_2): An XCHAR_TABLE operation was missing.
+
+ Many of the following changes were inspired by Andy Piper's (now
+ obsolete) patch to make syntax-table text property lookup optional.
+
+ [Documentation]
+
+ * syntax.h (top level): Document semantics of syntax flags.
+ * syntax.c (comstr_start, Fforward_comment): Improve comments.
+ * syntax.c, syntax.h (top level): Document syntax cache better in
+ comments.
+
+ [Instrument syntax caching (temporary change)]
+
+ * syntax.h (enum syntax_cache_statistics_functions, struct
+ syntax_cache_statistics, SCS_STATISTICS_SET_FUNCTION,
+ SYNTAX_CACHE_STATISTICS_COUNT_INIT): New types and macros.
+ * syntax.c (scan_words, Fforward_comment, scan_lists,
+ Fbackward_prefix_characters):
+ * font-lock.c (find_context):
+ Use them to instrument syntax caching.
+ * syntax.c (struct syntax_cache_statistics, scs_statistics,
+ syntax_cache_statistics_function_names): New type and variables.
+ * syntax.c (update_syntax_cache): Update and report statistics.
+
+ [Major syntax cache optimizations]
+
+ syntax.c (lookup_syntax_properties): Default off.
+
+ * syntax.h (UPDATE_SYNTAX_INTERNAL): New, implements UPDATE_SYNTAX*.
+ * syntax.c (update_syntax_cache):
+ Move init test from update_syntax_cache to UPDATE_SYNTAX_INTERNAL.
+
+ [Minor syntax cache optimizations and code clarifications]
+
+ * syntax.h (SYNTAX_COMMENT_BITS, SYNTAX_START_P, SYNTAX_END_P,
+ SYNTAX_STYLES_MATCH_START_P, SYNTAX_STYLES_MATCH_1CHAR_P,
+ SYNTAX_STYLES_MATCH_END_P, STYLE_FOUND_1CHAR_P, STYLE_FOUND_P,
+ SYNTAX_COMMENT_MASK_END, SYNTAX_COMMENT_MASK_START,
+ SYNTAX_COMMENT_1CHAR_MASK): Remove redundant argument `table'.
+ (Code clarification.)
+
+ * syntax.c (scan_words, find_end_of_comment, scan_sexps_forward,
+ scan_lists): Compute code from syncode, use Boolean macros instead
+ of redundant masking operations. (Code clarification; any decent
+ compiler can do this optimization.)
+
+ * syntax.c (scan_lists): Rearrange switches (case Sstring_fence)
+ for clarity.
+
+ * syntax.h, syntax.c (NEXT_SINGLE_PROPERTY_CHANGE,
+ PREVIOUS_SINGLE_PROPERTY_CHANGE, update_syntax_cache): Conditionally
+ use F*_single_property_change instead of F*_extent_change.
+ Currently F*_single_property_change is _much_ less efficient.
+
+ * dired.c (Fdirectory_files): Qt not valid in syntax_cache.object.
+ * syntax.h (SETUP_SYNTAX_CACHE_FOR_OBJECT): Initialize
+ syntax_cache.object properly, don't leave Qt or Qnil.
+ (SYNTAX_CACHE_BYTE_TO_CHAR): Use SETUP_SYNTAX_CACHE_FOR_OBJECT.
+ * syntax.c (update_syntax_cache): Use BUFFERP and STRINGP, not
+ tests for Qt or Qnil.
+
+2002-09-21 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * redisplay.c (point_in_line_start_cache):
+ * extents.c (print_extent_1):
+ Fix warnings.
+
+ * extents.c (Fset_extent_property): Document `syntax-table' property.
+
+ * extents.h (Fnext_single_property_change): EXFUN it.
+
+2002-09-09 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * search.c (clear_unused_search_regs): New static function.
+ (search_buffer):
+ (simple_search):
+ (boyer_moore):
+ Use it. Fixes "stale match data" bug reported by Martin Stjernholm.
+ Minor clarifications in comments.
+
+ * regex.c (re_match_2_internal): Ensure no stale submatches.
+
+2002-09-09 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * event-Xt.c (enqueue_focus_event): Add missing prototype.
+
+2002-08-29 Jerry James <james@xemacs.org>
+
+ * lisp.h: structrures -> structures.
+
+2002-06-03 Andy Piper <andy@xemacs.org>
+
+ * frame.c (frame_conversion_internal): add conversion appropriate
+ for setting frame dimensions in pixels.
+
+ * console.h (struct console_methods): add device-specific widget
+ layout functions.
+
+ * emacs.c (main_1): initialize glyph vars.
+
+ * event-Xt.c (handle_focus_event_1): call handle_focus_event_2
+ (handle_focus_event_2): new function. Allow focus to
+ be set to a particular window and widget.
+ (enqueue_focus_event): new function. Create a
+ synthetic focus event.
+ (emacs_Xt_handle_magic_event): call
+ handle_focus_event_2.
+
+ * frame.c (Fset_frame_pixel_height): new function. Allow
+ pixel-based sizing. Does the right thing on character-oriented
+ displays.
+ (Fset_frame_pixel_width): ditto.
+ (Fset_frame_pixel_size): ditto.
+ (syms_of_frame): declare.
+
+ * general-slots.h: add :vertically-justify and
+ :horizontally-justify.
+
+ * glyphs-msw.c (xbm_create_bitmap_from_data): warning fix.
+ (mswindows_widget_border_width): new function.
+ (mswindows_combo_box_instantiate): set border widths.
+ (console_type_create_glyphs_mswindows): declare.
+
+ * glyphs-widget.c:
+ (check_valid_justification): allow vertical and horizontal
+ justification.
+ (widget_border_width): new function. Call device methods.
+ (widget_instance_border_width): ditto.
+ (logical_unit_height): new function. Determine the height of a
+ logical-unit. Logical units are intended to provide grid-like
+ layout for subcontrols in a layout. If the layout is
+ :vertically-justify top then subcontrols will be positioned on
+ logical-unit boundaries, thus allowing adjacent subcontrols to
+ line up.
+ (widget_logical_unit_height): ditto for widgets.
+ (redisplay_widget): misc cleanup.
+ (widget_spacing): new function. Call device specific
+ methods. Intended to be the default gap between adjacent widgets.
+ (widget_query_geometry): use new spacing functions to determine
+ appropriate geometry.
+ (initialize_widget_image_instance): initialize horizontal and
+ vertical justification.
+ (widget_instantiate): use logica-units where appropriate for
+ sizing large widgets.
+ (button_query_geometry): use widget_instance_border_width.
+ (tree_view_query_geometry): ditto.
+ (tab_control_query_geometry): ditto.
+ (edit_field_query_geometry): new function.
+ (layout_update): pick up :justify, :horizontally-justify and
+ :vertically-justify none of which worked previously. :justify is
+ used as a fallback for both horizontal and vertical justification.
+ (layout_query_geometry): use logical units to size appropriately.
+ (layout_layout): ditto.
+ (Fwidget_logical_to_character_width): new function. Allow users to
+ convert from logical units to characters so that frame sizes can
+ be set appropriately.
+ (Fwidget_logical_to_character_height): ditto.
+ (syms_of_glyphs_widget): declare.
+ (image_instantiator_edit_fields): add edit_field_query_geometry.
+ (VALID_LAYOUT_KEYWORDS): declare :vertically-justify and
+ :horizontally-justify.
+ (specifier_vars_of_glyphs_widget): new function. Declare
+ Vwidget_border_width which is not yet used.
+
+ * glyphs-x.c (x_map_subwindow): enqueue appropriate focus events.
+ (x_widget_border_width): new function.
+ (x_widget_instantiate): create a sensible name for widgets.
+ (console_type_create_glyphs_x): declare x_widget_border_width.
+
+ * glyphs.h (DEFAULT_WIDGET_BORDER_WIDTH): new macro.
+ (struct Lisp_Image_Instance): add :vertically-justify and
+ :horizontally-justify.
+ (LAYOUT_JUSTIFY_TOP): new.
+ (IMAGE_INSTANCE_SUBWINDOW_H_JUSTIFY): new.
+ (ROUND_UP): new macro. Round argument up to next integral
+ interval.
+
+ * redisplay-output.c (redisplay_output_layout): misc formatting.
+
+ * symsinit.h: declare specifier_vars_of_glyphs_widget.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
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 */
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);
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));
*/
specifier_vars_of_glyphs ();
+ specifier_vars_of_glyphs_widget ();
specifier_vars_of_gutter ();
#ifdef HAVE_MENUBARS
specifier_vars_of_menubar ();
("Your files have been auto-saved.\n"
"Use `M-x recover-session' to recover them.\n"
"\n"
- "If you have access to the PROBLEMS file that came with your\n"
- "version of XEmacs, please check to see if your crash is described\n"
- "there, as there may be a workaround available.\n"
+ "Your version of XEmacs was distributed with a PROBLEMS file that may describe\n"
+ "your crash, and with luck a workaround. Please check it first, but do report\n"
+ "the crash anyway. "
#ifdef INFODOCK
- "Otherwise, please report this bug by selecting `Report-Bug'\n"
- "in the InfoDock menu.\n"
+ "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
+ "*BE SURE* to include the XEmacs configuration from M-x describe-installation,\n"
+ "or the file Installation in the top directory of the build tree.\n"
#else
- "Otherwise, please report this bug by running the send-pr\n"
- "script included with XEmacs, or selecting `Send Bug Report'\n"
- "from the help menu.\n"
- "As a last resort send ordinary email to `crashes@xemacs.org'.\n"
+ "Please report this bug by invoking M-x report-emacs-bug,\n"
+ "or by selecting `Send Bug Report' from the Help menu. If necessary, send\n"
+ "ordinary email to `crashes@xemacs.org'. *MAKE SURE* to include the XEmacs\n"
+ "configuration from M-x describe-installation, or equivalently the file\n"
+ "Installation in the top of the build tree.\n"
#endif
- "*MAKE SURE* to include the information in the command\n"
- "M-x describe-installation.\n"
#ifndef _MSC_VER
"\n"
- "If at all possible, *please* try to obtain a C stack backtrace;\n"
- "it will help us immensely in determining what went wrong.\n"
- "To do this, locate the core file that was produced as a result\n"
- "of this crash (it's usually called `core' and is located in the\n"
- "directory in which you started the editor, or maybe in your home\n"
- "directory), and type\n"
+ "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
+ "to be able to analyze the problem. Locate the core file produced as a result\n"
+ "of this crash (often called `core' or `core.<process-id>', and located in\n"
+ "the directory in which you started XEmacs or your home directory), and type\n"
"\n"
" gdb "
#endif
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 */
}
#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;
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
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)
}
}
+/* 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
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:
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
else
shutdown (str->s, 1);
- CloseHandle ((HANDLE)str->s);
+ closesocket (str->s);
if (str->pending_p)
WaitForSingleObject (str->ov.hEvent, INFINITE);
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);
`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))
{
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);
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,
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) == '-')
{
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) == '-')
{
}
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
}
}
+/* 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. */
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))
{
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;
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);
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! */
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. */
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
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
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.
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;
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);
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);
for (j=0; j<old_width; j++)
{
- int byte = offset[j];
+ int bite = offset[j];
new_offset[j] = ~ (unsigned char)
- ((flip_table[byte & 0xf] << 4) + flip_table[byte >> 4]);
+ ((flip_table[bite & 0xf] << 4) + flip_table[bite >> 4]);
}
}
}
}
+/* 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 */
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. */
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);
/* 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.
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;
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);
}
}
}
+/* 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
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))
}
}
+/* 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
&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. */
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
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;
}
/* 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)
||
*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 */
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;
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. */
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)))
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,
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))
!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);
}
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;
/* 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
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,
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 +
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
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;
+ }
}
}
return 1;
}
+DEFUN ("widget-logical-to-character-width", Fwidget_logical_to_character_width, 1, 3, 0, /*
+Convert the width in logical widget units to characters.
+Logical widget units do not take into account adjusments made for
+layout borders, so this adjusment is approximated.
+*/
+ (width, face, domain))
+{
+ int w, neww, charwidth;
+ int border_width = DEFAULT_WIDGET_BORDER_WIDTH;
+
+ if (NILP (domain))
+ domain = Fselected_frame (Qnil);
+
+ CHECK_INT (width);
+ w = XINT (width);
+
+ if (HAS_DEVMETH_P (DOMAIN_XDEVICE (domain), widget_border_width))
+ border_width = DEVMETH (DOMAIN_XDEVICE (domain), widget_border_width, ());
+
+ default_face_font_info (domain, 0, 0, 0, &charwidth, 0);
+ neww = ROUND_UP (charwidth * w + 4 * border_width + 2 * widget_spacing (domain),
+ charwidth) / charwidth;
+
+ return make_int (neww);
+}
+
+DEFUN ("widget-logical-to-character-height", Fwidget_logical_to_character_height, 1, 3, 0, /*
+Convert the height in logical widget units to characters.
+Logical widget units do not take into account adjusments made for
+layout borders, so this adjustment is approximated.
+
+If the components of a widget layout are justified to the top or the
+bottom then they are aligned in terms of `logical units'. This is a
+size quantity that is designed to be big enough to accomodate the
+largest `single height' widget. It is dependent on the widget face and
+some combination of spacing and border-width. Thus if you specify top
+or bottom justification in a vertical layout the subcontrols are laid
+out one per logical unit. This allows adjoining layouts to have
+identical alignment for their subcontrols.
+
+Since frame sizes are measured in characters, this function allows you
+to do appropriate conversion between logical units and characters.
+*/
+ (height, face, domain))
+{
+ int h, newh, charheight;
+
+ CHECK_INT (height);
+ if (NILP (domain))
+ domain = Fselected_frame (Qnil);
+
+ h = XINT (height);
+
+ default_face_font_info (domain, 0, 0, &charheight, 0, 0);
+ newh = ROUND_UP (logical_unit_height (Fsymbol_name (Qwidget),
+ Vwidget_face, domain) * h, charheight)
+ / charheight;
+
+ return make_int (newh);
+}
+
\f
/************************************************************************/
/* initialization */
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 { \
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);
}
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, \
{
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);
+}
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.
#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"
-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);
+ }
}
}
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, /*
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);
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
#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
{
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
#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
((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)
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_ */
#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
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));
* 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
{
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);
}
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);
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. */
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);
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.
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))
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));
}
}
while (1)
{
- unsigned int new_pos;
+ EMACS_INT new_pos;
Bufpos start, end;
pos = (bottom + top + 1) >> 1;
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
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
case at_dot:
case after_dot:
continue;
-#endif /* not emacs */
+#endif /* emacs */
case no_op:
= (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);
#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)
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,
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;
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];
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];
end = bytind_to_bufpos (buf, idx + buf_len);
}
set_search_regs (buf, beg, end - beg);
+ clear_unused_search_regs (&search_regs, 0);
return retval;
}
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)
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)
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)
XSETBUFFER (last_thing_searched, buf);
}
+/* Clear unused search registers so match data will be null.
+ REGP is a pointer to the register structure to clear, usually the global
+ search_regs.
+ NO_SUB is the number of subexpressions to allow for. (Does not count
+ the whole match, ie, for a string search NO_SUB == 0.)
+ It is an error if NO_SUB > REGP.num_regs - 1. */
+
+static void
+clear_unused_search_regs (struct re_registers *regp, int no_sub)
+{
+ /* This function has been Mule-ized. */
+ int i;
+
+ assert (no_sub >= 0 && no_sub < regp->num_regs);
+ for (i = no_sub + 1; i < regp->num_regs; i++)
+ regp->start[i] = regp->end[i] = -1;
+}
+
\f
/* Given a string of words separated by word delimiters,
compute a regexp that matches those exact words
/* 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);
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). */
};
/* 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))
{
whatever is returned by get-char-property.
It might be worth it at some point to merge provided syntax tables
- outward to the current buffer. */
+ outward to the current buffer.
+
+ sjt sez:
+ This implementation has to rather inefficient, since it looks at
+ next-extent-change, and a heavily font-locked buffer will be rife
+ with irrelevant extents. We could do a sledgehammer check on this
+ by looking at the distribution of extent lengths. Also count up
+ cache hits and misses.
+
+ If we assume that syntax-table is a _text_ property (which also
+ deals with the issue of overlapping syntax-table properties), then
+ the following strategy recommends itself
+ o give the syntax cache a `valid' flag, to be reset whenever a
+ syntax-table property is added, changed, or removed; this could
+ be done by setting syntax_cache's prev_change > next_change
+ (but not compatible with using extents/markers here); if it's a
+ Lisp variable, doing it in Lisp shouldn't be too inefficient
+ o lazily initialize the cache whenever the object being examined
+ differs from the object the cache currently refers to
+ o by using {previous,next-single-property-change} we should be
+ able to get much bigger cache intervals (in most cases, the
+ whole buffer)
+ o cache markers instead of positions so the mere insertion or
+ deletion of text doesn't invalidate the cache, only if it
+ involves a syntax-table property (we could also cache the
+ extents carrying the syntax-table text-property; that gives us
+ another check for invalid cache).
+
+ If I understand this correctly, we need to invalidate the cache in the
+ following cases:
+ o If the referenced object changes (it's a global cache)
+ o If there are insertions or deletions of text (the positions are
+ absolute; fix: use markers or an extent instead?)
+ o If the syntax-table property is altered == added and different or
+ removed and the same (fix: probably computable from range overlap,
+ but is it worth it? would interact with ins/del); this includes
+ detachment of extents with the same value (but only the boundary
+ extents, as otherwise the range coalesces across the deletion point)
+ and attachment of extents with a different value
+ Note: the above looks a lot like what Ben has implemented in 21.5, but
+ he goes one better by making the cache buffer-local.
+
+ Note: cperl mode uses the text property API, not extents/overlays.
+*/
+
+#ifdef SYNTAX_CACHE_STATISTICS
+struct syntax_cache_statistics scs_statistics =
+ { 0, 0, 0, 0, -1, -1, 0.0, 0.0, scs_no_function};
+
+char* syntax_cache_statistics_function_names[scs_number_of_functions] = {
+ "find_context",
+ "find_defun_start",
+ "scan_words",
+ "Fforward_comment",
+ "scan_lists",
+ "Fbackward_prefix_characters",
+ "scan_sexps_forward"
+};
+#endif /* SYNTAX_CACHE_STATISTICS */
void
-update_syntax_cache (int pos, int count, int init)
+update_syntax_cache (int pos, int count)
{
Lisp_Object tmp_table;
- if (init)
+#ifdef SYNTAX_CACHE_STATISTICS
+ if (scs_statistics.total_updates == 0)
{
- syntax_cache.prev_change = -1;
- syntax_cache.next_change = -1;
+ int i;
+ for (i = 0; i < scs_number_of_functions; ++i)
+ scs_statistics.functions[i] = 0;
}
-
- if (pos > syntax_cache.prev_change &&
- pos < syntax_cache.next_change)
+ if (syntax_cache.prev_change > syntax_cache.next_change)
+ scs_statistics.inits++;
+ else if (pos < syntax_cache.prev_change)
+ scs_statistics.misses_lo++;
+ else if (pos >= syntax_cache.next_change)
+ scs_statistics.misses_hi++;
+#endif /* SYNTAX_CACHE_STATISTICS */
+
+ /* #### Since font-lock undoes any narrowing, maybe the BUF_ZV and
+ BUF_BEGV below should be BUF_Z and BUF_BEG respectively? */
+ if (BUFFERP (syntax_cache.object))
{
- /* do nothing */
+ int get_change_before = pos + 1;
+
+ tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+ syntax_cache.object, Qnil);
+#if NEXT_SINGLE_PROPERTY_CHANGE
+ /* #### shouldn't we be using BUF_BEGV here? */
+ syntax_cache.next_change =
+ XINT (Fnext_single_property_change
+ (make_int (pos > 0 ? pos : 1), Qsyntax_table,
+ syntax_cache.object, make_int (BUF_ZV (syntax_cache.buffer))));
+#else
+ syntax_cache.next_change =
+ XINT (Fnext_extent_change (make_int (pos > 0 ? pos : 1),
+ syntax_cache.object));
+#endif
+
+ /* #### shouldn't we be using BUF_BEGV here? */
+ if (get_change_before < 1)
+ get_change_before = 1;
+ else if (get_change_before > BUF_ZV (syntax_cache.buffer))
+ get_change_before = BUF_ZV (syntax_cache.buffer);
+
+#if PREVIOUS_SINGLE_PROPERTY_CHANGE
+ /* #### shouldn't we be using BUF_BEGV here? */
+ syntax_cache.prev_change =
+ XINT (Fprevious_single_property_change
+ (make_int (get_change_before), Qsyntax_table,
+ syntax_cache.object, make_int(1)));
+#else
+ syntax_cache.prev_change =
+ XINT (Fprevious_extent_change (make_int (get_change_before),
+ syntax_cache.object));
+#endif
}
- else
+ else if (STRINGP (syntax_cache.object))
{
- if (NILP (syntax_cache.object) || EQ (syntax_cache.object, Qt))
- {
- int get_change_before = pos + 1;
-
- tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
- make_buffer (syntax_cache.buffer), Qnil);
- syntax_cache.next_change =
- XINT (Fnext_extent_change (make_int (pos > 0 ? pos : 1),
- make_buffer (syntax_cache.buffer)));
-
- if (get_change_before < 1)
- get_change_before = 1;
- else if (get_change_before > BUF_ZV (syntax_cache.buffer))
- get_change_before = BUF_ZV (syntax_cache.buffer);
-
- syntax_cache.prev_change =
- XINT (Fprevious_extent_change (make_int (get_change_before),
- make_buffer (syntax_cache.buffer)));
- }
- else
- {
- int get_change_before = pos + 1;
+ int get_change_before = pos + 1;
+
+ tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+ syntax_cache.object, Qnil);
+#if NEXT_SINGLE_PROPERTY_CHANGE
+ /* #### shouldn't we be using BUF_BEGV here? */
+ syntax_cache.next_change =
+ XINT (Fnext_single_property_change
+ (make_int (pos >= 0 ? pos : 0), Qsyntax_table,
+ syntax_cache.object,
+ make_int(XSTRING_LENGTH(syntax_cache.object))));
+#else
+ syntax_cache.next_change =
+ XINT (Fnext_extent_change (make_int (pos >= 0 ? pos : 0),
+ syntax_cache.object));
+#endif
- tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
- syntax_cache.object, Qnil);
- syntax_cache.next_change =
- XINT (Fnext_extent_change (make_int (pos >= 0 ? pos : 0),
+ if (get_change_before < 0)
+ get_change_before = 0;
+ else if (get_change_before > XSTRING_LENGTH(syntax_cache.object))
+ get_change_before = XSTRING_LENGTH(syntax_cache.object);
+
+#if PREVIOUS_SINGLE_PROPERTY_CHANGE
+ syntax_cache.prev_change =
+ XINT (Fprevious_single_property_change
+ (make_int (get_change_before), Qsyntax_table,
+ syntax_cache.object, make_int(0)));
+#else
+ syntax_cache.prev_change =
+ XINT (Fprevious_extent_change (make_int (get_change_before),
syntax_cache.object));
+#endif
+ }
+ else
+ {
+ tmp_table = Qnil; /* silence compiler */
+ /* Always aborts. #### Is there another sensible thing to do here? */
+ assert (BUFFERP (syntax_cache.object) || STRINGP (syntax_cache.object));
+ }
- if (get_change_before < 0)
- get_change_before = 0;
- else if (get_change_before > XSTRING_LENGTH(syntax_cache.object))
- get_change_before = XSTRING_LENGTH(syntax_cache.object);
+ if (EQ (Fsyntax_table_p (tmp_table), Qt))
+ {
+ syntax_cache.use_code = 0;
+ syntax_cache.current_syntax_table =
+ XCHAR_TABLE (tmp_table)->mirror_table;
+ }
+ else if (CONSP (tmp_table) && INTP (XCAR (tmp_table)))
+ {
+ syntax_cache.use_code = 1;
+ syntax_cache.syntax_code = XINT (XCAR(tmp_table));
+ }
+ else
+ {
+ syntax_cache.use_code = 0;
+ syntax_cache.current_syntax_table =
+ syntax_cache.buffer->mirror_syntax_table;
+ }
- syntax_cache.prev_change =
- XINT (Fprevious_extent_change (make_int (pos >= 0 ? pos : 0),
- syntax_cache.object));
- }
+#ifdef SYNTAX_CACHE_STATISTICS
+ {
+ int length = syntax_cache.next_change - syntax_cache.prev_change;
+ int misses = scs_statistics.misses_lo +
+ scs_statistics.misses_hi + scs_statistics.inits;
+
+ if (scs_statistics.min_length == -1 || scs_statistics.min_length > length)
+ scs_statistics.min_length = length;
+ if (scs_statistics.max_length == -1 || scs_statistics.max_length < length)
+ scs_statistics.max_length = length;
+ scs_statistics.mean_length_on_miss =
+ ((misses - 1) * scs_statistics.mean_length_on_miss + length) / misses;
+ }
+
+ scs_statistics.mean_length
+ = scs_statistics.total_updates*scs_statistics.mean_length
+ + syntax_cache.next_change - syntax_cache.prev_change;
+ scs_statistics.total_updates++;
+ scs_statistics.mean_length /= scs_statistics.total_updates;
+
+ if (scs_statistics.this_function != scs_no_function)
+ {
+ scs_statistics.functions[scs_statistics.this_function]++;
+ scs_statistics.this_function = scs_no_function;
+ }
- if (EQ (Fsyntax_table_p (tmp_table), Qt))
- {
- syntax_cache.use_code = 0;
- syntax_cache.current_syntax_table =
- XCHAR_TABLE (tmp_table)->mirror_table;
- }
- else if (CONSP (tmp_table) && INTP (XCAR (tmp_table)))
- {
- syntax_cache.use_code = 1;
- syntax_cache.syntax_code = XINT (XCAR(tmp_table));
- }
- else
- {
- syntax_cache.use_code = 0;
- syntax_cache.current_syntax_table =
- syntax_cache.buffer->mirror_syntax_table;
- }
+ if (!(scs_statistics.total_updates % SYNTAX_CACHE_STATISTICS_REPORT_INTERVAL))
+ {
+ fprintf (stderr, "Syntax cache stats:\n ");
+ fprintf (stderr, "updates %d, inits %d, misses low %d, misses high %d,",
+ scs_statistics.total_updates, scs_statistics.inits,
+ scs_statistics.misses_lo, scs_statistics.misses_hi);
+ fprintf (stderr, "\n ");
+
+#define REPORT_FUNCTION(i) \
+ fprintf (stderr, " %s %d,", \
+ syntax_cache_statistics_function_names[i], \
+ scs_statistics.functions[i]);
+
+ REPORT_FUNCTION(scs_find_context);
+ REPORT_FUNCTION(scs_find_defun_start);
+ REPORT_FUNCTION(scs_scan_words);
+ REPORT_FUNCTION(scs_Fforward_comment);
+ fprintf (stderr, "\n ");
+ REPORT_FUNCTION(scs_scan_lists);
+ REPORT_FUNCTION(scs_Fbackward_prefix_characters);
+ REPORT_FUNCTION(scs_scan_sexps_forward);
+#undef REPORT_FUNCTION
+
+ fprintf (stderr, "\n min length %d, max length %d,",
+ scs_statistics.min_length, scs_statistics.max_length);
+ fprintf (stderr, "\n mean length %.1f, mean length on miss %.1f\n",
+ scs_statistics.mean_length,
+ scs_statistics.mean_length_on_miss);
}
+#endif /* SYNTAX_CACHE_STATISTICS */
}
+
\f
/* Convert a letter which signifies a syntax code
into the code it signifies.
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 */
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? */
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);
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);
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;
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);
from = BUF_PT (buf);
+ SCS_STATISTICS_SET_FUNCTION (scs_Fforward_comment);
SETUP_SYNTAX_CACHE (from, n);
while (n > 0)
{
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))
{
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)
{
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;
}
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);
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))
}
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;
}
}
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;
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--;
}
}
if (depth > 0) min_depth = 0;
+ SCS_STATISTICS_SET_FUNCTION (scs_scan_lists);
SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, from, count);
while (count > 0)
{
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 */
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);
case Scomment_fence:
comstyle = ST_COMMENT_STYLE;
+ /* falls through! */
case Scomment:
if (!parse_sexp_ignore_comments)
break;
}
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;
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);
}
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)
{
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))
passing it. */
while (from > stop)
{
+ /* enum syntaxcode syncode; */
UPDATE_SYNTAX_CACHE_BACKWARD (from);
quoted = char_quoted (buf, from - 1);
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;
}
}
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--;
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,
int boundary_stop = commentstop == -1;
Lisp_Object tem;
+ SCS_STATISTICS_SET_FUNCTION (scs_scan_sexps_forward);
SETUP_SYNTAX_CACHE (from, 1);
if (NILP (oldstate))
{
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 );
curlevel->last = -1;
tem = Fcdr (tem);
}
+ /* end radical change section */
}
state.quoted = 0;
mindepth = depth;
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
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);
}
}
state.instring = XCHAR (stermobj);
else
state.instring = ch;
- }
+ }
if (boundary_stop) goto done;
startinstring:
while (1)
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.
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
/* #### 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);
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;
{
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. */
};
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))
)
/* 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 \
? 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 { \
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)) \
{ \
= 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) \
#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)) \
? 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_ */
+2002-11-02 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.10 "Military Intelligence" is released.
+
+2002-08-22 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * automated/test-harness.el (test-harness-from-buffer):
+ Print-Skip: new local function.
+
+ * automated/syntax-tests.el (forward-comment at buffer boundaries):
+ * automated/test-harness.el (Check-Message):
+ Warn, not barf, if required packages are unavailable.
+
+2002-09-12 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * automated/regexp-tests.el: Add word-boundary regexp tests.
+
+2002-09-09 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * automated/regexp-tests.el: Add test for stale subexpr match-data.
+ Thanks to Martin Stjernholm for the report.
+
+ * automated/syntax-tests.el: Conditionalize syntax-table property
+ tests on feature. Enable feature if present.
+
2002-08-23 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.9 "Informed Management" is released.
(looking-at "Unmatchable text")
(replace-match "")
(Assert (looking-at "^buffer.$")))
+
+;; Test that trivial regexps reset unused registers
+;; Thanks to Martin Sternholm for the report.
+;; xemacs-beta <5blm6h2ki5.fsf@lister.roxen.com>
+(with-temp-buffer
+ (insert "ab")
+ (goto-char (point-min))
+ (re-search-forward "\\(a\\)")
+ ;; test the whole-match data, too -- one try scotched that, too!
+ (Assert (string= (match-string 0) "a"))
+ (Assert (string= (match-string 1) "a"))
+ (re-search-forward "b")
+ (Assert (string= (match-string 0) "b"))
+ (Assert (not (match-string 1))))
+
+;; Test word boundaries
+(Assert (= (string-match " \\<a" " a") 0))
+(Assert (= (string-match "a\\> " "a ") 0))
+(Assert (= (string-match " \\ba" " a") 0))
+(Assert (= (string-match "a\\b " "a ") 0))
+(Assert (= (string-match "\\ba" " a") 1))
+(Assert (= (string-match "a\\b" "a ") 0))
+;; should work at target boundaries
+(Assert (= (string-match "\\<a" "a") 0))
+(Assert (= (string-match "a\\>" "a") 0))
+(Assert (= (string-match "\\ba" "a") 0))
+(Assert (= (string-match "a\\b" "a") 0))
+;; but not if the "word" would be on the null side of the boundary!
+(Assert (not (string-match "\\<" "")))
+(Assert (not (string-match "\\>" "")))
+(Assert (not (string-match " \\<" " ")))
+(Assert (not (string-match "\\> " " ")))
+(Assert (not (string-match "a\\<" "a")))
+(Assert (not (string-match "\\>a" "a")))
+;; Expect these to fail :-(
+(Assert (not (string-match "\\b" "")))
+(Assert (not (string-match " \\b" " ")))
+(Assert (not (string-match "\\b " " ")))
+
;; <apply-pos> can be in the form (start . end), or can be a
;; character position.
(defun test-syntax-table (string apply-pos apply-syntax stop)
- (goto-char (point-max))
- (unless (consp apply-pos)
- (setq apply-pos `(,apply-pos . ,(+ 1 apply-pos))))
- (let ((point (point)))
- (insert string)
- (put-text-property (+ point (car apply-pos)) (+ point (cdr apply-pos))
- 'syntax-table apply-syntax)
- (goto-char point)
- (forward-word 1)
- (Assert (eq (point) (+ point stop)))))
+ ;; We don't necessarily have syntax-table properties ...
+ (when (boundp 'lookup-syntax-properties) ; backwards compatible kludge
+ ;; ... and they may not be enabled by default if we do.
+ (setq lookup-syntax-properties t)
+ (goto-char (point-max))
+ (unless (consp apply-pos)
+ (setq apply-pos `(,apply-pos . ,(+ 1 apply-pos))))
+ (let ((point (point)))
+ (insert string)
+ (put-text-property (+ point (car apply-pos)) (+ point (cdr apply-pos))
+ 'syntax-table apply-syntax)
+ (goto-char point)
+ (forward-word 1)
+ (Assert (eq (point) (+ point stop))))))
;; test syntax-table extents
(with-temp-buffer
(test-syntax-table "W." 1 `(,(syntax-string-to-code "w")) 2))
;; Test forward-comment at buffer boundaries
+;; #### The second Assert fails (once interpreted, once compiled) on 21.4.9
+;; with sjt's version of Andy's syntax-text-property-killer patch.
(with-temp-buffer
- (c-mode)
- (insert "// comment\n")
- (forward-comment -2)
- (Assert (eq (point) (point-min)))
-
- (let ((point (point)))
- (insert "/* comment */")
- (goto-char point)
- (forward-comment 2)
- (Assert (eq (point) (point-max)))
-
- ;; this last used to crash
- (parse-partial-sexp point (point-max))))
+ (if (not (fboundp 'c-mode))
+ ;; #### This whole thing should go inside a macro Skip-Test
+ (let* ((reason "c-mode unavailable")
+ (count (gethash reason skipped-test-reasons)))
+ ;;(message "%S: %S" reason count)
+ (puthash reason (if (null count) 1 (1+ count))
+ skipped-test-reasons)
+ (Print-Skip "comment and parse-partial-sexp tests" reason))
+ (c-mode)
+
+ (insert "// comment\n")
+ (forward-comment -2)
+ (Assert (eq (point) (point-min)))
+
+ (let ((point (point)))
+ (insert "/* comment */")
+ (goto-char point)
+ (forward-comment 2)
+ (Assert (eq (point) (point-max)))
+
+ ;; this last used to crash
+ (parse-partial-sexp point (point-max)))))
(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))
,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))
(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."))
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